Skip to main content
Glama

Server Details

Collect verified customer information with one request

Ownership verified
Status
Healthy
Uptime
85.0% over 21 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
formstep/formstep-mcp
GitHub Stars
0
Server Listing
formbase MCP server

TDQS

A4/5.0

Scored across 85 tools

Disambiguation4/5

The large number of tools is well-segmented using distinct prefixes (editor, form, request, translation). While most tools are clearly defined, the vast array requires careful contextual selection by the agent.

Naming Consistency5/5

Naming conventions are highly consistent across the entire server, utilizing functional prefixes like 'editor_', 'form_', 'request_', and 'translationDraft_'. This strong pattern allows for quick cognitive mapping of tool purpose.

Tool Count5/5

Given the complexity and feature richness of a modern form platform (covering logic, theming, webhooks, and translation), 85 tools are appropriate and necessary to achieve deep functional coverage.

Completeness5/5

The server provides near-complete coverage of the form domain, including advanced features like dynamic logic, complex repeating groups, theme customization, localization workflows, and integration with payment/scheduling systems.

Available Tools

85 tools
document_createCreate documentAInspect

Reserve an upload for one document a request hands to its recipient through the form's Documents block. Returns { id, uploadUrl, expiresAt, name, contentType, size }. Bytes never pass through this tool: PUT the raw file to uploadUrl (one hour) with the declared Content-Type, then pass { "documentId": id } in request_create's documents, which verifies it. One upload serves any number of requests. See load_skill("requests").

NameRequiredDescriptionDefault
nameYesDisplay name the recipient sees.
sizeYesExact byte length. Max 26214400.
formIdYesForm whose Documents block will show it; scopes the upload to that workspace.
sha256NoHex digest, verified against the upload when given.
contentTypeYesMIME type of the bytes you will upload.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare it as a non-read-only, non-destructive, closed-world write. The description adds far more: bytes never pass through this tool, the upload URL expires in one hour, the Content-Type must match the declared value, and the upload is verified downstream by request_create. These are exactly the behavioral traits an agent cannot infer from the annotations.

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

Conciseness5/5

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

Front-loaded with the action and the return contract, followed by the byte-transfer workflow in one dense sentence. No filler; the closing load_skill pointer is the only non-essential clause but is useful routing.

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

Completeness5/5

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

With no output schema, the description still enumerates the return fields ({ id, uploadUrl, expiresAt, name, contentType, size }) and the full follow-up workflow, including the downstream verification step. Nothing needed to call this tool correctly is missing.

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 baseline is 3. The description goes further by linking contentType to the subsequent PUT ('with the declared Content-Type') and implying formId scopes the upload. It doesn't clarify size/sha256 semantics beyond the schema, so it's above baseline but not exhaustive.

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: 'Reserve an upload for one document a request hands to its recipient through the form's Documents block.' This clearly separates it from siblings like editor_insertDocumentsBlock (which edits the form) and request_create (which consumes the document), so an agent can route without opening schemas.

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?

Gives the full ordering constraint explicitly: PUT the raw bytes to `uploadUrl`, then pass { documentId: id } in request_create's `documents`. It also names the condition that makes reuse safe ('one upload serves any number of requests') and points to load_skill("requests") for the higher-level flow.

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

editor_deleteElementDelete elementA
Destructive
Inspect

Delete an element from the form. Copy nodeId from a current editor_getDocument response — never guess. Cannot delete the last user-facing element; the submit button is auto-managed and not counted.

NameRequiredDescriptionDefault
formIdYesForm ID
nodeIdYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered; the description adds genuinely new behavioral context — the last user-facing element cannot be deleted and the auto-managed submit button is excluded from the count. It omits error behavior for invalid nodeIds and whether deletion is reversible.

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

Conciseness5/5

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

Two tight sentences, front-loading the action first and the sourcing constraint and deletion limit second. Nothing is redundant or padded.

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 two-parameter destructive tool with no output schema, the description covers the key agent decision points: where to get nodeId and the one deletion guardrail. It could say more about failure modes or response, but nothing essential for correct invocation is missing.

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 only 50% (formId has a description, nodeId has none), so the description must compensate — and it does, telling the agent exactly where nodeId comes from and warning against fabricating it. formId itself gets no additional detail, but that is a minor gap.

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 ('Delete an element from the form') and clearly separates itself from the surrounding insert/update siblings by describing removal of an existing node. An agent can select it without opening the schema.

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?

Gives a concrete precondition and workflow: obtain nodeId from a fresh editor_getDocument response rather than guessing. It does not explicitly name editor_updateElement as the alternative for modifying rather than removing, so the when-not side is left implicit.

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

editor_formatTextFormat textAInspect

Apply or remove text formatting. Formats: bold, italic, underline, strikeThrough, code, highlight (colored background), link (hyperlink — wraps the matched substring). Use color param for highlight/underline color (yellow, blue, green, red).

NameRequiredDescriptionDefault
urlNoRequired when format="link".
textYesExact text to find and format.
colorNoDefault: yellow. For highlight or underline.
actionNoapply
formIdYesForm ID
formatYes
nodeIdYes
occurrenceNo1-based, when text appears multiple times.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false. The description adds useful scope (link wraps matched substring; color applies to highlight/underline) but does not explain auth needs, match-failure behavior, or what removal changes.

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

Conciseness5/5

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

Front-loads the operation, then compactly lists formats and color constraints. Every clause earns its place; there is no filler or repetition.

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

Completeness3/5

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

For an 8-parameter mutation tool with no output schema, the description covers formats and some parameter meaning. It remains incomplete on node targeting, occurrence semantics, and link URL requirements, though annotations cover the safety profile.

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

Parameters3/5

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

Schema coverage is 63%, and the description clarifies the action apply/remove and color scope beyond the enum. However, it omits nodeId, occurrence behavior, and the link URL requirement, with some of those details already present only in the schema.

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 pair (apply/remove) and resource (text formatting), then enumerates the exact supported formats. This lets an agent distinguish it from editor_insert* and editor_updateElement siblings without opening schemas.

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

Usage Guidelines3/5

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

The description implies usage through 'apply or remove' and the format list, but gives no explicit when-to-use, prerequisites, or alternative-tool routing. An agent can infer the context, but guidance is not spelled out.

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

editor_getDocumentGet documentA
Read-only
Inspect

Read the form document as a TOON-serialized tree. Returns content + an idRoles map labelling every node id with its logic role (condition source, show/hide target, option, etc.) — consult before authoring logic. Use before any editor_insert*/update/replace/delete to discover nodeIds. Read-only. See load_skill("toon-format") for the schema.

NameRequiredDescriptionDefault
formIdYes
versionNodraft

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so 'Read-only' adds little, but the description goes beyond them by describing the return structure (content plus an idRoles map with role labels) and pointing to load_skill("toon-format") for the payload schema, which is valuable since no output schema exists.

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?

Three tightly packed sentences that front-load the core purpose and then layer usage and payload guidance. Only the redundant 'Read-only' clause fails to earn its place against the annotations.

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 no-output-schema read tool this covers purpose, ordering constraints, and the shape of the result with a pointer to skill documentation. It falls short only on parameter semantics, which both schema and description leave bare.

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

Parameters2/5

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

Schema description coverage is 0% and the description never mentions either parameter: no explanation of what formId identifies, nor that version selects draft vs published (an enum with a default). The heavy lifting the schema cannot do is left undone.

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 ('Read the form document as a TOON-serialized tree') and describes the returned payload (content + an idRoles map labelling node ids by logic role). This clearly distinguishes it from siblings like form_get or the many editor_insert* authoring tools.

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?

Gives explicit timing and ordering: 'consult before authoring logic' and 'Use before any editor_insert*/update/replace/delete to discover nodeIds.' The agent knows both why and when to call this ahead of the mutation siblings.

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

editor_insertAiValidationInsert ai validationAInspect

Insert an AI Validation: one sentence the answers it names must fit, checked with AI while the respondent fills in the form. A note shows under it when they do not fit; the respondent can still submit. It reads questions above it and hidden fields, so insert it after the last question it reads. Result: data.aiValidations..

NameRequiredDescriptionDefault
keyNoCallback key; defaults to the next free ai_validation, ai_validation_2, …
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
formIdYesForm ID to insert into
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
sentenceYesThe rule as parts: text, and a chip for every answer it reads (plain text is not checked). E.g. [{"fieldId":"fi1","fieldName":"Invoice"}," is dated in 2026."]

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important runtime behavior: validation happens with AI while the respondent fills in the form, a note appears when answers do not fit, submission is still allowed, and the result is stored at data.aiValidations.<key>. It also explains the ordering dependency created by reading preceding questions and hidden fields.

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

Conciseness5/5

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

The description is compact and front-loaded: it states what is inserted, how it behaves, the ordering requirement, and the result path in four efficient sentences. Every sentence adds useful information and there is no wasted text.

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?

With no output schema, the description helpfully states the runtime result path, and it explains the key ordering dependency. It does not cover failure modes or the full return value of the insert operation, but annotations and the rich input schema cover most other needs.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already carries detailed parameter meaning. The description adds conceptual context about the sentence and key result path, but it does not materially explain individual parameters such as formId, parentId, position, or after beyond what the schema provides.

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?

The description states a specific verb and resource: inserting an AI Validation sentence that checks named answers with AI while the respondent fills in the form. This is clearly distinct from sibling insert tools such as logic, calculated fields, or question inserters because the unique validation behavior is explained.

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 gives a concrete placement rule: insert it after the last question it reads because it reads questions above it and hidden fields. That is clear usage context, but it does not explicitly compare this tool against alternatives such as editor_insertLogic or explain when not to use it.

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

editor_insertCalculatedFieldInsert calculated fieldAInspect

Insert a calculated field for scoring, counters, and computed runtime values. Hidden from respondents. Use with calculateValue action in logic rules to accumulate or compute values. Example: Create a "Total Score" field and add points via logic rules. For URL-seeded metadata, use editor_insertHiddenField instead.

NameRequiredDescriptionDefault
nameYesName for the calculated field (e.g., "Total Score", "cart_total")
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
formIdYesForm ID to insert into
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
fieldTypeNoType of the calculated valuenumber
initialValueNoInitial value (default based on fieldType)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare it is a non-read-only, non-destructive, closed-world mutation, so the bar is lowered. The description adds genuinely new behavioral context: the field is hidden from respondents and is designed to be driven by calculateValue logic rules, which the annotations do not convey.

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

Conciseness5/5

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

Four tightly packed sentences: purpose first, then visibility, then the driving action, then an example, then the sibling alternative. Every sentence earns its place with no filler.

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 seven-parameter mutation tool with no output schema, the description covers purpose, intended workflow, and the key sibling boundary. It omits what the call returns (e.g. the created node/field ID), which an agent inserting-then-chaining would benefit from, but otherwise nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all seven parameters thoroughly (including chaining via $prev and position/after incompatibility). The description adds a naming example and the fieldType-in-practice hint, but does not meaningfully extend parameter semantics beyond the schema.

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?

Specific verb+resource ('Insert a calculated field') plus the concrete use cases (scoring, counters, computed runtime values) make the tool's role unmistakable. It explicitly distinguishes itself from the sibling editor_insertHiddenField, so an agent can route correctly without opening either schema.

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?

States when to use it (with the calculateValue action in logic rules), gives a worked example ('Total Score' field accumulating points), and names the alternative for URL-seeded metadata. This is explicit when/when-not/alternative guidance.

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

editor_insertCheckboxQuestionInsert checkbox questionAInspect

Insert a checkbox question for multi-choice selection. Requires 1+ options. Use when user can pick multiple.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
optionsYesCheckbox options (minimum 1, non-empty, unique)
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.
maxSelectionsNoMost options to pick
minSelectionsNoFewest options to pick
defaultOptionsNoLabels of the options checked by default
randomizeOptionsNoShuffle option order per respondent

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare this is a non-read-only, non-destructive write, so the safety profile is covered. The description's main behavioral claim, "Requires 1+ options," merely restates the schema's minItems constraint and adds no new mutation context. No mention of ordering effects or side effects on existing nodes.

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

Conciseness5/5

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

Three short, front-loaded sentences with zero filler. The core purpose and the key usage condition lead, and no sentence is redundant.

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 mutation tool with full schema coverage and clear annotations, the definition supplies enough to act on. The absence of output-schema detail is acceptable, though the description could note insertion/ordering caveats that the schema only partially conveys.

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

Parameters3/5

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

Schema description coverage is 100%, so all 12 parameters are already documented in the schema (including the subtle 'after' vs 'position' semantics and the required-default). The description adds no parameter detail beyond the "1+ options" restatement, which is the baseline 3 case.

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 ("Insert a checkbox question") and frames it as "multi-choice selection," which separates it from single-choice siblings like editor_insertRadioQuestion. It does not explicitly name the contrasting sibling, so the differentiation must be inferred from "multi-choice."

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 when user can pick multiple" gives a clear condition for selecting this tool over its alternatives. It stops short of naming the sibling to use for single-choice cases, so the exclusion is only implied.

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

editor_insertContactQuestionInsert contact questionBInspect

Insert a contact question for email, phone, or URL. Choose contactType based on what information you need.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
patternNoRegex the email or url must match
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.
contactTypeYesType of contact field
placeholderNoPlaceholder text
defaultValueNoLiteral default seeded on open; respondent can edit or clear it. Not with defaultValueFieldRef.
defaultCountryNoPhone only: preselected country, ISO 3166-1 alpha-2
requireVerificationNoEmail only: respondent confirms the address by emailed code (Business plan)
defaultValueFieldRefNoPre-fill the input with a hidden or calculated field value at fill time. The respondent can still edit it.

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already declare a non-read-only, non-destructive, non-open-world write operation, so the safety profile is covered. The description adds no behavioral context beyond that – it says nothing about what node is created, what is returned, permissions, or the interaction of after/position (which the schema handles). For a mutation tool it contributes almost no disclosure.

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?

Two short sentences, correctly front-loaded with the action and resource. The second sentence is low-value filler rather than an operational constraint, but overall there is no bloat.

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

Completeness3/5

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

The schema is very rich (14 params, enums, nested object, insertion-position constraints), so the description needn't restate parameters, and no output schema exists to explain. However, for a complex insertion tool it omits any note on the created node's identity or return value, leaving it minimally adequate.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema documents all 14 parameters and the nested defaultValueFieldRef object, including mutual-exclusivity notes (after vs position, defaultValue vs defaultValueFieldRef). The description only lightly echoes contactType semantics, so baseline 3 is appropriate.

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+resource ('Insert a contact question') and enumerates the domain (email, phone, URL), so an agent can distinguish it from other editor_insert*Question siblings without opening the schema. It stops short of explicitly naming the alternatives it is not (e.g., insertTextQuestion) for a truly differentiated 5.

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

Usage Guidelines3/5

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

'Choose contactType based on what information you need' is guidance about parameter choice, not about when to prefer this tool over the other insert-question tools. There is no when-to-use/when-not statement or named alternative, so usage is only implied.

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

editor_insertDateQuestionInsert date questionCInspect

Insert a date picker question for date selection.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
maxDateNoLatest date, YYYY-MM-DD
minDateNoEarliest date, YYYY-MM-DD
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already state readOnlyHint=false, destructiveHint=false, openWorldHint=false, giving the safety profile. The description adds no further behavioral context (such as ordering behavior, side effects, or required permissions) beyond the one-sentence purpose, so it contributes little beyond the annotations.

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?

The description is a single grammatical sentence with no filler, but for a 9-parameter insertion tool it is arguably too terse and does not front-load any operational guidance. It is concise but under-specified for the tool's complexity.

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

Completeness2/5

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

Given 9 parameters, many sibling tools that insert other question types, and no output schema, the description is not complete enough. It fails to help the agent distinguish this tool from other insert-question tools or understand when to use it, though annotations and schema cover safety and parameters.

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

Parameters3/5

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

Schema description coverage is 100%, so all 9 parameters are documented in the schema itself. The description adds no parameter-level information, leaving the schema to carry the full semantic load; baseline 3 is appropriate.

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 names a specific verb ('Insert') and resource ('date picker question'), making the tool's function clear. It does not differentiate from sibling insert-question tools (e.g., insertTimeQuestion, insertScheduleAppointmentQuestion), so it stops short of a 5.

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

Usage Guidelines2/5

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

No when-to-use guidance, no prerequisites, and no alternatives are mentioned. The agent receives no help choosing this tool over other question-insertion tools.

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

editor_insertDecisionQuestionInsert decision questionAInspect

Insert the decision question (approve / decline / request changes) that sets a request's outcome. A plain radio never sets an outcome.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title in the form language, e.g. "Do you approve?"
formIdYesForm ID to insert into
labelsYesOption labels in the form language, e.g. { approve: "Approve", decline: "Decline", changes: "Request changes" }
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoDefault: true

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already disclose the safe-mutation profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds a genuine behavioral fact the annotations cannot: this element is what actually sets a request's outcome, which matters for choosing it. It does not cover revert/positioning side effects, which the schema handles.

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

Conciseness5/5

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

Two tightly written sentences, front-loaded with the action and the distinguishing semantic, with zero filler. The radio contrast is placed last as a routing hint.

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 mutation tool with no output schema, the description conveys the essential semantic (outcome-setting decision question) and the schema carries the rich positional/nesting detail at 100% coverage. It lacks guidance on placement or chaining, but the schema's after/position descriptions cover that.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 8 parameters, including the labels object and the after/position chaining rules. The description adds no parameter detail beyond restating the label values, so the baseline of 3 applies.

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 ('Insert the decision question ... that sets a request's outcome') and nails the disambiguating trait of the three option labels (approve/decline/changes). It implicitly separates itself from editor_insertRadioQuestion by noting a plain radio never sets an outcome.

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?

The clause 'A plain radio never sets an outcome' tells the agent when this tool is the right choice over the radio-question sibling, which is the key routing decision among the many insert_* tools. It stops short of an explicit 'use X instead' or stating prerequisites, so it is clear context without full exclusions.

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

editor_insertDocumentsBlockInsert documents blockAInspect

Insert a Documents block: a download list of files (PDF, images) the owner hands to the respondent. Collects no answer; files are added in the editor, not here.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesBlock title above the list
formIdYesForm ID to insert into
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the description need not restate them. It adds genuinely useful behavior beyond the annotations: the block 'collects no answer' and files are added elsewhere, preventing a misinterpretation of the write operation. It stops short of covering insert semantics like chaining/ordering, hence 4.

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

Conciseness5/5

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

Two tight sentences, front-loaded with the action and resource, with zero filler. The 'not here' caveat earns its place by preventing a wrong assumption about file loading.

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?

With no output schema, annotations carrying the safety profile, and a fully documented parameter schema, the description covers the non-obvious essentials: what the block is and what it does not do. A brief note on insertion ordering would round it out, but nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already explains the tricky interactions (after vs. position, $prev chaining, parentId scoping). The description adds no parameter-level detail and none is needed. Baseline 3 is appropriate.

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 the specific verb+resource ('Insert a Documents block') and immediately defines the resource: 'a download list of files (PDF, images) the owner hands to the respondent.' The clause 'Collects no answer' distinguishes it from sibling tools like editor_insertFileQuestion, so an agent can tell them apart without opening either schema.

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 gives a clear scope boundary — 'files are added in the editor, not here' — telling the agent that this tool only places the block and does not populate it. It also conveys the use-case (a non-answering download list) versus answering question blocks. However, it does not explicitly name the alternative tool or state exclusion conditions, so a 4 rather than 5.

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

editor_insertEmbeddedInsert embeddedAInspect

Insert embedded content such as a YouTube video, Google Maps location, or iframe embed. Use a real source URL the user provided — never invent or guess one; if you do not have it, ask the user for the link instead of inserting.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
formIdYesForm ID to insert into
sourceYesYouTube URL/video ID, Google Maps location query, or a single iframe embed snippet.
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
providerYesEmbedded provider. Use youtube for videos, google-maps for maps, or iframe for third-party embeds.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds a meaningful non-schema behavioral constraint (never guess a source; ask the user), which prevents a whole class of bad calls, though it says nothing about ordering conflicts or error behavior on a bad URL.

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

Conciseness5/5

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

Two sentences, zero padding: purpose first, then the critical constraint. Nothing repeats the schema or annotations.

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 6-parameter mutation tool with no output schema, the description covers purpose and the key input-integrity rule, and the schema carries full parameter detail. It stops short of noting anything about the result of insertion or failure handling, but nothing essential for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, including the after/parentId/position interplay and provider semantics, so the baseline is 3. The description's provider examples ('youtube for videos, google-maps for maps, iframe for third-party embeds') largely restate the enum descriptions already in the schema, adding little beyond it.

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?

Specific verb ('Insert') plus resource ('embedded content') and enumerated subtypes (YouTube video, Google Maps location, iframe embed). An agent can distinguish this from sibling inserters like editor_insertImage or editor_insertDocumentsBlock without opening the schema.

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?

Gives a strong operative rule — use a real user-provided source URL and ask the user rather than fabricating one. That is clear when-to-use guidance for the main failure mode, though it names no alternative sibling tools (e.g. editor_insertImage) for adjacent cases.

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

editor_insertFileQuestionInsert file questionCInspect

Insert a file upload question. Configure accepted file types and size limits.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
acceptNoAccepted file types, comma-separated. Extensions ".pdf,.jpg" or MIME types "image/*".
formIdYesForm ID to insert into
maxSizeNoMaximum file size in bytes (must be > 0)
isHiddenNoStart hidden (the target of a `show` rule).
maxFilesNoMaximum number of files
minFilesNoFewest files to upload
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the mutation/safety profile is covered structurally, but the description adds no behavioral context at all. It omits the risks its own schema hints at, such as the default of required=true and that omitting 'after' appends to the end (called out as 'usually wrong').

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?

Two short sentences, front-loaded with the verb and resource, with no filler. It is efficient, though it restates the tool title almost verbatim rather than spending the words on something the agent lacks.

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

Completeness3/5

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

For an 11-parameter mutation tool with no output schema, the description is thin: it never addresses placement semantics (after vs position vs parentId) or defaults, which is where an agent is most likely to err. Complete enough to invoke via the schema, but it does not cover the failure modes the schema itself flags.

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

Parameters3/5

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

Schema description coverage is 100%, so every one of the 11 parameters is already documented, including the accept pattern and maxSize units. The description's mention of accepted file types and size limits merely paraphrases two schema fields and adds no syntax, default, or interaction detail beyond them.

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?

Names a specific verb and resource (insert a file upload question), which is enough to separate it from the many other editor_insert* question-type siblings. However, it does not explicitly contrast with adjacent question types such as picture choice or signature, so the differentiation rests on the noun alone.

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

Usage Guidelines2/5

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

No when-to-use, prerequisites, or alternatives are given. Nothing tells the agent whether a form must already exist, whether it should be called before or after other inserts, or which sibling to reach for when a non-file question is intended.

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

editor_insertHeaderInsert headerAInspect

Insert a heading element. Use level 1-4 for different sizes (1 = largest). The header level is fixed at insert time — editor_updateElement cannot change it later (supported props: isHidden, required, titleIsHidden).

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
levelNoHeader level (1-4)
formIdYesForm ID to insert into
contentYesHeader text. Raw characters, not HTML entities. Markup: **bold**, *italic*, ~~struck~~, `code`, <u>underlined</u>, [text](https://url), <span color|background="red" font="font-georgia" size="1.25">…</span>.
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only declare it is a non-read-only, non-destructive write. The description adds real behavioral context beyond that: the level cannot be changed after insert and editor_updateElement supports only isHidden, required, titleIsHidden. This tells the agent about immutability and the mutation surface, which the annotations do not.

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?

Three sentences, no filler, and the core action and level semantics are front-loaded. The trailing parenthetical listing supported props is dense but earns its place by scoping the later update path.

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 7-param write tool with full schema coverage and annotations, the description covers the ambiguity-prone parts (level meaning, immutability) even though it does not address ordering behavior. Nothing critical for a correct call is missing.

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 baseline is 3, but the description adds meaning the schema lacks: that level 1 = largest, and that the level argument is locked at insert time. That is genuine semantic value, though positioning params (after/parentId/position) are left entirely to the schema.

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?

States a specific verb+resource: 'Insert a heading element.' That is unambiguous and distinct from sibling insert tools like editor_insertParagraph. It stops short of explicitly naming which sibling to prefer, but the resource is precise enough for selection.

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

Usage Guidelines3/5

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

Explains how to pick a header size (level 1-4, 1 = largest) and warns the level is frozen, which subtly signals 'get it right the first time.' However, it never states when to choose this over editor_insertParagraph or other insert tools, so usage is implied rather than spelled out.

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

editor_insertHiddenFieldInsert hidden fieldBInspect

Insert a hidden metadata field that can be seeded from URL params and submitted with the form. Use for recipient IDs, campaign tags, attribution data, or personalized text values that should be referenceable in content, input defaults (defaultValueFieldRef), logic conditions, and calculateValue field refs.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
formIdYesForm ID to insert into
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
fieldTypeNoType of metadata value stored in the hidden fieldtext
paramNameYesURL query parameter name to read from. Must be a valid query key (alphanumeric + underscore, starting with a letter or underscore). Example: "campaign", "utm_source".

TDQS

B3.4/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, confirming a non-destructive write confined to the form. The description adds useful behavioral context — the field is seeded from URL params and submitted with the form, and is referenceable in defaultValueFieldRef, logic conditions, and calculateValue refs. It doesn't cover ordering side effects (after vs position), idempotency, or what happens to existing fields. With annotations present the bar is lower, so a 3 is fair.

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?

Two sentences, front-loaded with the core action and then the intended use cases. It is appropriately sized for the tool and has no filler. The second sentence is dense but each element (URL params, defaultValueFieldRef, logic conditions, calculateValue) is meaningful.

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

Completeness3/5

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

For a write tool with no output schema, the description covers purpose and the referenceable-value behavior, but omits the insertion-position nuance (after vs position cannot be combined) which is critical to correct invocation. The sibling differentiation is also absent, leaving an agent to choose between editor_insertVariable, editor_insertCalculatedField, and this tool without explicit guidance.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters already carry descriptions, including the positional 'after'/'position' semantics and the paramName pattern. The description adds no additional parameter detail beyond this. Baseline 3 applies when the schema does the heavy lifting.

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?

States a specific verb ('insert') and resource ('hidden metadata field'), and goes beyond by naming use cases (URL param seeding, form submission). It doesn't explicitly differentiate from siblings like editor_insertVariable or editor_insertCalculatedField, which have overlapping roles for referenceable values, leaving some ambiguity.

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

Usage Guidelines3/5

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

The description gives a purpose and example use cases ('recipient IDs, campaign tags, attribution data') but does not state when to prefer this over editor_insertVariable or editor_insertCalculatedField, which are the closest functional siblings. An agent still has to infer the choice.

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

editor_insertImageInsert imageAInspect

Insert an image element. Use an image the user uploaded or a URL the user explicitly provided — never invent or guess one (no stock, placeholder, or Unsplash links). If you have no real image, ask the user to upload one or paste a URL instead of inserting.

NameRequiredDescriptionDefault
altNoAlt text for accessibility
srcYesImage URL (http(s) or data:image)
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
alignNoImage alignment
widthNoImage width in pixels
formIdYesForm ID to insert into
captionNoImage caption
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
storageIdNoStorage ID for uploaded images

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare this is a non-destructive, non-open-world write, so safety is partly covered. The description adds a substantive rule beyond the annotations — never fabricate stock/placeholder/Unsplash URLs and instead prompt the user — which genuinely shapes agent behavior. It does not mention permissions or insertion side effects, keeping it below 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.

Conciseness4/5

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

Three sentences, front-loaded with the action followed by the sourcing constraint. The second and third sentences overlap somewhat (avoid inventing URLs / ask the user for a real image), so it is slightly more verbose than strictly necessary.

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 an 11-parameter insert tool with no output schema, the description covers purpose and the critical behavioral guard, while the schema covers all parameters. Nothing essential is missing, though positioning/return expectations are left entirely to the schema.

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

Parameters3/5

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

Schema description coverage is 100% across all 11 parameters, and the schema itself carries strong semantics (e.g., 'after' noting that omission is 'usually wrong', 'position' enum semantics). The description adds no parameter-level detail beyond that, so the baseline 3 applies.

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 opens with a specific verb+resource ('Insert an image element'), so an agent immediately knows the operation. It does not explicitly contrast itself with nearby siblings like editor_insertPictureChoiceQuestion or editor_insertEmbedded, but the resource is distinct enough that confusion is unlikely.

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 gives clear preconditions for use ('a user uploaded' image or 'a URL the user explicitly provided') and an explicit negative case (no real image → ask the user to upload or paste a URL). It stops short of naming alternative tools, but the when-to-use guidance is concrete.

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

editor_insertLinearScaleQuestionInsert linear scale questionBInspect

Insert a linear scale question (1-5, 1-10, etc.). Use for sentiment, agreement scales.

NameRequiredDescriptionDefault
maxNoMaximum scale value (default 5)
minNoMinimum scale value (default 1)
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
isHiddenNoStart hidden (the target of a `show` rule).
maxLabelNoLabel for maximum value
minLabelNoLabel for minimum value
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.

TDQS

B3.3/5.0
Behavior2/5

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

Annotations already declare this is a non-destructive, non-open-world write, so the safety profile is covered. The description adds nothing behavioral beyond that — no note about insertion ordering, required placement, or what happens on insert — so it contributes almost no context the annotations don't supply.

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

Conciseness5/5

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

Two short sentences with zero filler, and the core purpose is front-loaded before the use-case hint. Nothing wastes the agent's context budget.

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

Completeness3/5

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

For an 11-parameter insertion tool with no output schema, the annotations and rich schema cover the mechanics, and the description is technically sufficient to call it. It is nevertheless thin on the one thing that matters here: disambiguating this tool from the many other insert*Question siblings.

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

Parameters3/5

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

Schema description coverage is 100% and all 11 parameters (min, max, after, position, parentId, isHidden, labels) are documented inline in the schema itself. The description adds no parameter-level meaning, so the baseline 3 applies.

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?

States a specific verb and resource ('Insert a linear scale question') and gives concrete range examples (1-5, 1-10), which is more than a restatement of the title. However, it never distinguishes itself from the very similar sibling editor_insertRatingQuestion or editor_insertNumberQuestion, so an agent must guess between them.

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

Usage Guidelines3/5

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

'Use for sentiment, agreement scales' implies a context but gives no when-not and no comparison to the near-identical rating/number question tools in the sibling list. The guidance is only implicitly useful.

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

editor_insertListInsert listAInspect

Insert a list element. Use variant "ordered" for numbered lists, "unordered" for bullet lists. items is a native string array. Example: {variant:"unordered", items:["First point","Second point"]}.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
itemsYesList items. Same markup as a paragraph.
formIdYesForm ID to insert into
variantYesList type
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare a non-destructive, non-readOnly, closed-world write, so the safety profile is covered. The description adds that 'items' is a native string array and shows a concrete payload, but says nothing about what is returned, whether insertion is atomic, or how placement interacts with later chaining.

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?

Three short sentences, front-loaded with the purpose, then variant semantics, then a compact example. Nothing is wasted, though the inline example slightly duplicates what the schema type already conveys.

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 6-parameter write tool with no output schema, the description covers purpose, variant semantics, and payload shape, while placement semantics (after/parentId/position) are fully handled by schema descriptions. The main omission is any hint of the return value (e.g., the new node id), which an agent may need for follow-up inserts.

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 3 is the baseline, and the description actually adds real value: the schema only says variant is 'List type', while the description explains ordered=numbered vs unordered=bullets, and it clarifies that items is a native array rather than an encoded string. The worked example makes the required combination unambiguous.

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?

States a concrete verb+resource ('Insert a list element') that is immediately distinguishable from the many sibling insert tools (paragraph, table, question types). It does not, however, explicitly name which sibling to prefer or contrast with, so it stops short of 5.

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

Usage Guidelines3/5

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

The conditional guidance given ('ordered' for numbered, 'unordered' for bullets) is about parameter choice, not about when to choose this tool over editor_insertParagraph, editor_insertTable, or other insert siblings. Usage is implied by the name and example rather than stated.

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

editor_insertLogicInsert logicAInspect

Insert one logic element containing exactly one conditional rule. Insert separate logic elements for additional rules. When a rule shows a question (show action), also set isHidden:true on that question so it is hidden by default — otherwise it stays visible in the editor baseline. See load_skill("logic-rules").

NameRequiredDescriptionDefault
ruleYesSingle conditional rule. Insert another logic block for each additional rule.
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
formIdYesForm ID to insert into

TDQS

A3.7/5.0
Behavior4/5

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

Annotations cover the safety profile (non-read-only, non-destructive, closed world), and the description adds genuinely non-obvious behavioral context: that a show action requires isHidden:true on the target or it stays visible in the editor baseline. This is real value beyond the structured fields, though other mutation traits (permissions, ordering) are not covered.

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?

Three front-loaded sentences with no filler: purpose and cardinality first, then the actionable show/isHidden caveat, then a skill pointer. The final sentence could arguably be tighter, but every sentence carries information.

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 deeply nested, annotation-backed mutation tool with no output schema, the description covers the critical gotcha and the per-call granularity. It correctly defers deep rule semantics to the referenced skill rather than duplicating the schema.

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

Parameters3/5

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

Schema description coverage is 100% with rich nested descriptions, so the baseline is 3. The description reinforces the one-rule-per-call constraint on 'rule' but adds no syntax or format detail beyond what the schema already provides.

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 states a specific verb (Insert) and resource (one logic element containing exactly one conditional rule), and clarifies the cardinality constraint that additional rules need separate elements. It does not name the obvious sibling alternatives (editor_setLogic, editor_testLogic), so it misses full sibling differentiation.

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

Usage Guidelines3/5

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

It gives an implied usage pattern ('insert separate logic elements for additional rules') and a conditional caveat for show actions, but never states when to reach for this tool versus editor_setLogic or editor_testLogic. The load_skill pointer defers guidance elsewhere rather than providing it inline.

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

editor_insertMatrixQuestionInsert matrix questionAInspect

Insert a matrix/grid question. Use when rating multiple items on the same scale. Requires rows and columns as native string arrays (never a JSON string). Example: {title:"Rate our service", rows:["Speed","Quality"], columns:["Poor","OK","Great"]}.

NameRequiredDescriptionDefault
rowsYesRow labels
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
columnsYesColumn labels
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.
requireAllRowsNoEvery row needs an answer
minAnsweredRowsNoFewest rows to answer

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare this a non-read-only, non-destructive, closed-world write, so the safety profile is covered. The description adds the useful input constraint that rows/columns must be native arrays and never a JSON string, but says nothing about insertion placement behavior, auth, or side effects beyond what annotations provide.

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?

Three sentences, front-loaded with the purpose before the usage note and format constraint. The example is somewhat long for an inline snippet but directly reduces malformed calls, so it earns its place.

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 an 11-parameter insertion tool with full schema coverage, no output schema, and pre-populated annotations, the description covers purpose, use case, and the highest-risk input format pitfall. Placement semantics are left entirely to the schema, which is a minor gap.

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, but the description earns extra credit by calling out the native-array requirement for rows/columns and providing a concrete payload example. It does not clarify the placement parameters (after/position/parentId), which remain schema-only.

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?

States a specific verb and resource ('Insert a matrix/grid question') and adds a scope note ('rating multiple items on the same scale') that separates it from editor_insertRatingQuestion and editor_insertRadioQuestion. It does not name siblings explicitly, so it stays short of a 5.

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 when rating multiple items on the same scale' gives a clear use context. It lacks any when-not guidance or explicit pointer to the alternative question types an agent might confuse it with, but the context is unambiguous.

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

editor_insertNumberQuestionInsert number questionCInspect

Insert a number question for numeric input. Supports min/max bounds and step increments.

NameRequiredDescriptionDefault
maxNoMaximum value
minNoMinimum value
stepNoStep increment (must be > 0)
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.
placeholderNoPlaceholder text
defaultValueNoLiteral default seeded on open; respondent can edit or clear it. Not with defaultValueFieldRef.
defaultValueFieldRefNoPre-fill the input with a hidden or calculated field value at fill time. The respondent can still edit it.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered structurally. The description adds no behavioral context beyond the annotations – nothing about insertion ordering (after/position), the default required=true, or what happens to existing nodes. It essentially repeats feature names.

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?

Two tight sentences, front-loaded with the core action. No wasted text, though it is thin enough that it doesn't earn a 5 for information density.

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

Completeness3/5

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

For a 13-parameter tool with nested objects and no output schema, the description is minimal. Because schema coverage is 100%, the parameters themselves are well documented, so the definition is adequate but does not cover the behavioral complexity of insertion ordering and defaults.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 13 parameters, including the tricky insertion-ordering semantics of 'after' and 'position'. The description's mention of min/max/step is redundant with the schema, so the baseline 3 is appropriate.

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?

States a specific verb and resource ('Insert a number question') and clarifies the input domain ('for numeric input'), which distinguishes it from the many sibling insert*Question tools. It's clear but doesn't explicitly contrast against alternatives like text or rating questions.

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

Usage Guidelines2/5

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

No when-to-use or when-not guidance is given. With dozens of sibling question-insertion tools, the agent gets no help deciding between this and insertTextQuestion, insertRatingQuestion, etc. 'Supports min/max bounds and step increments' describes features, not selection context.

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

editor_insertPageDividerInsert page dividerAInspect

Insert a page divider to split the form into multiple pages. For a post-submit thank-you page, ALWAYS pass isThankYouPage: true; otherwise it is a normal pre-submit page. A page divider is a flat break marker, NOT a container: it holds only its name label. The new page's content is the sibling nodes that FOLLOW the divider at the document root — add each header/paragraph/question with a separate insert using after (chain via $prev), never by passing parentId = the divider. A submit-button is automatically prepended to mark the end of the previous page; the form retains its trailing submit-button for the final page, so multi-page forms have one submit-button per page (this is expected, not duplication). Pass after = id of the last content node of the page being closed.

NameRequiredDescriptionDefault
nameNoPage name/label
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
formIdYesForm ID to insert into
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
isThankYouPageNoSet true for a thank-you page that is shown only after a successful submission.

TDQS

A4.9/5.0
Behavior5/5

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

With annotations covering the safety profile (readOnlyHint=false, destructiveHint=false), the description adds substantial non-obvious behavior: a submit-button is automatically prepended, the form retains its trailing submit-button, and multi-page forms having one submit-button per page is expected rather than duplication. It also clarifies the divider is not a container and only holds a name label.

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

Conciseness5/5

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

The purpose is front-loaded in the first sentence, followed by critical usage constraints and behavioral gotchas in a logical sequence. Despite being longer than a one-liner, every sentence conveys a distinct instruction or warning relevant to correct invocation.

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

Completeness5/5

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

Given the tool's complexity, the 100% schema coverage, and the absence of an output schema, the description is complete enough. It covers the key structural and sequencing gotchas an agent needs without needing to explain return values.

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 schema already documents all six parameters. The description still adds meaningful semantic constraints beyond the schema: isThankYouPage must be true for thank-you pages, parentId must not be set to the divider, and after should reference the last content node of the page being closed.

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?

The description states a specific verb and resource ('Insert a page divider'), explains the resulting structure ('split the form into multiple pages'), and distinguishes the divider from content-insertion siblings by clarifying it is a flat break marker, not a container. An agent can identify the tool's role without opening sibling schemas.

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?

It gives explicit when-to-use guidance ('For a post-submit thank-you page, ALWAYS pass isThankYouPage: true'), explains how to add page content (separate inserts using after, chaining via $prev), and names the wrong approach to avoid ('never by passing parentId = the divider'). It also specifies after = id of the last content node.

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

editor_insertParagraphInsert paragraphCInspect

Insert a paragraph element for descriptive text.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
formIdYesForm ID to insert into
contentYesParagraph text. Raw characters, not HTML entities. Markup: **bold**, *italic*, ~~struck~~, `code`, <u>underlined</u>, [text](https://url), <span color|background="red" font="font-georgia" size="1.25">…</span>.
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds nothing beyond that — no note on where the node lands, that insertion mutates the form, or any post-insert behavior or ordering caveat. With the lower bar set by annotations, this still adds no behavioral context.

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?

A single front-loaded sentence with zero padding. It is efficient, though the brevity borders on under-specification rather than true conciseness given the tool's six parameters.

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

Completeness3/5

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

For a mutation tool with no output schema, the description is thin — it omits any note that insertion is positional within a form, that content supports rich markup, or that the node can be created hidden as a show-rule target. Most of that is recoverable from the rich schema, but the description alone is only minimally adequate.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents formId, content, after, parentId, position, and isHidden, including the $prev chaining and markup syntax. The description contributes no additional parameter meaning, so the baseline 3 applies.

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 states a specific verb+resource ('Insert a paragraph element') and adds a scope qualifier ('for descriptive text'), which distinguishes it from the many question-insertion siblings. It stops short of explicitly differentiating itself in the family of editor_insert* tools, but the resource 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 Guidelines2/5

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

There is no when-to-use guidance, no mention of prerequisites (e.g., needing a formId in edit mode), and no reference to alternatives like editor_insertTextQuestion or editor_updateElement. Any routing signal lives entirely in the schema, not the description.

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

editor_insertPaymentQuestionInsert payment questionAInspect

Insert a payment question. Use when the form must collect a payment at submit time (tickets, fees, orders). Charging requires a Stripe connection on the workspace — the element inserts without one but cannot process payments until connected. amount is a number, e.g. {amount:25, currency:"usd"}.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
amountNoPayment amount in the major unit (e.g. 19.99 USD)
formIdYesForm ID to insert into
currencyNoCurrency code, 3-letter ISO-4217 (e.g. USD, EUR, JPY). Lowercase accepted; stored uppercase.
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly=false, destructive=false), and the description adds genuinely useful behavioral context: the element can be inserted without a Stripe connection but will not process payments until connected. It does not describe the return value or insertion failure modes, but with annotations present this is solid added context.

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

Conciseness5/5

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

Three short sentences, front-loaded with the purpose, then usage, then the key constraint and example. No filler and nothing misplaced.

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 9-parameter insert tool with full schema coverage and no output schema, the description covers purpose, trigger, the critical Stripe dependency, and a syntax example. Only a note on what the tool returns or on sibling routing would make it fully complete.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all nine parameters, including amount units and currency format. The description's example ({amount:25, currency:"usd"}) is a helpful convenience but largely restates what the schema provides, so the baseline 3 is appropriate.

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?

The description opens with a specific verb+resource ('Insert a payment question') and immediately scopes it with the scenario ('collect a payment at submit time'). It is clearly distinguishable from the many sibling editor_insert*Question tools by naming the exact element type.

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 gives an explicit trigger ('Use when the form must collect a payment at submit time') and concrete examples (tickets, fees, orders), plus the Stripe prerequisite. It stops short of stating when NOT to use it or naming a specific alternative tool, so it falls just below the top band.

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

editor_insertPictureChoiceQuestionInsert picture choice questionAInspect

Insert a picture choice question. Use when choices are inherently visual (products, designs, photos). Example: {title:"Pick a style", images:[{label:"Modern", src:"https://…"}]}. Use images the user uploaded or URLs they provided — never invent or guess image URLs.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
imagesYesPicture choices with images
isHiddenNoStart hidden (the target of a `show` rule).
multipleNoAllow multiple selections
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.
maxSelectionsNoMost pictures to pick (multiple only)
minSelectionsNoFewest pictures to pick (multiple only)
defaultOptionsNoLabels preselected; one at most unless multiple

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare write (readOnlyHint=false), non-destructive, closed-world. The description adds genuinely new behavioral guidance beyond that: images must come from user uploads or provided URLs, and the anti-hallucination constraint "never invent or guess image URLs." It doesn't cover permissions or how insertion placement behaves, keeping it at 4.

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?

Four tightly packed sentences: purpose, when-to-use, a minimal example, and a constraint. Front-loaded and free of filler; the example is compact and the final sentence earns its place as a safety rule.

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 insertion tool with full schema coverage, no output schema, and safety annotations, the description covers purpose, selection criterion, input shape, and the key image-sourcing constraint. Placement/chaining behavior is left entirely to the schema, which is acceptable given its coverage.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 12 parameters including after/position/parentId placement semantics. The inline example lightly reinforces the title/images shape, and the image-source rule adds meaning for src, but this is baseline-plus rather than substantial new parameter insight.

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+resource ("Insert a picture choice question") and adds the discriminating condition "when choices are inherently visual (products, designs, photos)," which separates it from the many sibling insert*Question tools. An agent can pick this over insertRadioQuestion/insertSelectQuestion without opening a schema.

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?

Gives a clear when-to-use criterion ("choices are inherently visual") and a concrete example context ("Pick a style"). It stops short of naming the non-visual alternatives or stating when-not to use it, so it's clear context rather than a full routing rule.

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

editor_insertRadioQuestionInsert radio questionAInspect

Insert a radio button question for single-choice selection. Requires 2+ options. Use when user must pick exactly one.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
optionsYesRadio options (minimum 2, non-empty, unique)
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.
defaultOptionNoLabel of the option preselected
randomizeOptionsNoShuffle option order per respondent

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description only restates the 2+ option constraint that the schema already enforces and adds nothing about insertion placement or effects on existing nodes, which is the real behavioral risk for an insert tool.

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

Conciseness5/5

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

Three short, front-loaded sentences with no filler; the core purpose, constraint, and selection criterion are all delivered immediately.

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?

With 100% schema coverage, no output schema, and annotations covering safety, the description covers what an agent needs to select the tool. The main omission is any guidance on the positioning parameters (after/parentId/position) that make an insert call succeed, but those are fully documented in the schema.

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

Parameters3/5

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

Schema coverage is 100%, so all ten parameters including after/parentId/position are fully documented in the schema; baseline is 3. The description adds no syntax or format meaning beyond the schema, only echoing the minimum-options rule.

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?

States a specific verb (Insert) and resource (radio button question) plus the semantics (single-choice selection). However, it never names or contrasts the many sibling question-insertion tools (checkbox, select, picture choice, switch) that also create choice-based questions, so differentiation is left to inference.

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 when user must pick exactly one" gives a clear positive usage cue and implicitly excludes multi-select tools like editor_insertCheckboxQuestion. It stops short of explicitly naming the alternative or stating when-not conditions.

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

editor_insertRankingQuestionInsert ranking questionAInspect

Insert a ranking question. Use when the respondent must order items by preference (drag to rank). Requires 2+ options as a native string array. Example: {title:"Rank these features", options:["Speed","Price","Design"]}.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
optionsYesItems to rank (minimum 2, non-empty, unique)
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.
randomizeOptionsNoShuffle starting order per respondent

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation/safety profile is covered. The description adds the 2+ option requirement and format ('native string array'), but that largely restates the schema's minItems constraint and adds little about insertion side effects, positioning behavior, or defaults that isn't already in the schema.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action, then the selection cue, then the hard requirement and a concrete example. Every sentence earns its place with no padding.

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 an insert tool with no output schema and a fully documented 9-parameter schema, the description covers purpose, usage, and a valid example. It stops short of noting structural pitfalls the schema hints at (e.g., 'after' vs 'position' incompatibility), but nothing essential for calling it is missing.

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

Parameters3/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 worked example clarifies the title/options shape, but the description does not add meaning beyond what the schema already documents for the other seven parameters (after, position, parentId, etc.).

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 ('Insert a ranking question') and immediately differentiates the question type from its many siblings by defining the respondent behavior ('order items by preference, drag to rank'). An agent can distinguish this from insertRatingQuestion or insertRadioQuestion without opening either schema.

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?

The clause 'Use when the respondent must order items by preference (drag to rank)' gives a clear selection context against sibling question types. It does not explicitly name alternatives or when-not conditions, but the semantic cue is strong enough for correct selection.

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

editor_insertRatingQuestionInsert rating questionBInspect

Insert a star rating question. Use for satisfaction scores, reviews.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
isHiddenNoStart hidden (the target of a `show` rule).
maxStarsNoMaximum stars (1-10, default 5)
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.

TDQS

B3.3/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the mutation/safety profile is covered. The description adds no behavioral context beyond that - nothing about placement behavior, chaining, or what happens to sibling nodes - so it does little to enrich the annotation set.

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

Conciseness5/5

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

Two short, front-loaded sentences with zero filler. The core action leads and the usage hint follows immediately.

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

Completeness3/5

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

With 8 parameters and no output schema, the description is thin relative to the tool's complexity - especially the non-trivial insertion-positioning options the schema documents. The annotations and full schema coverage carry most of the load, but a sentence on placement or required context would round it out.

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

Parameters3/5

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

Schema description coverage is 100%, so all eight parameters are already documented (including placement semantics for after/parentId/position and the isHidden/show-rule note). The description adds no parameter detail, so the baseline 3 is appropriate.

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?

States a specific verb and resource ('Insert a star rating question'), clearly distinguishing it from sibling question types like insertLinearScaleQuestion or insertNumberQuestion. It does not explicitly name those siblings, but the resource specificity is enough for an agent to disambiguate.

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

Usage Guidelines3/5

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

'Use for satisfaction scores, reviews' gives a use-case cue that implies when this question type is appropriate. However, it names no alternatives and gives no when-not guidance, leaving the agent to infer the boundary against rating-style siblings such as linear scale or number.

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

editor_insertRepeatingGroupInsert repeating groupAInspect

Insert a repeating group: a labeled block of member fields the respondent can add multiple instances of (e.g. "Who is coming?" repeated per guest, each with Name + Phone). Provide the group name and 1+ member fields — a group is auto-deleted if it has no fields, so it must be born with at least one. Member types: text, number, date, time, email, phone, url, radio, checkbox, select, switch, rating (choice types need options). Add other/complex member types AFTER creation with the normal editor_insert*Question tools, passing parentId = the group id. Both the whole-group id (renders every instance inline, e.g. "Alice - 111, Bob - 222") and each member field id can be @-mentioned in body text, emails, and PDFs. Returns members — one { nodeId, title, inputId, options } per member field, in order — so logic and updates can target them without editor_getDocument.

NameRequiredDescriptionDefault
nameYesGroup label shown above the block, e.g. "Guests" or "Who is coming?".
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
fieldsYesMember fields repeated together per instance. At least one — an empty group is auto-deleted.
formIdYesForm ID to insert into
isHiddenNoStart hidden (the target of a `show` rule).
addButtonLabelNoLabel for the "add another" button. Default: "Add".

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare this is a non-readonly, non-destructive, closed-world write. The description goes well beyond that: the auto-deletion rule for empty groups, the @-mention behavior for group and member ids in body/email/PDF, and the returned `members` array shape all disclose behavior an agent could not infer from 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?

It is a dense single paragraph, but it is front-loaded with the definition and every sentence carries distinct, non-redundant information. It is longer than ideal, yet the length is justified by the tool's complexity rather than padding.

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

Completeness5/5

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

No output schema exists, and the description compensates by describing the `members` return payload in detail. Combined with creation constraints, id-reuse guidance, and routing to sibling insert tools, an agent has everything needed to call this correctly.

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 baseline is 3, but the description adds cross-parameter meaning — the parentId linkage for post-creation member inserts, which types require options, and the minimum-one-field invariant. It does not explain `after`/`$prev` chaining (that lives in the schema) but otherwise enriches semantics.

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 (insert a repeating group) and defines the concept inline with a concrete example ('Who is coming?' repeated per guest). It also implicitly separates itself from the single-question siblings by noting those are used to add members AFTER creation.

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?

Gives explicit usage conditions: provide name and 1+ fields (a group with no fields is auto-deleted), choice types need options, and other/complex member types must be added later via editor_insert*Question with parentId = group id. It names the alternative tool family and the exact circumstance that selects it.

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

editor_insertRowInsert rowAInspect

Insert a row layout element with 1-6 columns for a side-by-side layout. Returns columnIds left to right — pass one as parentId (position: "last") to the insert that fills it.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
formIdYesForm ID to insert into
columnsYesNumber of columns (1-6)
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations mark this as a non-destructive, non-open-world write, so safety is covered; the description adds genuinely new behavioral context by disclosing the return shape ('columnIds left to right') and the intended chaining mechanism, which matters because there is no output schema. It stops short of saying what happens to existing siblings or the form layout on insert.

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

Conciseness5/5

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

Two sentences, zero waste, with the core purpose front-loaded and the follow-up workflow second. Nothing is repeated from the schema or annotations.

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 write tool with no output schema, the description covers what is created and what is returned plus how to consume it, which is close to complete. It could add a note on ordering pitfalls or whether the row must be inserted into a specific parent, but the gaps are minor.

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 baseline is 3, but the description goes beyond it by tying the returned columnIds to the parentId and position parameters, explaining the relationship between inputs and outputs rather than merely naming fields.

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 ('Insert a row layout element with 1-6 columns') and clarifies the intent ('side-by-side layout'), which cleanly separates it from siblings like editor_insertTable or editor_insertList. An agent knows what this creates without opening the schema.

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

Usage Guidelines3/5

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

It describes the follow-up pattern (use a returned columnId as parentId with position 'last' to fill the row), which implies a workflow, but never states when to use this tool versus alternatives such as editor_insertTable or editor_insertRepeatingGroup, nor any prerequisites. Usage is implied rather than guided.

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

editor_insertScheduleAppointmentQuestionInsert schedule appointment questionAInspect

Insert a Schedule appointment question backed by Cal.com. Use for bookings or appointments; do not substitute separate date and time questions. The creator connects Cal.com and selects an event type afterward.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.
availabilityWindowDaysNoHow many future days respondents may book. Default: 14.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavior beyond annotations: the question is backed by Cal.com and requires the creator to connect Cal.com and select an event type afterward, signaling external setup dependency. It does not detail side effects or permissions beyond that, so it is strong but not exhaustive.

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

Conciseness5/5

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

Three sentences, front-loaded with the core action and immediately followed by usage guidance and the Cal.com dependency. Every sentence earns its place with no filler or repetition.

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 an insert-question tool with full schema coverage and annotations covering safety, the description is nearly complete: purpose, sibling differentiation, and external setup are all present. The only minor gap is that it does not mention what happens if Cal.com is not connected or how the inserted question behaves before setup, but those are secondary for an agent selecting the tool.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents all 8 parameters, including insertion mechanics like after, parentId, and position. The description adds no parameter-level meaning beyond what the schema already provides, so baseline 3 is appropriate.

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?

The description states a specific verb (Insert) and resource (Schedule appointment question) and scopes it to Cal.com-backed bookings or appointments. It explicitly distinguishes this from separate date and time questions, which are sibling tools (editor_insertDateQuestion, editor_insertTimeQuestion), so an agent can identify the correct tool without opening the schema.

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?

It gives explicit when-to-use guidance ('Use for bookings or appointments') and a clear when-not rule ('do not substitute separate date and time questions'). It also notes the post-insert requirement that the creator connects Cal.com and selects an event type afterward, which routes the agent away from this tool if no Cal.com setup is intended.

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

editor_insertSelectQuestionInsert select questionAInspect

Insert a dropdown select question: one answer from a list. Requires 2+ options. For several answers use editor_insertCheckboxQuestion.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
optionsYesDropdown options (minimum 2, non-empty, unique)
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.
placeholderNoPlaceholder text
randomizeOptionsNoShuffle option order per respondent

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare this is a non-destructive, closed-world write (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the safety profile is covered by structured data. The description adds the option-count precondition, but says nothing about permissions needed, what happens to the form on failure, or that an element/node id is produced. Adequate, not rich.

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

Conciseness5/5

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

Two sentences, no filler, front-loaded with the tool's identity before the routing hint. Every clause earns its place.

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 10-parameter insert tool with a fully documented schema and annotations that already cover the write/safety profile, the description supplies the one piece of context the schema cannot: which sibling to pick when multiple answers are needed. No output schema exists, so return values need not be explained, though noting the created element's id would have been a nice addition.

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

Parameters3/5

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

Schema description coverage is 100% and every parameter (after, parentId, position, isHidden, required, placeholder, randomizeOptions) is already documented in the schema with usage hints such as '$prev to chain' and 'Not combinable with after'. The description's 'Requires 2+ options' merely restates the schema's minItems: 2. Baseline 3 is correct when the schema carries the burden.

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?

The description gives a specific verb ('Insert'), the exact resource ('dropdown select question'), and the semantic scope ('one answer from a list') that separates it from the multi-answer siblings in the editor_insert*Question family. An agent can immediately tell it apart from editor_insertCheckboxQuestion. The only unstated cousin is editor_insertRadioQuestion, which shares the single-answer semantics, but the stated purpose 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?

It states an explicit routing rule: 'For several answers use editor_insertCheckboxQuestion,' and gives a precondition ('Requires 2+ options'). It does not address the closer competitor editor_insertRadioQuestion, so the agent must infer select-vs-radio from the name alone. Clear context, but not a full when/when-not matrix.

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

editor_insertSignatureQuestionInsert signature questionCInspect

Insert a signature pad question for collecting handwritten signatures.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare this is a non-readOnly, non-destructive, closed-world insert. The description adds no behavioral context beyond that — no note about default placement, no auth or permission requirements, and no indication of what the mutation returns or how insertion ordering behaves. For a write tool it does not pull its weight.

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?

A single efficient sentence with the key noun phrase front-loaded and no filler. It is well-formed, though at one clause it offers no structure for scannability.

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

Completeness3/5

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

Given seven parameters, a mutation-style operation with no output schema, and a dense sibling set, the description is minimal but the rich schema carries most of the load. It is adequate to invoke correctly, but an agent gets no help on selection or on insertion-order semantics that the schema only partially hints at.

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

Parameters3/5

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

Schema description coverage is 100%, so all seven parameters (including the non-obvious `after`, `position`, and `isHidden`) are documented in the schema itself. The description contributes no additional parameter meaning, so the baseline 3 applies.

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 names a specific verb (Insert) and a specific resource (signature pad question for handwritten signatures), which clearly distinguishes it from the other ~30 editor_insert*Question siblings. It stops short of explicitly contrasting with alternatives like editor_insertTextQuestion, but the resource 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 Guidelines2/5

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

There is no guidance on when to use this tool versus other question types, nor any mention of prerequisites (form must exist, region must be editable) or when-not-to-use. The agent must infer that this is chosen whenever a signature field is wanted.

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

editor_insertSwitchQuestionInsert switch questionCInspect

Insert a toggle switch question for yes/no or on/off responses.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds nothing behavioral beyond that: no mention of defaults (e.g., required defaults to true), insertion/positioning side effects, or return behavior.

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?

A single clean sentence with the key semantic detail (yes/no or on/off) front-loaded. It is tight, though 'for yes/no or on/off responses' is somewhat redundant with the name 'Switch'.

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

Completeness3/5

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

With seven parameters, no output schema, and annotations covering only safety, the description is minimally adequate. It omits insertion-positioning behavior and defaults that an agent must recover from the schema, but nothing critical is entirely absent.

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

Parameters3/5

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

Schema description coverage is 100%, so all seven parameters including after/$prev chaining, position, parentId, and isHidden are fully documented in the schema. The description contributes no additional parameter meaning, which is the baseline 3 case.

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?

States a specific verb and resource ('Insert a toggle switch question') and clarifies the answer type as yes/no or on/off, which is real substance. It does not explicitly distinguish itself from the many sibling insert*Question tools (radio, checkbox, select), leaving the agent to infer the difference from the name alone.

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

Usage Guidelines2/5

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

No when-to-use or when-not-to-use guidance. Given roughly a dozen sibling question-insertion tools, the description never says when a switch question is preferable to a checkbox or radio question, nor any prerequisites.

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

editor_insertTableInsert tableAInspect

Insert a static content table (text cells) — NOT a question; for rating grids respondents answer, use editor_insertMatrixQuestion. rows and cols are numbers, never strings. Example: {rows:2, cols:2, hasHeader:true, cells:[["Item","Price"],["Visit","40 EUR"]]}.

NameRequiredDescriptionDefault
colsYesNumber of columns (1-10)
rowsYesNumber of rows (1-20)
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
cellsNoCell text, rows x cols, row 0 first, same markup as a paragraph. Omit for an empty grid.
formIdYesForm ID to insert into
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
hasHeaderNoWhether first row is a header

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds the useful distinction that this is static content rather than an interactive question, but says nothing about permissions, reversibility, or insertion side effects. Adequate but not rich given annotations carry the safety burden.

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

Conciseness5/5

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

Two tight sentences with the disambiguation front-loaded, followed by a compact example. Every element earns its place; no filler.

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

Completeness5/5

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

For an insert tool with no output schema and annotations covering safety, the description supplies purpose, the sibling alternative, the key type constraint, and a concrete example. Nothing needed to call it correctly is missing.

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 baseline is 3, but the description adds a concrete gotcha ('rows and cols are numbers, never strings') and a full worked example showing the nested cells layout that the schema only describes abstractly. This materially helps correct invocation.

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 ('Insert a static content table') and immediately disambiguates from the closest sibling by naming editor_insertMatrixQuestion for rating grids. An agent can distinguish this from the many editor_insert* tools without opening the schema.

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 gives the when ('static content, text cells') and the when-not ('NOT a question; for rating grids...'), and routes to the alternative by name. Nothing about tool selection is left to inference.

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

editor_insertTextQuestionInsert text questionBInspect

Insert a text question for short or long text responses. Use for names, comments, descriptions.

NameRequiredDescriptionDefault
maxNoMaximum character length
minNoMinimum character length
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
patternNoRegex the answer must match; anchor with ^ $.
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.
multilineNoAllow multiline input (textarea)
placeholderNoPlaceholder text
defaultValueNoLiteral default seeded on open; respondent can edit or clear it. Not with defaultValueFieldRef.
defaultValueFieldRefNoPre-fill the input with a hidden or calculated field value at fill time. The respondent can still edit it.

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds nothing behavioral beyond content type—no mention of side effects, ordering constraints on the form tree, or what inserting does to existing elements—so it earns little credit above the annotations.

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

Conciseness5/5

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

Two short sentences, front-loaded, with zero filler. Every clause earns its place by naming the field type and typical uses.

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-param insertion tool with full schema coverage and no output schema, the schema carries the mechanical burden, so the description needn't explain parameters. Its main gap is distinguishing this tool from the many sibling question-insertion tools, which the description only partially does by content type.

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

Parameters3/5

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

Schema description coverage is 100% and 14 params are thoroughly documented, including subtle placement semantics (after, position, parentId) and defaults. The description contributes no parameter-level meaning, so the baseline 3 applies.

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?

States a specific verb+resource ('Insert a text question') and scopes the response type ('short or long text responses'). It partially differentiates from sibling question types by content type, but never names the alternatives (e.g. editor_insertParagraph, editor_insertSelectQuestion) that an agent must choose between.

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

Usage Guidelines3/5

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

'Use for names, comments, descriptions' gives implied usage context for free-text fields. However, it offers no when-not-to-use guidance and no explicit routing among the ~35 sibling insert tools, leaving the agent to infer that this is for free text rather than select, paragraph, or other field types.

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

editor_insertTimeQuestionInsert time questionCInspect

Insert a time picker question for time selection.

NameRequiredDescriptionDefault
afterNoNodeId to insert after. Use $prev to chain. Omitting appends to end (usually wrong).
titleYesQuestion title
formIdYesForm ID to insert into
maxTimeNoLatest time, HH:mm
minTimeNoEarliest time, HH:mm
isHiddenNoStart hidden (the target of a `show` rule).
parentIdNoParent node ID to insert into (e.g., column1)
positionNoPosition among siblings: inside parentId when given, else at the top level ('first' = top of the form, e.g. a title). Not combinable with after.
requiredNoWhether question is required. Default: true. Pass false to make the field optional.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the safety profile is known. The description adds nothing beyond that: it doesn't say the insert mutates the form structure, where the new node lands, or what a failure looks like. All placement behavior lives only in the schema.

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?

A single short, front-loaded sentence with no filler. It is efficient, though the brevity borders on under-specification rather than true conciseness.

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

Completeness3/5

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

Given nine parameters, a large sibling set, and no output schema, the description is thin — it never mentions placement (after/parentId/position) or that this is a structural mutation of the form. The rich parameter schema and the annotations cover most of the gap, keeping it at minimum-viable rather than inadequate.

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

Parameters3/5

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

Schema description coverage is 100%, including useful notes on 'after', 'position' and 'isHidden', so the schema does the heavy lifting. The description contributes no parameter meaning of its own, which is exactly the baseline-3 case for high coverage.

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?

States a specific verb and resource: 'Insert a time picker question', which is enough to distinguish it from the many sibling insert*Question tools (e.g. editor_insertDateQuestion). It stops short of naming an explicit contrast, but the resource noun 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 Guidelines2/5

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

There is no when-to-use guidance, no prerequisites (e.g. that the form must exist / be editable), and no mention of alternatives such as editor_insertDateQuestion. The agent gets no help choosing this over its 30+ sibling insert tools beyond the word 'time'.

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

editor_insertVariableInsert variableAInspect

Insert a variable reference inline to display a field value in text (answer piping). Works with hidden fields, calculated fields, and question input fields. Use in paragraphs and headers to show dynamic values like recipient names, scores, totals, or piped answers.

NameRequiredDescriptionDefault
formIdYesForm ID
nodeIdYesID of the text node to insert the variable reference into (e.g., "p1", "h1")
offsetYesCharacter position to insert at. Use -1 to append at end. Each existing inline element (variable, link) counts as ONE position, not its display label length. Prefer 0 / -1 when the target paragraph already has inlines.
fieldIdYesID of the field to reference — can be a hidden field (e.g., "hf1"), a calculated field (e.g., "cf1"), or a question input field (e.g., "ti1") for answer piping
fieldNameYesDisplay name for the variable reference

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the mutation-but-not-destructive profile is covered. The description adds the field-type compatibility (hidden, calculated, question inputs) but nothing about what insertion changes, offset edge cases, or failure behavior.

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?

Three tight sentences with the core action front-loaded and the usage examples last. Every sentence contributes; no filler.

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 5-required-param mutation tool with a fully documented schema and no output schema, the description covers purpose, field compatibility, and usage sites well. It is only missing return/error behavior, which is minor given the schema depth.

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

Parameters3/5

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

Schema description coverage is 100%, including the tricky offset semantics and examples for nodeId/fieldId, so the schema carries the load. The description repeats the field-type constraint (hidden/calculated/question) but adds no syntax or format detail beyond the schema.

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 states a specific verb (insert) and resource (variable reference inline), and clarifies the intent is answer piping. It implicitly separates itself from siblings like editor_insertHiddenField or editor_insertCalculatedField by saying it references existing fields rather than creating them, though it never names those siblings explicitly.

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 in paragraphs and headers to show dynamic values like recipient names, scores, totals, or piped answers" gives clear contextual guidance for when to reach for this tool. There is no explicit when-not or named alternative, but the use case is unambiguous.

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

editor_setLogicSet logicAInspect

Overwrite the single conditional rule on a logic element identified by nodeId. Insert separate logic elements for additional rules; delete the element to remove its rule. Referenced question, page, and field IDs are validated. Read the document first with editor_getDocument to get valid IDs. When a rule shows a question, also set isHidden:true on that question so it is hidden by default. See load_skill("logic-rules").

NameRequiredDescriptionDefault
ruleYesSingle replacement rule. Insert another logic block for each additional rule.
formIdYesForm ID
nodeIdYesnodeId of the logic element whose rule is being overwritten (from editor_getDocument).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the bar is lower, yet the description adds real behavior: rule replacement semantics (one rule per element), ID validation on referenced questions/pages/fields, and the prerequisite of reading the document first. The non-obvious side-effect requirement (also set isHidden:true on shown questions) is especially valuable. It slightly undersells the replace-existing-rule data loss relative to destructiveHint=false, keeping it from 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.

Conciseness5/5

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

Five short sentences, front-loaded with the core action and replacement semantics, then prerequisites, then the pitfalls, then a pointer to deeper docs. Every sentence carries distinct actionable information with no padding.

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

Completeness5/5

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

For a complex nested-schema mutation tool with no output schema, the description covers action, alternatives, removal path, ID validation, prerequisites, and a tricky default-visibility side effect. No further information is needed to call it correctly.

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

Parameters3/5

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

Schema coverage is 100% and the nested rule/condition/action structures are documented exhaustively in the schema itself, including 'Single replacement rule. Insert another logic block for each additional rule.' The description's mention of a 'single conditional rule' and nodeId therefore largely restates schema content, so baseline 3 is right.

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 precise verb+resource: 'Overwrite the single conditional rule on a logic element identified by nodeId.' This immediately distinguishes it from sibling editor_insertLogic, which the description implicitly covers by telling the agent to insert separate logic elements for additional rules.

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?

Explicit when-to-use routing: use this to overwrite, insert separate elements for additional rules, delete the element to remove a rule, and read editor_getDocument first for valid IDs. It even points at load_skill("logic-rules") for deeper guidance, leaving nothing to inference.

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

editor_testLogicTest logicA
Read-only
Inspect

Simulate logic rules against sample answers and return visibility/required/calculated results. Read-only. Uses the same engine as the published form runtime.

NameRequiredDescriptionDefault
formIdYes
answersNoMap of fieldId → answer value (any JSON-serializable shape). Keys are question/input/hidden/calculated field IDs from editor_getDocument. Values follow the per-field type — strings for text, numbers for number, booleans for switch, arrays for checkbox/ranking, etc. For a payment input, true simulates a completed payment.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, and the description's 'Read-only' merely repeats that. The one genuinely additive statement is that it uses the same engine as the published form runtime, which signals high-fidelity simulation — useful, but nothing about error behavior or result shape is disclosed.

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

Conciseness5/5

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

Three short sentences with the core action front-loaded, followed by the safety trait and the fidelity guarantee. Zero filler.

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?

With no output schema, the description does name the three result categories the agent gets back (visibility/required/calculated), which is the key gap-filler. It stops short of describing how results map to fields or how missing/invalid answers are handled.

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

Parameters3/5

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

Schema coverage is 50%: formId is undocumented but self-evident, while answers carries a thorough schema description covering field-ID keys, per-type values, and the payment special case. The description adds only the loose phrase 'sample answers' on top of that, so it neither compensates for nor extends the schema meaningfully.

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?

States a specific verb and resource: simulate logic rules and return visibility/required/calculated results. An agent can distinguish it from editor_setLogic (which writes logic) and editor_insertLogic (which creates logic elements) by the simulation framing, though no sibling is named explicitly.

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

Usage Guidelines3/5

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

The phrase 'against sample answers' and 'Read-only' imply this is a dry-run tool for verifying logic before publishing, but no when-to-use or when-not-to-use condition is stated, and no alternative (e.g. editor_setLogic) is referenced. Usage must be inferred.

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

editor_updateElementUpdate elementAInspect

Edit one element identified by nodeId — replace its text, change its props, and/or reposition it in a single call. Call editor_getDocument first and copy nodeId from it — never guess or reuse an ID from an earlier conversation. content: replace the entire text of a paragraph/header/list-item/table-cell, etc. (whole-element replace, not a substring or document-wide replace; not valid on input/option shells). properties (partial — send only what changes): isHidden, isThankYouPage (page only — marks the post-submit thank-you page), required, titleIsHidden, label (renames an option, question-title, or question), maxStars (rating-input), min/max/minLabel/maxLabel (linear-scale-input), placeholder / defaultValue (text, email, phone, url, number — defaultValue null clears), validation (answer rules keyed by the input, e.g. {maxLength:80} or {minDate:"2026-01-01"}; null clears one), randomizeOptions (radio/checkbox/select/ranking), multiple (select/picture choice). moveTo: reposition instead of recreating — e.g. moveTo:{parentId:<columnId>,position:"last"} to move it into a column for a side-by-side layout, or moveTo:{after:<nodeId>} to place it right after another element. To set conditional logic rules on a logic element, use editor_setLogic instead.

NameRequiredDescriptionDefault
formIdYesForm ID
moveToNoReposition (keeps id/content).
nodeIdYes
contentNoReplace the whole text of a paragraph/header/list-item/cell, in editor_insertParagraph's markup. Not a substring; not for input/option shells (rename a title via properties.label).
propertiesNo

TDQS

A4.4/5.0
Behavior4/5

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

With readOnlyHint=false already signalling mutation, the description still adds meaningful behavior: properties is partial (send only what changes), null clears a default/validation rule, content is a whole-element replace not substring, and validation keys are per-input-type. It doesn't cover perm/auth or error behavior, but the added mutation semantics are substantial.

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?

Front-loaded with the core action, then dense per-field guidance with no filler. It is long, but virtually every clause carries node-type constraints or examples that earn their place; only minor density cost keeps it from 5.

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 5-param nested mutation tool with no output schema, the description covers input semantics, prerequisites, and the sibling hand-off for logic. It leaves the return shape unstated, but with no output schema and annotation coverage of the safety profile, the gap is minor.

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

Parameters5/5

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

Schema coverage is only 60%, and the description compensates richly: it maps each property to its valid node type (maxStars→rating-input, min/max/minLabel/maxLabel→linear-scale-input, multiple→picture choice only), shows validation examples like {maxLength:80} and {minDate:"2026-01-01"}, and gives concrete moveTo payloads.

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+resource (edit one element by nodeId) and enumerates the three mutating operations it performs (text, props, reposition) in one call. It clearly distinguishes itself from the editor_insert* and editor_deleteElement siblings by being the edit-in-place 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?

Gives a hard prerequisite (call editor_getDocument first, copy nodeId, never guess/reuse an old ID) and routes conditional-logic work to editor_setLogic. It also states content is invalid on input/option shells and points to properties.label instead. It lacks broader when-to-use-vs-siblings guidance (e.g. vs editor_formatText), so not a 5.

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

fields_listList fieldsA
Read-only
Inspect

List the field keys a request can address on a published form — the keys, value types, option keys and whether each belongs in prefill (visible questions) or context (hidden fields). Read-only. Call this before request_create instead of guessing keys from question titles. Returns { items, next }; each item carries a usage line and, for option questions, options: [{ key, label }] (prefill takes the key, never the label); a matrix lists rows and columns the same way. Reads the form's current published version, so re-read it after form_publish.

NameRequiredDescriptionDefault
formIdYesPublished form to read the addressable field keys of. Get it from form_list or form_create.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already establish the read-only safety profile, and the description adds real behavioral context beyond them: it reads the currently published version only, must be re-read after publish, returns { items, next }, and each item's key-vs-label rule for prefill is stated explicitly. This goes well past what structured fields convey.

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

Conciseness5/5

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

Dense but front-loaded: purpose first, then the routing instruction, then the return shape. Every clause carries information (usage line, options key-not-label, matrix rows/columns) and none is filler.

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

Completeness5/5

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

With no output schema, the description fully compensates by describing the return envelope and item shape, including the edge case of option questions and matrices. An agent has everything needed to call and consume it.

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

Parameters3/5

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

There is a single parameter (formId) with 100% schema description coverage that already tells the agent where to get the id. The description's detail about prefill/context and option keys concerns the returned fields rather than the input parameter, so it adds little meaning to the parameter itself; baseline 3 applies.

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 ('List the field keys a request can address on a published form') plus the distinguishing scope (addressable keys, value types, option keys, prefill vs context). It is clearly separable from siblings like form_get or request_create.

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?

Gives explicit when-to-use ('Call this before request_create instead of guessing keys from question titles') and a concrete re-use trigger ('re-read it after form_publish'). No alternatives are left to inference.

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

formAnalytics_getGet form analyticsA
Read-only
Inspect

Get form analytics: views, submissions, completion rate, bounce rate, and device / browser / country / traffic-source breakdowns. Read-only. Use form_list to find formId first. Rate metrics (completionRate, engagementRate, bounceRate) return as numbers (0–100); counts are integers. Each breakdown counts unique visitors per value (a visitor counts once, like uniqueVisitors); for completion on one device, filter by device and read completionRate. Returns { formId, period, metrics, breakdown, totalEvents }. totalEvents is the raw analytics event row count (before deduplication into unique visitors). When from/to both omitted, response returns period: { from: null, to: null } (all time). Constraint: from <= to when both supplied. Analytics are a Pro feature: if the workspace owner is not on Pro, this returns UPGRADE_REQUIRED rather than data, including for history recorded while they were.

NameRequiredDescriptionDefault
toNoEnd of date range as Unix ms timestamp. Must be >= `from` when both set.
fromNoStart of date range as Unix ms timestamp. Must be <= `to` when both set.
deviceNoFilter by device type (default: all)
formIdYesForm ID to get analytics for
countryNoFilter by country code (e.g., "US", "DE", "TR")
includeEventsNoInclude sanitized analytics events for custom analysis (no visitor IDs)
trafficSourceNoFilter by traffic source (e.g., "Direct", "Google", referrer domain)

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint/openWorldHint/destructiveHint, yet the description adds substantial behavior beyond them: the Pro-feature gate and its UPGRADE_REQUIRED terminal behavior (including history recorded while Pro), the deduplication semantics that make breakdown counts unique visitors while totalEvents is the raw pre-dedup count, and the specific response shape when from/to are omitted (period: { from: null, to: null }).

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 most important facts are front-loaded: what it returns, then read-only, then prerequisites. It is dense but each sentence carries distinct information (return shape, dedup rule, default period, gating). The only minor waste is 'Read-only', which the readOnlyHint annotation already conveys.

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

Completeness5/5

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

For a 7-parameter read tool with no output schema, the description compensates fully: it documents the return object keys, the meaning of totalEvents vs deduplicated breakdown counts, the all-time default period, and the error path for non-Pro workspaces. An agent has everything needed to call and interpret 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 baseline is 3, but the description goes further by stating that rate metrics are 0–100 numbers vs integer counts, that breakdown counts are per-unique-visitor, that includeEvents returns sanitized events without visitor IDs, and by restating the from<=to constraint. That adds real interpretive value over the property descriptions.

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?

The description opens with a specific verb+resource ('Get form analytics') and enumerates exactly what is returned: views, submissions, completion rate, bounce rate, and device/browser/country/traffic-source breakdowns. This clearly distinguishes it from siblings like form_list, form_get, and formSubmission_list, which serve different purposes.

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 gives an explicit prerequisite ('Use form_list to find formId first') and a concrete usage recipe ('for completion on one device, filter by device and read completionRate'), plus the Pro-plan condition that yields UPGRADE_REQUIRED. It stops short of stating when *not* to use it, but no competing analytics sibling exists, so the routing guidance is largely complete.

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

form_createCreate formAInspect

Create a new form in a workspace. Returns the form and a previewUrl the user can open to watch live edits. After create, call editor_getDocument to see the empty document, then chain the per-variant editor_insert* tools (e.g. editor_insertHeader, editor_insertParagraph, editor_insertTextQuestion) with after: "$prev" to add header/paragraph/question nodes.

NameRequiredDescriptionDefault
nameYes
folderIdNo
workspaceIdYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations declare it is a write (readOnlyHint=false) but non-destructive and not open-world. Beyond that, the description discloses the return payload (the form plus a previewUrl for live edits) and the required downstream tool chain, which is meaningful since no output schema exists. It omits permission/auth requirements and duplicate-name behavior.

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?

Front-loads the purpose in the first sentence, then adds return info and the follow-on workflow. Three sentences, each with a distinct job, though the enumerated insert-tool examples are mildly verbose.

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

Completeness3/5

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

With no output schema, describing the return value and the editing workflow is a real contribution, but with 0% parameter coverage the description leaves folderId and name semantics undocumented, and says nothing about failure modes or prerequisites. Adequate but with clear gaps for a 3-parameter creation tool.

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

Parameters2/5

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

Schema description coverage is 0% for all three parameters. The description only indirectly implies workspace scope ('in a workspace') and never mentions name constraints or the optional folderId at all, so the agent gets no semantics for folder targeting or naming rules.

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 ('Create a new form in a workspace'), which cleanly separates it from form_update, form_get, and the unrelated document_create sibling. An agent can identify the operation without opening the schema.

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?

Gives explicit workflow guidance: after creation call editor_getDocument, then chain editor_insert* tools with after: "$prev". It does not compare against alternatives like document_create or explain when a form is preferable to a document, so it is slightly short of full when/why-to-use guidance.

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

form_deleteDelete formA
Destructive
Inspect

Move a form to trash (soft delete). Active share links are revoked so their public URLs stop serving — restoring the form does NOT re-enable revoked links; mint new ones with formShareLink_create. Restorable with form_restore.

NameRequiredDescriptionDefault
formIdYes

TDQS

A4.4/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the destructiveHint annotation: it specifies soft deletion, revocation of active share links, that restoring does not re-enable revoked links, and that new links must be minted with formShareLink_create. This is rich operational disclosure for a destructive tool.

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

Conciseness5/5

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

The description is compact and front-loaded: the primary action and soft-delete nature appear first, followed by important side effects and the restore path. Every clause carries useful information.

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

Completeness5/5

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

Given the absence of an output schema and the simple one-parameter input, the description covers the critical behavioral outcomes an agent needs: soft deletion, link revocation irreversibility, and restore/link alternatives. It is complete enough for correct invocation.

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

Parameters2/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 compensate for the unexplained formId parameter, but it does not describe the expected format, source, or constraints of formId. It only implies that a form is targeted, which the parameter name already conveys.

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?

The description uses a specific verb and resource: 'Move a form to trash (soft delete).' It clearly distinguishes this soft-delete operation from permanent deletion and from sibling tools like form_restore and formShareLink_create.

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?

The description implies when to use this tool by stating the action and consequences, and it names related alternatives: form_restore for restoration and formShareLink_create for new links. However, it lacks an explicit when-not/alternative comparison against tools such as form_unpublish.

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

form_getGet formB
Read-only
Inspect

Get details for a form by ID. Includes a previewUrl the user can open to watch live edits (works for draft and published forms).

NameRequiredDescriptionDefault
formIdYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false. The description adds useful return behavior: a previewUrl for live edits and support for both draft and published forms, though auth/error behavior is not covered.

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

Conciseness5/5

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

Two sentences, front-loaded with purpose and then a key return detail. Every sentence earns its place with no wasted text.

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

Completeness3/5

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

For a simple one-parameter read tool with rich safety annotations, the description is adequate but incomplete: it omits parameter source and any detail about returned fields beyond previewUrl. The absence of an output schema means more return context would help.

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

Parameters2/5

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

Schema description coverage is 0% and the sole parameter formId has no description. The description only says 'by ID,' which does not explain what identifier is expected or where to obtain it, so it fails to compensate for the schema gap.

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?

States a specific verb (Get), resource (form details), and scoping (by ID). However, 'details' is broad and does not explicitly distinguish it from sibling retrieval tools like formSettings_get or formTheme_get.

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

Usage Guidelines2/5

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

No when-to-use guidance or alternatives are provided. The note that it works for draft and published forms is contextual, but the agent must infer that this retrieves general form details rather than settings, themes, analytics, or lists.

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

form_listList formsA
Read-only
Inspect

List forms in a workspace with optional folder filter and fuzzy name query. folderId=null for root-level only, omit for all. Pass query to filter by name (fuzzy) — search results are capped at limit with a truthful hasMore flag, but cannot be paginated further (tighten the query if hasMore is true). Cursor pagination available on the unfiltered list path. Forms request_create built carry origin: "inline".

NameRequiredDescriptionDefault
limitNoPage size (1–100, default 20).
queryNoFuzzy name match. Omit to return all forms in scope.
cursorNoOpaque cursor from a prior response's `nextCursor`. Omit to start at page 1.
folderIdNonull for root-level only, omit for all.
workspaceIdYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare a safe read operation (readOnlyHint=true, destructiveHint=false), so the bar is lower. The description earns real credit by disclosing a non-obvious constraint: query results are capped at `limit` with a truthful hasMore but cannot be paginated further, while cursor pagination only works on the unfiltered path. Auth needs and rate limits remain unstated.

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?

Front-loads the core purpose and packs three distinct behavioral clauses into a few sentences, all of which carry information. The trailing sentence about forms created via request_create carrying origin 'inline' is tangential and mildly confusing in context.

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?

With no output schema, the description carries return-value burden; it covers the critical pagination contract (hasMore, nextCursor, cap on filtered search) but never describes what a returned form object contains or result ordering. Complete on the behavioral pitfalls, incomplete on payload shape.

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 80%, so the baseline is 3. The description largely restates folderId and query semantics, but adds genuine value by describing the interaction between `query` and `cursor` (mutually exclusive pagination paths) that the schema does not capture.

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 ('List forms') scoped to a workspace, and immediately characterizes the two optional filter modes. Against a large sibling set that includes form_get and fields_list, an agent can tell this is the collection-listing operation without opening the schema.

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?

Gives concrete operational guidance: folderId=null means root-only, omit for all, and explains when to use `query` versus `cursor`. It does not explicitly name sibling alternatives (e.g., form_get for a single form), but the routing conditions for its own two modes are clear.

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

form_publishPublish formAInspect

Publish a form's current content to make it live. Idempotent — a live form with no unpublished changes is left as is. Forms with content blocks but no question elements publish with a warning. Forms with no editor content cannot be published — call editor_insertHeader or editor_insertTextQuestion first. Next: formShareLink_create.

NameRequiredDescriptionDefault
formIdYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare the generic write profile (readOnly=false, destructive=false, openWorld=false). The description goes well beyond them by disclosing idempotency semantics, the warning behavior for forms with content blocks but no questions, and the failure mode with a concrete remedy. These are behavior traits the structured fields do not carry.

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

Conciseness5/5

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

Four short sentences, front-loaded with purpose, each carrying distinct information (idempotency, warning case, failure case, next step). No filler and nothing repeated from the schema or annotations.

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

Completeness5/5

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

For a single-parameter mutation with no output schema, the description covers purpose, idempotency, edge cases, failure remediation, and the logical next call. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Only one parameter (formId) with 0% schema description coverage, and the description never elaborates on it. However, formId is self-evident from its name and required status, so the gap is minor rather than disqualifying; a 3 reflects adequate-but-thin coverage.

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 ('Publish a form's current content') and clarifies the resulting state ('make it live'), which cleanly separates it from form_unpublish and form_update among the siblings. An agent can tell what it does without opening the schema.

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 gives the precondition for failure ('Forms with no editor content cannot be published') and the alternative remediation path ('call editor_insertHeader or editor_insertTextQuestion first'), plus the natural follow-up tool (formShareLink_create). This is exactly the when/when-not/alternatives guidance the dimension asks for.

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

form_restoreRestore formAInspect

Restore a form from trash. Omit folderId to restore to its original folder; pass null for workspace root; pass a folderId string for a specific folder.

NameRequiredDescriptionDefault
formIdYes
folderIdNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare a non-read-only, non-destructive, closed-world mutation, and the description goes beyond them by explaining exactly where the restored resource lands. It omits failure behavior (e.g. what happens if the form is not in trash) and any permission requirements, so it is strong but not exhaustive.

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

Conciseness5/5

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

Two sentences, zero filler, with the core action front-loaded and the parameter details following in the order an agent needs them. Every clause carries information.

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 two-parameter mutation with no output schema and no nested objects, the description supplies everything required to invoke it correctly. Only the absence of error/prerequisite behavior keeps it from being fully complete.

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 burden falls on the description, and it delivers: the omitted-vs-null-vs-string distinction for folderId is a tri-state semantic that the schema's type: [string, null] cannot express. formId is left unexplained, though its meaning is self-evident from the tool name.

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 ('Restore a form') and adds scope ('from trash'), which lets an agent distinguish it from form_delete and form_update without opening a schema. No ambiguity about what the tool achieves.

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

Usage Guidelines3/5

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

The destination-resolution sentence gives operational context (omit vs null vs string), but there is no explicit when-to-use or when-not guidance and no named alternative such as the sibling form_delete that presumably puts a form in the trash. Usage is implied rather than stated.

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

formSettings_getGet form settingsA
Read-only
Inspect

Get form settings including notification email config, respondent emails, the active email domain, verified email domains available for a custom From address, and Stripe payment connection status. Returns { settings, isDefault, availableEmailDomains, defaultFromAddress, payment }.

NameRequiredDescriptionDefault
formIdYesForm ID to get settings for

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already establish the safe-read profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the description's extra value is the return payload: it names the settings groups plus isDefault, availableEmailDomains, defaultFromAddress, and payment. No output schema exists, so this disclosure is genuinely additive; it stops short of describing auth needs or domain-verification semantics.

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

Conciseness5/5

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

Two sentences, no filler: purpose first, return shape second. Every clause (email config, domains, Stripe status, response keys) earns its place for a tool with no output schema.

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?

With no output schema, the description correctly compensates by enumerating the response object's top-level keys, and the single required param is fully documented in the schema. Slightly incomplete in that it does not explain what isDefault distinguishes or how availableEmailDomains differs from the active domain.

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

Parameters3/5

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

Single formId parameter with 100% schema description coverage ('Form ID to get settings for'), so the schema carries the semantics. The description adds nothing about the identifier's format or source, which is the expected baseline-3 outcome here.

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?

Specific verb+resource ('Get form settings') with an enumeration of exactly what the settings contain: notification email config, respondent emails, email domains, Stripe payment status. This implicitly separates it from form_get (form metadata) and formSettings_update, though it never names those siblings to make the split explicit.

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

Usage Guidelines2/5

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

No when-to-use guidance, no prerequisites, and no pointer to formSettings_update as the mutation counterpart. The agent must infer from the name that this is the read side of the settings pair.

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

formSettings_updateUpdate form settingsAInspect

Update form settings. Only provide fields to change. Use this for form BEHAVIOR — email notifications, scheduling/limits, redirects. For the form's name/folder/cover/logo use form_update; for colors/fonts/visual theme use formTheme_set; for questions and content use the editor_* tools.

Three independent email flows: self-notification (form owner/team on submit), respondent notification (confirmation to respondent), respondent reminder (when respondent abandons mid-form, Pro tier). Each is gated by its own *Enabled flag and accepts a custom subject + body. Respondent-targeted flows require *To to point at an email-input field ID (find via editor_getDocument). A fourth, the request invitation (requestInvitationSubject/Body), has no switch: request_create decides per request whether it is sent.

Localization: customizing a respondent confirmation/reminder subject or body makes it translatable — the keys appear in translationDraft_get immediately (no form publish needed); localize via translationDraft_get → translationDraft_update. Self-notification (owner) emails are NOT translatable; write them directly in the target language here.

Custom From domain: pass emailDomainId from formSettings_get → availableEmailDomains; null resets to noreply@formstep.io.

{{variable}} placeholders for subjects/bodies: {{email.formName}}, {{email.submittedAt}}, {{email.submissionId}}, {{email.submissionType}}, {{metadata.formId}}, {{metadata.authorizedEmail}}, {{metadata.pin4|pin6|code4|code6}}, plus any answer as {{}} (the field key fields_list shows; the input node id from form_get questions[].id also works). Keys read back as {{}}. load_skill("form-settings") describes each.

NameRequiredDescriptionDefault
formIdYesForm ID to update settings for
languageNoBCP-47 language tag (e.g. "en", "en-US", "pt-BR"). Defaults to "en".
maxEditsNoMax post-submit edits allowed per submission (requires editAfterSubmit). 0 = unlimited on Pro and Business, 3 on Free.
passwordNoForm access password. Setting a string implies passwordEnabled:true. Pass null to clear the gate (sets passwordEnabled:false).
redirectUrlNohttp(s) URL respondents land on after submission. null or empty string clears. Mutually exclusive with allowAnotherResponse:true.
showBrandingNoShow Formstep branding on the form.
emailDomainIdNoVerified email domain ID for custom From address. Read availableEmailDomains from formSettings_get for valid IDs. null resets to default.
reminderStepsNoIdle offsets from the respondent's last activity, e.g. ["1d","3d","1w"]. Max 5, sorted and deduped on save; [] = none. Applies to abandoned public-link responses and requests.
captchaEnabledNoEnable Turnstile bot protection.
editAfterSubmitNoAllow respondents to edit a submission after sending.
passwordEnabledNoGate form with a password. Auto-set to true when `password` is provided. Setting true requires a stored password.
draftRetentionDaysNoDays to keep abandoned drafts. null reverts to runtime default.
notificationEmailsNoEmail addresses receiving submission notifications. Duplicates are collapsed case-insensitively.
notifyOnSubmissionNoEmail form owner/team on new submissions.
redirectQueryParamsNoMap form field values as query parameters on the redirect URL. Each entry maps a URL param name to a field ID.
allowAnotherResponseNoAfter submitting, loop respondents back to a fresh empty form. Mutually exclusive with a non-empty redirectUrl.
pdfGenerationEnabledNoAttach submission PDF to self-notification emails. Pro tier.
respondentReminderToNoField ID of an email-type question. Set to null to clear.
requestInvitationBodyNoCustom body for the request invitation email. Same placeholders as the subject; newlines become paragraphs. Pro tier.
requireAuthenticationNoRequire respondents to be logged in.
respondentReminderBodyNoCustom body for the reminder email. Plain text with optional {{variable}} placeholders; newlines become paragraphs.
selfNotificationSubjectNoCustom subject for self-notification emails. Plain text with optional {{variable}} placeholders.
submissionRetentionDaysNoDays to keep submissions. null = runtime default. Also clears a fixed deletion date set in the builder (the two modes are exclusive). Business plan.
requestInvitationSubjectNoSubject of the request invitation email (request_create delivery "email"). Plain text with {{variable}} placeholders; context and prefill keys resolve, submission metadata does not. Pro tier.
respondentNotificationToNoField ID of an email-type question. Respondent email is extracted from their answer to this field. Set to null to clear.
showViewSubmissionButtonNoShow "View Submission" button in self-notification emails.
respondentReminderEnabledNoEnable reminder email to respondents who started but did not complete the form. Pro tier.
respondentReminderSubjectNoCustom subject for the reminder email. Plain text with optional {{variable}} placeholders.
selfNotificationEmailBodyNoCustom body for self-notification emails. Plain text with optional {{variable}} placeholders; newlines become paragraphs.
respondentNotificationBodyNoCustom body for respondent confirmation email. Plain text with optional {{variable}} placeholders; newlines become paragraphs.
maxSubmissionsPerRespondentNoMax submissions per respondent via "Submit another response" (requires allowAnotherResponse). 0 = unlimited. Enforced for signed-in respondents, client-gated for anonymous.
respondentReminderIdleWindowNoSingle-step form of `reminderSteps`, kept for older forms. Ignored when `reminderSteps` is set.
respondentNotificationEnabledNoEnable confirmation email sent to the respondent after submission.
respondentNotificationSubjectNoCustom subject for respondent confirmation email. Plain text with optional {{variable}} placeholders.
respondentNotificationPdfEnabledNoAttach submission PDF to respondent confirmation email. Pro tier.
respondentReminderRequiredFieldIdsNoMinimum fields a respondent must have answered for the reminder to fire. Each item is a field ID from editor_getDocument. Empty array = remind any partial response.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare only readOnlyHint=false, openWorldHint=false, destructiveHint=false, so the description adds substantial behavioral context: the three gated email flows plus the switch-less request invitation, tier gating (Pro/Business), and the non-obvious side effect that customizing a respondent subject/body makes it translatable immediately with keys surfacing in translationDraft_get, while owner self-notification text is NOT translatable. It also explains null-clearing semantics for emailDomainId and password.

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?

Front-loaded with purpose and sibling routing in the first sentence, then layered by topic (email flows, localization, From domain, placeholders). For a 36-parameter tool the length is largely earned, but the placeholder enumeration and flow prose are dense and begin to duplicate what the referenced load_skill("form-settings") presumably expands.

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?

Given 36 parameters, one enum, no nested objects and no output schema, the description covers the hard parts: which settings belong to this tool, how the email flows interlock, tier limits, and clear/reset semantics. It never states what the call returns or how partial updates are echoed back, and directs some depth to a skill rather than being self-sufficient.

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 still earns above baseline by explaining cross-parameter relationships the schema states only locally (respondent *To must point at an email-input field ID found via editor_getDocument, reminder flows vs. reminderSteps, the fourth invitation flow having no enable flag because request_create decides). The {{variable}} token list and field-key vs. node-id equivalence add real invocation guidance beyond the schema.

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 ('Update form settings') and immediately scopes what the tool owns: form BEHAVIOR — email notifications, scheduling/limits, redirects. It names the sibling it is NOT for each adjacent concern (form_update for name/folder/cover/logo, formTheme_set for visual theme, editor_* for questions/content), so an agent can route without opening any schema.

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?

Explicit when-to-use and when-not-to-use: 'Only provide fields to change' establishes partial-update semantics, and three named alternatives cover the overlapping areas (identity, theme, content). It even routes the deep-dive case to load_skill("form-settings"). The only omission is prerequisites like required permissions, which is minor.

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

formSubmission_listList submissionsA
Read-only
Inspect

List submissions for a form (paginated). Read-only. Call form_list for formId first. Each item carries answers keyed by field key — a choice is its option key, a matrix { row_key: column_key }, a repeating group [{ member_key: value }] — and display, the same keys as readable text, and aiValidations by key. This is the shape request_get and every webhook or callback use; call fields_list for the keys' titles and option labels. translationLanguage optionally attaches a stored AI translation under item.translation.display (same keys); item.answers and item.display always stay the original. Only completed submissions come back by default. includeDrafts: true adds drafts (started, never sent, isCompleted false) on Pro and Business. Count completed submissions as items with isCompleted true; never report a draft as completed. Returns { formId, formName, items, nextCursor, hasMore, canPaginate } — canPaginate is true only when another page is fetchable via nextCursor.

NameRequiredDescriptionDefault
limitNoPage size (1–100, default 20).
cursorNoOpaque cursor from a prior response's `nextCursor`. Omit to start at page 1.
formIdYes
includeDraftsNo
translationLanguageNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already confirm read-only, non-destructive behavior, but the description adds substantial context: default filtering excludes drafts, draft inclusion is plan-gated, completed status must be inferred via isCompleted, and translationLanguage attaches a stored translation without altering original answers/display. No behavioral contradictions.

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

Conciseness5/5

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

The description is dense but front-loaded with purpose and dependency, then delivers return-shape and parameter nuances without wasted sentences. Length is justified by the lack of an output schema and low schema description coverage.

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

Completeness5/5

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

With no output schema, the description carries the burden of explaining return values and does so thoroughly: top-level fields, item shape (answers, display, aiValidations), translation placement, pagination flags, and draft/completed semantics. Together with annotations, it provides enough context for correct invocation and interpretation.

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 only 40%, so the description must compensate and does so for includeDrafts, translationLanguage, and the formId prerequisite. limit and cursor semantics are already covered by the schema, so the remaining gap is minor.

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+resource and scope: list submissions for a form, paginated, read-only. It also names dependencies (form_list for formId first) and distinguishes related tools (fields_list for label metadata), so an agent can select it confidently.

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 covers prerequisites ('Call form_list for formId first'), follow-up metadata retrieval ('call fields_list'), default behavior (only completed submissions), and the condition for including drafts (includeDrafts: true, Pro/Business only). It also warns never to count a draft as completed.

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

formTheme_getGet form themeA
Read-only
Inspect

Get the theme for one color mode of a form. Returns theme (the form's custom theme or null when none set), defaultTheme (neutral baseline matching the schema; for a first apply, call formTheme_set with merge:false and supply all 7 sections (foundation, input, choice, rating, button, question, feedback); for subsequent tweaks, use merge:true to patch only changed fields), and hasTheme (whether a custom theme exists).

NameRequiredDescriptionDefault
modeYesColor-mode theme to operate on. Light and dark themes are stored independently.
formIdYesThe form ID

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, non-destructive), but the description adds real behavioral detail: theme is null when unset, defaultTheme is a schema-matching neutral baseline, and hasTheme signals existence. The 7-section / merge guidance is useful context even if it targets the sibling.

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 is front-loaded in the first sentence, but the long parenthetical explaining merge:false versus merge:true and the 7 sections belongs to formTheme_set and consumes most of the text without serving this getter's invocation.

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?

With no output schema present, the description usefully enumerates the returned fields (theme, defaultTheme, hasTheme) and their semantics. Combined with annotations covering safety, an agent has enough to call it correctly.

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

Parameters3/5

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

Schema coverage is 100%, so formId and the mode enum are already fully documented. The description's 'one color mode' phrasing adds nothing beyond the schema, so the baseline 3 is appropriate.

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 opening sentence states a specific verb and resource: 'Get the theme for one color mode of a form,' which an agent can act on immediately. It distinguishes itself from the setter by naming formTheme_set, though the differentiation is embedded in return-value discussion rather than framed as a purpose contrast.

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

Usage Guidelines3/5

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

There is no explicit statement of when to call formTheme_get itself or its prerequisites. The merge:false vs merge:true guidance is aimed at formTheme_set, so usage guidance for this tool is only implied through the read-then-set workflow.

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

formTheme_setSet form themeAInspect

Set, patch, or reset a form's theme for one color mode. Light and dark themes are stored independently — call twice for full coverage. Use load_skill("form-themes") for the preset catalog, full schema, and design guidelines.

Prefer a built-in preset over hand-building hex — pass preset and skip theme. Presets work on every plan; a custom theme needs the Pro plan:

  • preset: "<id>" → apply a named preset (e.g. "dracula"). The preset's mode must match mode; mismatches are rejected with the valid ids. See load_skill("form-themes") for the catalog.

Otherwise supply theme directly (omit preset):

  • theme: null → reset (merge ignored).

  • theme: <partial> + merge: true (default) → patch existing theme; omitted sections/fields preserved.

  • theme: <full 7-section object> + merge: false → replace entirely.

Pass exactly one of preset or theme. Sections: foundation (page bg/text/font/radius), input, choice (normal + selected), rating, button, question (title/desc/asterisk), feedback (error). Colors hex (#rrggbb).

NameRequiredDescriptionDefault
modeYesColor-mode theme to operate on. Light and dark themes are stored independently.
mergeNoWhen true (default), `theme` is treated as a patch over the existing theme. When false, `theme` replaces entirely and must contain all 7 sections. Ignored when `theme` is null (reset) or when `preset` is used.
themeNoFull theme object (for replace) OR partial (for patch). Pass `null` to reset to default. Sizes are pixels. Use load_skill("form-themes") for design guidelines.
formIdYesThe form ID
presetNoBuilt-in preset id for this mode (e.g. "dracula"). Mutually exclusive with `theme`.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (which only say non-readOnly, non-destructive), the description discloses plan gating (presets on every plan, custom theme needs Pro), that light/dark themes are stored independently, that preset/mode mismatches are rejected with valid ids, and that omitted fields are preserved on merge. This is substantial behavioral context the annotations do not carry.

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 opening sentence is well front-loaded and the bullet structure maps cleanly to the three invocation modes. There is mild redundancy in repeating the load_skill("form-themes") pointer twice, and the section list is a long trailing sentence, but overall it is dense rather than padded.

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 5-parameter mutation tool with no output schema and deep nested objects, the description covers the decision space thoroughly and defers the preset catalog to load_skill. The only gap is that it never says what the tool returns or how success/failure is reported.

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 baseline is 3, but the description adds real semantics: mutual exclusivity of preset and theme, mode-matching for presets, reset semantics of theme:null, and the seven section names (foundation, input, choice, rating, button, question, feedback) with their purpose. It stops short of explaining every leaf field, but the schema already covers those.

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?

The description states specific verbs (set, patch, reset) applied to a named resource (a form's theme) and immediately scopes it to one color mode. An agent can distinguish it from the formTheme_get sibling without opening any schema.

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?

It gives explicit when-to-use guidance: prefer preset over hand-built hex, custom theme requires Pro, call twice for light+dark coverage, pass exactly one of preset/theme. It also explains the three theme invocation shapes (null reset, partial patch, full replace), leaving nothing to inference.

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

form_unpublishUnpublish formA
Destructive
Inspect

Unpublish a form so respondents can no longer access it. Reversible via form_publish.

NameRequiredDescriptionDefault
formIdYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds the real behavioral payload: the effect on respondents and, importantly, that the action is reversible via form_publish, which meaningfully tempers the destructive hint and tells the agent rollback exists.

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

Conciseness5/5

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

Two short sentences, effect stated first, reversibility second. No filler and nothing buried.

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 single-parameter state-change tool with no output schema, the description covers effect, audience impact and rollback path. It stops short of stating what identifier is needed or whether authorization/ownership is required, but the core decision inputs are present.

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

Parameters2/5

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

One parameter (formId) with 0% schema description coverage and no explanation in the description of what formId is or where it comes from. The parameter is guessable from the name, but the description contributes nothing beyond the schema here.

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?

Specific verb ('Unpublish') plus resource ('a form') plus the observable effect ('respondents can no longer access it'). It also names the inverse sibling form_publish, so an agent can place it precisely in the publish/unpublish pair.

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

Usage Guidelines3/5

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

The description implies the use case (take a form offline) and points at form_publish for the reverse operation, but never states when to choose this over adjacent tools like form_delete or form_restore. Usage is inferable rather than explicit.

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

form_updateUpdate formAInspect

Update form metadata or appearance. Does not update form content (use editor tools). null clears folderId/emoji. cover and logo are OBJECTS keyed by a discriminated type — never a bare string. cover = {type:"image",url,offsetY?} | {type:"color",color} | {type:"none"}; logo = {type:"icon",name} | {type:"image",url} | {type:"none"}. Set an image only from a durable http(s) or data:image URL the user explicitly provided. AI chat file-attachment proxy URLs are temporary and must never be stored in form fields. Examples: cover:{type:"image",url:"https://…",offsetY:50}; cover:{type:"color",color:"#0ea5e9"}; logo:{type:"none"}.

NameRequiredDescriptionDefault
logoNoSet or remove the form logo. Discriminated by `type`: type=icon requires name; type=image requires url; type=none takes no other fields. For type=image, never invent or guess a URL — use a URL the user provided or an uploaded image; if you have neither, ask the user instead.
nameNo
coverNoSet or remove the form cover. Discriminated by `type`: type=color requires color; type=image requires url; type=none takes no other fields. For type=image, never invent or guess a URL (no stock, placeholder, or Unsplash links) — use a URL the user provided or an uploaded image; if you have neither, ask the user instead.
emojiNo
formIdYes
folderIdNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only declare the generic readOnly/destructive/openWorld profile; the description adds substantive behavior beyond that — 'null clears folderId/emoji', the discriminated-union shape of cover/logo, and a hard policy against storing ephemeral chat-proxy URLs. It stops short of stating permission requirements or the response shape, but that gap is modest for a non-destructive update.

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?

Front-loaded with the core action and the content exclusion in the first sentence, then progressively details complex parameters. It is somewhat long and partially duplicates the schema's own `examples` for cover/logo, but every sentence still carries operative information.

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 six-parameter mutation tool with nested discriminated objects and no output schema, the description covers what is mutated, what is explicitly out of scope, and how to construct the tricky fields. Return values and permission prerequisites are unstated, which keeps it short of fully complete.

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 low (33%), so the description must carry the load, and it does: it spells out the cover/logo union arms, null-clearing semantics, and worked examples for each variant. The one gap is the `name` and `emoji` parameters, which get no semantic treatment beyond what the schema's type constraints imply.

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+resource (update form metadata or appearance) and immediately scopes out form content, naming the sibling family to use instead ('use editor tools'). An agent can distinguish this from editor_updateElement or editor_insert* tools without opening a schema.

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?

Gives an explicit when-not-to-use rule (content edits belong to editor tools) plus a URL-provenance policy, which is real routing guidance. It does not, however, differentiate against close metadata/appearance siblings such as formTheme_set or formSettings_update, so the agent must infer the boundary with those.

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

formWebhook_createCreate webhookAInspect

Create the webhook integration of a form: every submission is POSTed to url as JSON, answers keyed by field key (fields_list), signed with the returned signingSecret (HMAC-SHA256 in X-Formstep-Signature). Public https only; one webhook per form (use formWebhook_update to change it). Returns the webhook including signingSecret, shown only here. Verify delivery with formWebhook_test.

NameRequiredDescriptionDefault
urlYesPublic https endpoint that receives one POST per submission.
formIdYes
headersNoExtra request headers, e.g. { "Authorization": "Bearer …" }. Replaces the stored set; {} clears it.
includeSchemaNoAlso send the form schema (field keys, types, labels) in every event.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare that this is a non-read-only, non-destructive, closed-world write. The description adds substantial behavioral detail beyond that: payload shape (answers keyed by field key), the HMAC-SHA256 signing scheme and header name, the https-only constraint, the one-webhook-per-form limit, and the fact that signingSecret is returned only on this call. That is exactly the kind of context annotations cannot carry.

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

Conciseness5/5

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

A single dense sentence set that front-loads what gets created and the delivery contract, then tacks on the constraint, the uniqueness rule with its alternative, the return value, and the test path. No filler.

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

Completeness5/5

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

There is no output schema, so the description correctly compensates by naming what is returned (the webhook, including signingSecret) and warning that the secret is shown only here. Combined with the delivery, signing and uniqueness details, an agent has everything needed to call it correctly.

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

Parameters3/5

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

Schema description coverage is 75%, so the schema already documents url, headers and includeSchema. The description reinforces the public-https constraint on url and notes that answers are keyed by field key (relating to fields_list), but says nothing about the headers or includeSchema parameters, so it adds only marginal meaning beyond the schema.

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 — 'Create the webhook integration of a form' — and immediately describes the resulting behavior (submissions POSTed as JSON). It is clearly distinguishable from the sibling formWebhook_update, formWebhook_test and formWebhook_list tools.

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 routes to alternatives: 'one webhook per form (use formWebhook_update to change it)' and 'Verify delivery with formWebhook_test.' It also states the creation precondition that the endpoint must be public https, which is exactly the condition an agent needs before invoking.

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

formWebhook_deleteDelete webhookA
Destructive
Inspect

Delete a form webhook and its event log. Permanent: future submissions are no longer sent to its url and the signing secret is gone. To stop delivery temporarily use formWebhook_update({ enabled: false }).

NameRequiredDescriptionDefault
webhookIdYesWebhook ID from formWebhook_list or formWebhook_create.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description goes further and enumerates the actual consequences beyond that flag: the event log is destroyed, future submissions stop being delivered to the url, and the signing secret is irrecoverably gone. That is exactly the extra context an agent needs before a destructive call.

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

Conciseness5/5

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

Three sentences, front-loaded with what is deleted, then the permanence consequence, then the escape hatch to the non-destructive alternative. No filler; every clause carries decision-relevant information.

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

Completeness5/5

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

For a single-parameter destructive tool with no output schema, the description supplies the irreversibility, the side effects on delivery and the signing secret, and the safer alternative. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

The description never mentions the webhookId parameter or its expected source, but schema coverage is 100% and the schema already documents it ('Webhook ID from formWebhook_list or formWebhook_create'). With only one fully-documented parameter, the baseline 3 applies.

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 plus resource ('Delete a form webhook') and immediately scopes it ('and its event log'). This clearly separates it from the sibling webhook tools (create/list/update/test) without needing the schema.

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 routes the agent to the alternative: 'To stop delivery temporarily use formWebhook_update({ enabled: false }).' This is a concrete when-to-use-this vs when-to-use-something-else rule, including the exact sibling call and parameter.

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

formWebhook_listList webhooksA
Read-only
Inspect

List the webhook integrations of a form: url, hasSigningSecret, headerNames, status and delivery counts. Read-only; never returns the secret or header values. A form has at most one; create it with formWebhook_create. Returns { items, nextCursor, hasMore, canPaginate }.

NameRequiredDescriptionDefault
formIdYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, destructiveHint=false, openWorldHint=false), but the description adds meaningful behavior beyond them: it discloses data redaction ("never returns the secret or header values") and the pagination envelope. This is exactly the kind of context annotations cannot express.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the purpose, then the read-only/redaction guarantee, then the creation alternative and return shape. No filler.

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

Completeness5/5

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

No output schema exists, yet the description supplies the return envelope ({ items, nextCursor, hasMore, canPaginate }), the redaction guarantee, and the one-per-form cardinality. An agent has everything needed to call and interpret this tool.

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

Parameters3/5

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

Schema description coverage is 0% and the sole parameter formId is undocumented in the schema; the description only implicitly covers it via "of a form". Since formId is self-explanatory and there is only one parameter, this is adequate but adds little meaning beyond the schema.

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 (List) plus resource (webhook integrations of a form) and even enumerates the returned fields (url, hasSigningSecret, headerNames, status, delivery counts). This clearly distinguishes it from the sibling mutation tools formWebhook_create/update/delete/test.

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?

"A form has at most one; create it with formWebhook_create" gives the cardinality constraint and names the sibling responsible for creation, which prevents an agent from misusing this list tool to create or from expecting multiple results. It stops short of explicit when-not-to-use guidance (e.g., preferring formWebhook_test for verification).

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

formWebhook_testTest webhookAInspect

Send an example submission event to a form webhook, signed and with its headers, and record the attempt in its event log. Nothing is stored as a submission. Returns { delivered, errorCategory?, errorMessage? }.

NameRequiredDescriptionDefault
webhookIdYesWebhook ID from formWebhook_list or formWebhook_create.

TDQS

A4.1/5.0
Behavior4/5

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

Beyond the annotations (which only give the safety profile: not read-only, not destructive), the description discloses meaningful behavior: the request is 'signed and with its headers', the attempt is written to the event log, and critically that nothing is persisted as a submission. It stops short of noting auth/permission requirements or retry behavior.

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

Conciseness5/5

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

Two tight sentences: purpose and side-effect semantics first, then the return shape. No filler, and the most decision-relevant fact ('Nothing is stored as a submission') is front-loaded.

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

Completeness5/5

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

For a single-parameter tool with no output schema, the description covers purpose, side effects, the non-effect (no stored submission), and the returned shape including optional error fields. An agent has everything needed to call it and interpret the result.

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

Parameters3/5

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

Schema coverage is 100% and the single webhookId parameter is fully documented in the schema (including where to source it), so the schema carries the load. The description adds no additional parameter meaning beyond what the schema already provides, matching the baseline 3.

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?

The description states a specific verb and resource ('Send an example submission event to a form webhook') and its scope, and the 'example submission'/'Nothing is stored as a submission' framing clearly separates it from real submission handling. An agent can distinguish it from the formWebhook_create/update/delete siblings without opening any schema.

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

Usage Guidelines3/5

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

Usage is implied by the 'test' framing but never stated explicitly — there is no 'use this to verify a webhook is wired up correctly' guidance, nor any when-not condition or named alternative. The only routing help is indirect, via the webhookId schema pointing at formWebhook_list/create for obtaining IDs.

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

formWebhook_updateUpdate webhookAInspect

Update a form webhook (provide at least one field): url, headers, includeSchema, or enabled to pause/resume delivery. The signing secret never changes; delete and create again to rotate it. Returns the updated webhook.

NameRequiredDescriptionDefault
urlNoPublic https endpoint that receives one POST per submission.
enabledNofalse pauses delivery (events are skipped, not queued); true resumes.
headersNoExtra request headers, e.g. { "Authorization": "Bearer …" }. Replaces the stored set; {} clears it.
webhookIdYesWebhook ID from formWebhook_list or formWebhook_create.
includeSchemaNoAlso send the form schema (field keys, types, labels) in every event.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only establish readOnly=false, destructive=false, openWorld=false; the description adds genuinely new behavior: the update is partial (at least one field), the signing secret is immutable and rotation requires delete+create, and the enabled flag pauses rather than queues events. It does not cover failure modes (invalid URL, unknown webhookId), so it is not exhaustive.

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

Conciseness5/5

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

Three compact sentences, front-loaded with the required-field rule, then the immutability caveat, then the return value. Every clause carries information; nothing is padding.

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?

With no output schema, the description sensibly states 'Returns the updated webhook,' and partial-update semantics plus secret immutability are covered. For a mutation tool with a nested headers object, it could say more about validation or error behavior, but nothing essential to invoking it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters — including the required webhookId with its provenance ('from formWebhook_list or formWebhook_create') and the replace-not-merge semantics of headers — are already documented in the schema. The description merely lists field names and adds no syntax or constraint beyond what the schema states, matching the baseline 3.

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?

Names a specific verb and resource ('Update a form webhook') and immediately enumerates the mutable surface (url, headers, includeSchema, enabled), which cleanly separates it from formWebhook_create, formWebhook_delete, formWebhook_list, and formWebhook_test. An agent can identify the tool's role without opening the schema.

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?

Gives a real usage constraint ('provide at least one field') and names the correct alternative workflow for a related task ('The signing secret never changes; delete and create again to rotate it'), routing to formWebhook_delete plus formWebhook_create. It lacks explicit when-not-to-use guidance (e.g. use create instead when the webhook does not yet exist), 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.

load_skillLoad skillA
Read-only
Inspect

Load a domain-knowledge skill — themes, settings, analytics, logic-rules, editing-flows, question-types, etc. Returns markdown reference content. Use when the task touches a domain whose conventions or constraints are not obvious from the surrounding tools. For loading additional MCP tool catalogs (deferred tools by bundle name) use load_tools instead.

Available skills:

  • toon-format: TOON format reference for reading and parsing form document structure

  • question-types: All question types with parameters, validation, and when to use each

  • logic-rules: Conditional logic conditions, actions, patterns, and examples

  • editing-flows: Editing workflows, node chaining, batch operations, and best practices

  • form-best-practices: Form design best practices for question design, ordering, and type selection.

  • analytics: Form analytics interpretation, metrics, and actionable insights

  • form-settings: Form configuration options, security, notifications, email customization, and data retention

  • form-themes: Form visual theming system — schema, constraints, design guidelines, and examples

  • requests: Requests: asking named people to fill a form — field keys, prefill shapes, building the form in the same call, delivery, callbacks, polling

NameRequiredDescriptionDefault
nameYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is known. The description adds the return shape — 'Returns markdown reference content' — which is genuinely useful since there is no output schema. It stops short of noting size limits or whether content is cached/fresh, so not 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.

Conciseness4/5

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

Front-loads purpose, then routing guidance, then the skill catalog. The enumeration is long but each bullet earns its place by describing a distinct skill, which is necessary given 0% schema coverage. Slightly verbose but no filler sentences.

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

Completeness5/5

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

For a one-parameter, annotation-covered read tool, everything an agent needs is present: what it returns, when to call it, when not to, and a full annotated enum. No output schema exists, but the description states the return type, so nothing material is missing.

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

Parameters5/5

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

Schema description coverage is 0% and the only parameter is a 9-value enum, so the description carries the full burden — and it does: every enum value is listed with a one-line explanation of what that skill contains. This adds meaning the bare enum in the schema cannot.

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 (load) and resource (domain-knowledge skill) and explicitly enumerates the skill domains covered. It also names the sibling it is not — load_tools for MCP tool catalogs — so an agent can route between them without opening either schema.

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?

Gives an explicit trigger ('use when the task touches a domain whose conventions or constraints are not obvious from the surrounding tools') and an explicit alternative with its own condition ('for loading additional MCP tool catalogs use load_tools instead'). Both when-to-use and when-to-use-something-else are covered.

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

load_toolsLoad toolsA
Read-only
Inspect

Load a tool catalog: returns its intro text, usage patterns, and each tool's full JSON input schema as markdown. On surfaces that scope active tools by context this also activates the catalog's tools (elsewhere they are already callable and this just adds the enriched context — workflows, field semantics, constraints — beyond the bare schema). Prefer loading the relevant catalog before using a capability over guessing a tool name or argument shape. For domain knowledge (themes, settings, logic semantics) use load_skill instead.

Available catalogs:

  • form-data: Aggregate form analytics (views, completions, drop-off). Individual submission rows: formSubmission_list.

  • form-appearance: Visual styling: per-mode themes (light + dark). Cover/logo via form_update.

  • form-behavior: Behavior settings: notification emails, completion redirect, password, retention, language, payment, webhook.

  • form-sharing: Share-link CRUD + custom-domain attach/detach. Required after form_publish for respondent URL.

  • form-translations: Multilingual draft → publish workflow for form copy.

  • form-lifecycle: Form lifecycle ops beyond publish: unpublish, restore-from-trash.

  • workspace-management: Workspace inspect + folder CRUD beyond core list verbs.

  • request-lifecycle: Requests: discover field keys, create (with an existing form or one built in the call), read, list, cancel, remind, replay the callback, upload a document, check Stripe and Cal.com connections.

  • editor-actions: Editor actions beyond getDocument/updateElement/deleteElement: format text, set logic, simulate logic.

  • editor-inserts: Less-common element inserts beyond the core set: time/switch/file/signature/matrix/ranking/payment/schedule-appointment/picture-choice questions, embedded/table/list content, row/repeating-group layout, calculated/hidden fields, AI Validation, logic + variable.

NameRequiredDescriptionDefault
catalogYes

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the readOnly/destructive/openWorld annotations by disclosing a side effect the annotations do not capture: on context-scoped surfaces loading a catalog activates that catalog's tools, while elsewhere they are already callable and loading merely adds enriched context. It also discloses the shape of the return value (markdown schemas plus usage patterns), which matters since there is no output schema.

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 first sentence front-loads the return value and the catalog list is high-value routing content where each bullet earns its place. The mid-description parenthetical about context-scoped activation and "enriched context — workflows, field semantics, constraints" is dense and could be split or tightened. Overall appropriately sized for a router tool, with only that clause as dead weight.

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

Completeness5/5

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

Given a one-param router with no output schema and no parameter descriptions in the schema, the description supplies everything needed: return shape, activation side effect, when to call it, when to call `load_skill` instead, and per-value semantics for all ten catalogs. Nothing an agent needs in order to invoke it correctly is missing.

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

Parameters5/5

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

Schema coverage is 0%, so the description carries the full burden — and it does: each of the ten enum values is documented with its scope and what it unlocks (e.g. form-sharing as "Share-link CRUD + custom-domain attach/detach", form-behavior listing the concrete settings covered). This is meaningfully richer than the bare enum of strings and lets the agent choose a catalog without trial and error.

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 ("Load a tool catalog") and immediately enumerates the payload it returns: intro text, usage patterns, and each tool's full JSON input schema as markdown. It also distinguishes itself from the nearest sibling by naming `load_skill` and assigning that tool a different scope (domain knowledge). An agent can tell exactly what this tool yields without opening the schema.

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?

Gives an explicit directive — "Prefer loading the relevant catalog before using a capability over guessing a tool name or argument shape" — which is precisely the when-to-use condition. It also names the alternative and the dividing line: domain knowledge (themes, settings, logic semantics) belongs to `load_skill` instead. The catalog list further routes the agent to the right value for each capability area.

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

paymentConnection_setDefaultSet payment connection defaultAInspect

Make one of the workspace's Stripe connections the default every payment charges through unless it names another. Workspace owner only. Returns { connection }.

NameRequiredDescriptionDefault
connectionYesStripe connection id from workspaceConnection_list.
workspaceIdYesFrom workspace_list.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare the non-destructive write profile. The description goes beyond them by disclosing the auth requirement (owner only), the semantic consequence of the mutation (default routing for all payments unless overridden), and the return shape ({ connection }). It does not cover reversibility or idempotency of repeated calls.

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

Conciseness5/5

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

Three short sentences, front-loaded with the effect, then the permission gate, then the return. No filler or restatement of the title.

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 two-parameter mutation with full schema coverage, the description covers effect, authorization, and return value. The only gap is that no output schema exists and the '{ connection }' return is stated without describing what fields it contains.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already documented, including provenance hints (connection id from workspaceConnection_list, workspaceId from workspace_list). The description adds no syntax or constraint detail beyond the schema, so the baseline 3 applies.

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 (make default) and resource (Stripe payment connection) plus the exact business effect: charges route through it unless another is named. This is clearly distinguishable from siblings like workspaceConnection_list, which only enumerates connections.

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?

Gives the key authorization prerequisite ('Workspace owner only'), which tells the agent when the call is viable. It does not name an alternative tool or an exclusion condition, but the sibling set offers no competing 'set default' operation, so the context is sufficient without being exhaustive.

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

request_cancelCancel requestA
Destructive
Inspect

Cancel a pending request: its link stops working immediately and a request.canceled callback fires if one was configured. Permanent — a canceled request never reopens; ask again with request_create. Only pending requests can be canceled. Returns the request plus next.

NameRequiredDescriptionDefault
reasonNoWhy it was withdrawn. Stored on the request and echoed in the request.canceled callback.
requestIdYesRequest ID, copied from a request_create or request_list response.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, but the description goes well beyond them: it discloses the immediate side effect on the link, the conditional callback firing, and the irreversibility ('never reopens'). For a mutation tool this is exactly the extra context an agent needs before committing.

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

Conciseness5/5

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

Three dense sentences, front-loaded with the effect and consequence, then permanence, then precondition and return. No filler and nothing that restates the name.

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

Completeness5/5

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

With no output schema, the description still tells the agent what comes back (the request plus `next`), and it covers side effects, irreversibility, and preconditions. Nothing material for correct invocation is absent.

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

Parameters3/5

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

Schema coverage is 100% with only two parameters, both fully documented in the schema, so the description legitimately cedes that ground. It adds only a return-value note ('Returns the request plus `next`') rather than parameter syntax, which matches the baseline 3 when the schema does the heavy lifting.

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 (cancel) and resource (pending request) and immediately specifies the observable consequence: the link stops working and a request.canceled callback fires. This is far more precise than the bare name/title and clearly distinguishes it from request_create/request_remind in the sibling set.

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?

Gives an explicit precondition ('Only pending requests can be canceled') and routes the agent to a follow-up alternative ('ask again with request_create'). What is missing is guidance on the sibling tools for non-pending requests (request_get/request_list) and any note that a reason is optional.

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

request_createCreate requestAInspect

Create a request: one assignment of a published form to one named recipient, with its own link, prefilled answers, expiry and optional callback. Use it when you need answers from a specific person and want to know whether they answered; for a link anyone may fill, use formShareLink_create. Call fields_list(formId) first — prefill/context/readonly take field keys. Or pass form to build the form in the same call (keys come from your blocks). Returns { id, status, url, deliveryStatus, expiresAt, form?, next }. Track with request_get, withdraw with request_cancel. See load_skill("requests").

NameRequiredDescriptionDefault
formNoBuild the form in this call instead of formId. The same form again reuses the first one.
testNoDry run. No invitation or reminder email whatever delivery says; the link still opens and can be completed; the callback fires with "test": true; the request is hidden from the Requests page and analytics by default and its submission counts nowhere (no quota, no exports, no integrations).
formIdNoPublished form to send. Call fields_list(formId) first for its keys. Or pass form instead.
contextNoValues for HIDDEN fields, keyed by field key: { "crm_id": "A-42" }. Only hidden-field keys (fields_list context: true); use metadata for others. Recipient cannot edit them, but sees mentioned ones.
prefillNoStarting answers for visible questions, keyed by field key. Shapes: string, number, "2026-03-01", "09:30", option KEY not label (see fields_list options), string[] of option keys (checkbox/ranking/picture-choice), { "row_key": "column_key" } (matrix), [{ "member_key": value }] (repeating group).
deliveryNo"none" (default) returns the link for you to deliver; "email" sends the invitation (needs recipient.email; Pro+, or one of Free's 10 free invitations, which go only to your own address).
domainIdNoMint the link on this custom domain; formShareLink_list returns the ids as availableCustomDomains.
languageNoPublished language tag the form opens in and the invitation is written in, e.g. "fr". Omit for the form default. The recipient can switch to any published language.
metadataNoOpaque JSON echoed on request_get and in the callback.
readonlyNoField keys the recipient may not edit. Each must also be in prefill.
documentsNoFiles for this one recipient, added below the block’s authored documents. See document_create.
expiresAtNoEpoch ms when the link dies. Default 30 days, max 365.
recipientNoWho this is for, e.g. { "email": "ada@acme.com", "name": "Ada" }.
remindersNoIdle-time offsets, e.g. ["2d","5d"] (max 5, units m/h/d, at least 1h). Omit to inherit the form schedule, [] for none. Needs recipient.email (Pro+).
externalIdNoYour own id; request_list filters on it.
callbackUrlNoPublic https endpoint POSTed on completion, expiry and cancellation, signed with X-Formstep-Signature. Private and loopback addresses are refused.
workspaceIdNoWorkspace for form. Defaults to the token workspace.
idempotencyKeyNoRetry-safe key, workspace-scoped for 30 days. Same key + same body returns the original request; a different body is a conflict.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare a non-destructive write (readOnlyHint=false, destructiveHint=false, openWorldHint=false), and the description adds real behavioral context beyond that: the cross-parameter constraint that prefill/context/readonly are keyed by field keys, the return shape, and the inline 'form' path whose keys come from one's own blocks. Much of the deepest behavior (test dry-run effects, quota-limited email delivery, callback signing) lives in the schema rather than the description, so it stops short of 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.

Conciseness5/5

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

Five sentences, each earning its place and ordered by importance: what it is, when to use it vs the alternative, the prerequisite, the return shape, then lifecycle tools. The defining scope is front-loaded before the routing guidance.

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

Completeness5/5

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

For an 18-parameter tool with nested objects and no output schema, the description covers the missing return contract ('Returns { id, status, url, deliveryStatus, expiresAt, form?, next }'), the prerequisite, the sibling alternative, and follow-up lifecycle tools. An agent has everything needed to select and invoke it correctly.

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 baseline is 3. The description adds cross-parameter semantics the schema does not: that prefill/context/readonly all take field keys obtained via fields_list(formId), and that the inline 'form' alternative derives its keys from your own blocks. That relationship is genuinely useful, though most individual field meaning is still schema-carried.

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?

The opening sentence gives a precise verb, resource and scope: 'one assignment of a published form to one named recipient, with its own link, prefilled answers, expiry and optional callback.' It explicitly distinguishes itself from formShareLink_create by contrasting the named-recipient/tracked-answer case against the open-link case, so an agent can route without opening either schema.

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?

It states when to use it ('when you need answers from a specific person and want to know whether they answered'), names the alternative and its selecting condition ('for a link anyone may fill, use formShareLink_create'), and gives a prerequisite ('Call fields_list(formId) first'). It also names the follow-up tools (request_get, request_cancel) and a skill pointer, leaving nothing to inference.

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

request_getGet requestA
Read-only
Inspect

Get one request: status, recipient, prefill/context, its link, the derived timeline, and — once completed — answers keyed by field key plus display in readable text (a signature answer is shortened to a marker; a file answer carries its download url). Read-only. Returns the request plus next, which says whether to keep polling or read the answers. Find ids with request_list.

NameRequiredDescriptionDefault
requestIdYesRequest ID, copied from a request_create or request_list response.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only declare the safety profile (readOnly, non-destructive, non-open-world). The description goes well beyond that, disclosing return-shape quirks: answers keyed by field key, `display` in readable text, signature answers truncated to a marker, file answers carrying a download `url`, and the `next` polling signal. This is exactly the extra context annotations cannot supply.

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?

Front-loads the core purpose and return contents, then tacks on the read-only note and the id-lookup pointer. Dense but every clause carries information; only the mid-sentence em-dash parentheticals make it slightly awkward to scan.

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

Completeness5/5

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

With no output schema, the description carries the full burden of describing returns and does so thoroughly, including the `next` control field and the special cases for signature and file answers. An agent has everything needed to call and consume this correctly.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter is fully described in the schema ('Request ID, copied from a request_create or request_list response'). The description only reiterates id discovery via request_list, so it adds little beyond the schema — the baseline 3 applies.

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+resource ('Get one request') and enumerates exactly what is returned — status, recipient, prefill/context, link, timeline, answers, display. It explicitly routes the agent to request_list for id lookup, distinguishing it from its closest sibling.

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?

Gives clear context: read-only, use request_list to find ids, and consume the `next` field to decide whether to keep polling or read answers. It stops short of stating when NOT to use it or naming all alternatives, but the operating conditions are well specified.

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

request_listList requestsA
Read-only
Inspect

List requests for one form or a whole workspace, newest first, optionally filtered by status, outcome or externalId; test requests only with includeTest. Read-only. Returns compact rows plus { nextCursor, hasMore, canPaginate } — prefill, context, metadata, answers and the timeline come from request_get. Pass either formId or workspaceId.

NameRequiredDescriptionDefault
limitNoPage size (1–100, default 25).
cursorNoOpaque cursor from a prior response's `nextCursor`. Omit to start at page 1.
formIdNoScope to one form. Pass this or workspaceId.
statusNoOnly requests in this state.
outcomeNoOnly completed requests with this verdict.
externalIdNoYour own id, as passed to request_create. Combines with status and outcome.
includeTestNoAlso return requests created with test: true (hidden by default).
workspaceIdNoScope to a whole workspace (workspace_list returns the ids). Pass this or formId.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and destructiveHint=false, and the description's 'Read-only' is consistent with them. It goes further by describing the compact row payload plus { nextCursor, hasMore, canPaginate } and the default hiding of test requests, which are behaviors not covered by the 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?

A single dense but front-loaded clause chain: scope and ordering first, then filters, then return shape, then the alternative tool. Every clause carries information, though the semicolon-heavy packing makes it slightly harder to scan than a two-sentence split would.

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

Completeness5/5

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

With no output schema, the description usefully discloses the return envelope (compact rows plus nextCursor/hasMore/canPaginate) and points to request_get for full detail. Combined with 100% schema coverage, an agent has everything needed to call this correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents filters, enums, limits, and the 'pass this or formId' rules. The description restates filtering (status, outcome, externalId) and the includeTest behavior but adds no syntax or format detail beyond the schema. Baseline 3 applies.

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 ('List requests') plus the scoping options ('one form or a whole workspace'), the sort order ('newest first'), and what it deliberately omits. It also distinguishes itself from siblings by routing detail-seeking callers to request_get.

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?

Gives clear selection context: pass either formId or workspaceId, use includeTest to surface test requests, and use request_get when prefill/context/metadata/answers/timeline are needed. No explicit when-not guidance beyond that, but the alternative is named.

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

request_remindRemind requestAInspect

Send a reminder email to the recipient of a pending request now, outside its schedule. Needs recipient.email and Pro+. Capped at 8 reminders per request and one manual send per 10 minutes. Returns the request plus next.

NameRequiredDescriptionDefault
requestIdYesRequest ID, copied from a request_create or request_list response.

TDQS

A4.3/5.0
Behavior5/5

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

Adds substantial context beyond the annotations: auth requirements (recipient.email and Pro+), rate limits (8 per request, one manual send per 10 minutes), and the return shape. Annotations only cover the safety profile, so this fills the real behavioral gaps.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the action, then prerequisites, then limits and return. Every sentence earns its place with no redundancy.

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

Completeness5/5

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

Though there is no output schema, the description notes the return ('the request plus `next`'), and constraints and prerequisites are all stated. An agent has everything needed to invoke it correctly and anticipate failures.

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

Parameters3/5

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

Schema coverage is 100% and requestId is fully documented there, so the description need not re-explain it. The mention of 'recipient.email' adds an implicit dependency but is a prerequisite rather than param syntax, so baseline 3 holds.

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?

States a specific verb (send a reminder email) and resource (the recipient of a pending request) with a clear scope modifier ('now, outside its schedule'). This distinguishes it functionally from request_replayCallback and request_cancel, though it never names a sibling explicitly.

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?

The phrase 'outside its schedule' tells the agent when this tool applies versus waiting for a scheduled reminder, and the constraints imply a manual override use case. No alternative tool is named, but the triggering condition is clear.

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

request_replayCallbackReplay request callbackAInspect

Re-queue the terminal callback of a finished request — the escape hatch for a receiver that was down past the retry budget. Terminal requests only (completed, expired, canceled) and only when callbackUrl was set. Returns { dispatchId, eventId, next }; the replay carries the ORIGINAL event id, so the receiver must dedupe on it.

NameRequiredDescriptionDefault
requestIdYesRequest ID, copied from a request_create or request_list response.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare this is not read-only, not destructive, and closed-world; the description adds materially more — it discloses the return shape ({ dispatchId, eventId, next }) and the critical semantic that the replay carries the ORIGINAL event id, requiring receiver-side dedupe. It omits auth requirements and idempotency/rate-limit nuance, so not 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.

Conciseness5/5

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

Two tight sentences that front-load the action and the constraint, then the return contract. Every clause earns its place; nothing is redundant with the title or schema.

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

Completeness5/5

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

For a one-parameter, non-destructive mutation with no output schema, the description supplies the preconditions, the return payload shape, and the dedupe hazard the caller must handle. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter is fully documented in the schema, so the baseline is 3. The description's only added constraint on requestId validity ('terminal requests only') is already credited under usage, leaving little new parameter-level meaning.

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: 'Re-queue the terminal callback of a finished request', with the reason ('the escape hatch for a receiver that was down past the retry budget'). This is clearly distinguishable from siblings like request_cancel, request_remind, request_create, and request_get without opening any schema.

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?

Gives explicit preconditions and exclusions: terminal requests only (completed, expired, canceled) and only when callbackUrl was set. It does not name alternative tools for the non-terminal case (e.g., request_remind or request_cancel), so it falls just short of a full when/when-not/alternatives treatment.

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

scheduler_listEventTypesList Cal.com event typesA
Read-only
Inspect

List the Cal.com event types a booking block can name. Returns { connection: { id, name }, items: [{ id, title, durationMinutes?, bookable, reasons? }] }. Only bookable ones work in a form.

NameRequiredDescriptionDefault
connectionNoCal.com connection id; needed when the workspace has several.
workspaceIdYesFrom workspace_list.

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, non-destructive, closed-world), so the description earns credit for going further: it discloses the exact return shape and the semantics of the `bookable`/`reasons` fields. It stops short of noting pagination or empty-result behavior.

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

Conciseness5/5

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

Two tightly written sentences, purpose front-loaded, return shape second, usage note last. No filler or repetition of the title.

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?

With no output schema, the description compensates by inlining the return structure, and the required workspaceId is documented in the schema. A two-param read-only tool is well covered, though pagination/edge-case behavior is unstated.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented in the schema (connection: 'needed when the workspace has several', workspaceId: 'From workspace_list'). The description adds no syntax or format detail beyond that, so the baseline 3 applies.

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 (List) and resource (Cal.com event types) plus the scope that makes them meaningful: the ones 'a booking block can name.' No sibling in the tool list overlaps this namespace, so an agent can pick it unambiguously.

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

Usage Guidelines3/5

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

The line 'Only bookable ones work in a form' gives a real filtering rule for downstream use, but there is no explicit when-to-use statement or prerequisite ordering. Usage is implied rather than spelled out, which is the minimum viable level.

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

translationDraft_getGet translation draftA
Read-only
Inspect

Read the resolved translation draft for one (form, language) pair. Returns every source key with its current status:

  • missing: no translation stored

  • outdated: source changed since translation was written, or the source/translation mentions a field that no longer exists (a {{variable}} naming an unknown id)

  • current: translation matches current source

  • suggested: staged by translationDraft_update and not yet accepted by a person in the editor — every write from this tool lands here and stays here after publish, so judge completeness by missing/outdated being 0, not by current

Keys cover form questions/content (block_<id>.*) AND customized respondent notification emails — confirmation + reminder subject/body as email.confirmation.* / email.reminder.*. Those emails are translatable content here, not just a formSettings field; translate them through this tool, never by overwriting the source via formSettings_update. An email.* key only appears once the author has customized that email's text (default-template emails have no key yet); this is independent of publish state — the form does NOT need to be published for the key to appear.

Self-notification emails (the owner/team selfNotification* fields) are NOT translatable and never produce a key — they have a single recipient, so author them directly in the desired language via formSettings_update rather than looking for them here.

Pass status to filter to one bucket — useful for "show me all missing" prompts. Source fragments and stored values are JSON-stringified Descendant[].

NameRequiredDescriptionDefault
formIdYes
statusNo
languageYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, non-destructive), yet the description adds substantial non-obvious behavior: the four status buckets and their meanings, that every update write lands and stays in 'suggested' after publish, and the email.* key lifecycle (appears only once customized, independent of publish state). This is exactly the context annotations cannot convey.

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?

Front-loaded with the core purpose, then structured as a status list plus targeted notes on email keys. It is long, but each paragraph carries distinct behavioral facts (status semantics, email key rules, selfNotification exclusion) rather than padding, so little is wasted.

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

Completeness5/5

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

There is no output schema and no schema parameter descriptions, so the description must explain both the return shape (keys with status, JSON-stringified Descendant[]) and the key naming scheme (block_<id>.*, email.confirmation.*, email.reminder.*). It does exactly that, leaving no gap an agent needs to call and interpret this tool.

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 0%, so the description carries the burden. It defines all four status enum values in detail and explains the filtering intent, which is the semantically hardest parameter. formId and language are left to their schema types/patterns, but the most important ambiguity is resolved richly.

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?

Opens with a specific verb+resource+scope: 'Read the resolved translation draft for one (form, language) pair.' It clearly distinguishes itself from sibling translationDraft_update and translationDraft_publish by describing a read of resolved state, so an agent can route correctly without opening schemas.

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?

Gives explicit conditional usage ('Pass status to filter to one bucket — useful for "show me all missing" prompts') and a when-not with alternative ('Self-notification emails ... author them directly ... via formSettings_update rather than looking for them here'). It also warns against a misuse path (never overwrite source via formSettings_update).

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

translationDraft_publishPublish translation draftAInspect

Snapshot a language's draft into the public bundle so respondents see the latest text. Idempotent. Empty drafts unpublish the language (removed from publishedLanguages — respondents stop seeing it in the picker).

Returns { publishedKeyCount, alreadyCurrent } — alreadyCurrent: true means the published bundle already matched the draft (no-op republish), so callers can skip "publish OK" UX and tell the user nothing changed.

Call after translationDraft_update once the author has reviewed. No separate "unpublish" tool — clear the draft and republish.

NameRequiredDescriptionDefault
formIdYes
languageYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only say this is a non-read-only, non-destructive, closed-world mutation. The description adds what the annotations cannot: idempotency, the destructive side effect (empty draft removes the language from publishedLanguages and respondents lose it in the picker), the exact return shape, and the meaning of alreadyCurrent so callers can suppress false 'publish OK' UX.

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

Conciseness5/5

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

Every sentence is load-bearing: purpose, idempotency, destructive edge case, return contract, and call ordering, with the core action front-loaded. No filler or restatement of the title.

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?

There is no output schema, and the description compensates by documenting the returned `{ publishedKeyCount, alreadyCurrent }` object and its interpretation. The only remaining gap is that neither parameter's meaning is fully spelled out for a zero-coverage schema.

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

Parameters3/5

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

Schema description coverage is 0% for both parameters, so the description must carry the load. It implicitly defines `language` as the draft language being published and ties an empty value to unpublish behavior, but `formId` is never mentioned and no format expectations are stated beyond what the regex already encodes.

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?

The first sentence gives a precise verb and resource — 'Snapshot a language's draft into the public bundle' — which is clearly distinguishable from translationDraft_update (edit the draft) and form_publish (publish the whole form). The scope (one language, within a form) is stated, not implied.

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?

'Call after translationDraft_update once the author has reviewed' gives an explicit sequencing rule, and 'No separate unpublish tool — clear the draft and republish' tells the agent how to reach the inverse operation. It stops short of contrasting with the sibling form_publish, so an agent could still wonder which publish applies.

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

translationDraft_updateUpdate translation draftAInspect

Upsert one or more translation entries across one or more languages in a single atomic mutation. Pass a one-item array for a single-key edit. Pre-validates every entry against the source manifest — a single bad key/value rolls back the whole batch.

The language row is auto-created on first write — no separate "add language" call needed, so this is how you translate into a language the form does not have yet. Works from any page.

Writes land as suggestions in the per-language draft: the author reviews them on the translations page (accept/decline) and then publishes. Respondents keep seeing the existing published translations throughout. Do not change the form's source language or edit form content as a substitute for translating.

NameRequiredDescriptionDefault
formIdYes
entriesYes

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that writes land as suggestions subject to author review-then-publish, that respondents continue seeing the existing published translations, and that invalid entries roll back the whole batch via source-manifest pre-validation. These are consequential behavioral traits not derivable from readOnlyHint=false/destructiveHint=false.

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?

Front-loads the core upsert purpose in the first sentence and orders the rest by importance (array usage, atomicity, auto-create, suggestion lifecycle, exclusions). It is somewhat long across four paragraphs, but nearly every sentence carries actionable information rather than filler.

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 mutation tool with no output schema, the description covers the lifecycle of a write (suggestions, review, publish), rollback behavior, and the source-hash staleness mechanism implied by the schema. It does not describe the mutation's response payload, but the critical operational context an agent needs is present.

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?

Top-level schema coverage is low (formId/entries undescribed), but the description compensates by explaining the one-item-array usage for single edits and the pre-validation/rollback semantics of the entries array. Nested fields (key/value/sourceHash) are deeply documented in the schema itself, so the description's added value is meaningful but not exhaustive on formId.

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 ('Upsert ... translation entries across one or more languages in a single atomic mutation') and clarifies scope ('in a single atomic mutation', single vs. batch). An agent can immediately tell this is the write path for translation entries, distinct from translationDraft_get/publish.

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 says when to pass a one-item array, that the language row is auto-created ('no separate add language call needed'), that it works from any page, and gives a clear exclusion: 'Do not change the form's source language or edit form content as a substitute for translating.' Routing and boundaries are fully specified.

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

translationLanguage_deleteDelete translation languageA
Destructive
Inspect

Delete a language and all stored translations for it. Permanent. Re-add by calling translationDraft_update with an entry for it; prior translations are not recoverable.

NameRequiredDescriptionDefault
formIdYes
languageYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the lower bar applies. The description still earns credit by adding that the deletion is 'Permanent' and that 'prior translations are not recoverable', which goes beyond what the hints convey, though it omits permission/auth requirements.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action and its consequence, then the recovery path. No filler and nothing redundant.

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?

With no output schema the description needn't explain returns, and it covers irreversibility plus how to recover. The gap is the undocumented formId/language semantics, but the core behavioral picture for a destructive tool is complete.

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

Parameters2/5

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

Schema description coverage is 0% and both parameters are required, so the description carries the load. It references 'language' only obliquely and never explains 'formId' (the scoping identifier) or that the language field expects a BCP-47 style tag per the regex pattern.

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 ('Delete') plus resource ('a language') plus the blast radius ('and all stored translations for it'), which no sibling does. An agent can distinguish it from translationLanguage_list and translationDraft_update/publish without opening a schema.

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

Usage Guidelines3/5

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

It supplies a remediation path ('Re-add by calling translationDraft_update') which is genuinely useful workflow guidance, but never states when to delete versus leaving a language in place or which preconditions must hold. Usage is implied rather than framed as a decision.

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

translationLanguage_listList translation languagesA
Read-only
Inspect

List the languages a form has translation rows for, each with completion stats (current / outdated / missing / suggested). Returns the standard list envelope ({ items, nextCursor, hasMore }) — language sets are bounded per form, so cursor is always null. Use before translationDraft_get to know which languages to read.

NameRequiredDescriptionDefault
formIdYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/destructive=false, so safety is covered. The description adds genuinely useful behavior beyond the schema: the response envelope shape, the fact that cursor is always null because language sets are bounded, and the stats breakdown. It does not discuss auth or errors, but adds real operational context.

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

Conciseness5/5

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

Three front-loaded sentences: purpose, return shape, then usage. No filler; each sentence adds information the agent needs.

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

Completeness5/5

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

With no output schema, the description supplies the envelope contract and the always-null cursor caveat, and pairs it with a routing instruction to translationDraft_get. For a single-param list tool this is complete.

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

Parameters3/5

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

One required param (formId) with 0% schema description coverage, so the description carries the burden. It scopes the result to 'a form' which implies formId's meaning, but never documents the parameter's expected format or source. Adequate but not compensating for the coverage gap.

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 ('List the languages a form has translation rows for') plus the returned per-language payload (completion stats). This is clearly distinct from the translationDraft_* siblings, which read/write actual draft content rather than enumerate languages.

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?

Gives explicit sequencing guidance: 'Use before translationDraft_get to know which languages to read,' naming the sibling it precedes. It does not state when NOT to use it or contrast with translationLanguage_delete, but the forward-routing is clear and actionable.

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

workspaceConnection_listList connectionsA
Read-only
Inspect

List the Stripe and Cal.com accounts the workspace has connected. Read before request_create with a payment or booking block. Returns { connectUrl, items: [{ provider, id, name, status, ready, default? }] }. Missing or not ready: tell your user to open connectUrl once.

NameRequiredDescriptionDefault
workspaceIdYesFrom workspace_list.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare the safe read-only, closed-world profile, and the description goes beyond them by disclosing the payload shape ({ connectUrl, items: [...] }) and the ready/status semantics, plus the actionable recovery step when a connection is missing. That is real behavioral context an agent cannot derive from the annotations.

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

Conciseness5/5

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

Four short sentences, front-loaded with purpose, then the routing rule, then the return shape, then the edge-case remedy. Nothing is padding; the payload sentence is earned because there is no output schema.

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

Completeness5/5

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

With no output schema, the description takes on return-value disclosure and does it, including the connectUrl field and item fields. Combined with the usage trigger and failure handling, an agent has everything needed to call and act on this tool.

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

Parameters3/5

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

With a single parameter and 100% schema description coverage ('From workspace_list.'), the schema already carries the meaning. The description adds no workspaceId syntax or constraints, so the baseline 3 applies.

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 ('List the Stripe and Cal.com accounts the workspace has connected'), narrowing scope to payment/booking providers, which cleanly separates it from the many form/editor/request siblings. An agent knows exactly what this returns without opening the schema.

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?

Gives an explicit trigger ('Read before request_create with a payment or booking block'), which is a concrete when-to-use rule tied to a named sibling. It also handles the negative case ('Missing or not ready: tell your user to open connectUrl once'), so both the call condition and the failure path are specified.

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

workspaceFolder_createCreate folderAInspect

Create a folder in a workspace. Prerequisite: call workspaceFolder_list to find existing folders (and any valid parentId for nesting); omit parentId for a root-level folder. Idempotent on case-insensitive name match at the same parent: a duplicate returns the existing folder with alreadyExisted: true. Returns { id, name, workspaceId, parentId, createdAt, alreadyExisted }. Next: form_create with this folder.id as folderId to drop a new form into it, or workspaceFolder_create again to nest deeper.

NameRequiredDescriptionDefault
nameYes
parentIdNo
workspaceIdYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly=false, destructive=false, openWorld=false), and the description adds substantial behavioral context beyond them: idempotency on case-insensitive name match returning alreadyExisted=true, and the exact return shape. This is exactly the kind of trait annotations cannot express.

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

Conciseness5/5

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

Every sentence is load-bearing: scope, prerequisite, root-level rule, idempotency, return shape, next step. Front-loaded with purpose and no filler.

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

Completeness5/5

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

With no output schema, the description supplies the return object inline and covers the mutation's idempotency and nesting semantics. Nothing an agent needs to call this correctly is missing.

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 0%, so the description must carry the burden, and it does for parentId ('omit for root-level', valid parent comes from list) and name (case-insensitive matching). workspaceId is left unexplained, a minor gap given how self-evident it is.

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?

Starts with a specific verb+resource ('Create a folder in a workspace') and is immediately distinguishable from siblings workspaceFolder_list/update/delete. An agent knows exactly what this does without opening the schema.

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?

Gives an explicit prerequisite (call workspaceFolder_list to find parents), the root-level condition (omit parentId), and the follow-on step (form_create with folder.id, or nest deeper). When-to-use and sequencing are fully specified.

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

workspaceFolder_deleteDelete folderA
Destructive
Inspect

Delete a folder and its subfolders; their forms move to the Trash (restorable for 30 days). Folders cannot be restored. Returns { deletedFolderIds, trashedFormIds }; deletedFormIds is a deprecated alias of trashedFormIds.

NameRequiredDescriptionDefault
folderIdYes

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds the specifics an agent needs: folders are permanently deleted, contained forms go to Trash and are restorable for 30 days, and it documents the exact return payload including a deprecated alias. This is rich behavioral disclosure beyond the annotations.

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

Conciseness5/5

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

Front-loaded with the action and its most important consequence (irreversible folder deletion), followed by the return shape. Every clause earns its place; no filler.

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 destructive tool with no output schema, the description covers effects, restorability, and return values well. The only gap is the undocumented folderId format, which is minor but leaves the single parameter under-specified.

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

Parameters2/5

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

Schema description coverage is 0% for the single required folderId parameter, so the description must carry the burden but provides no format, ID type, or example. It implies 'a folder' is identified but adds no semantics beyond the parameter name.

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 (Delete) and resource (folder and its subfolders), and its effect on contained forms. An agent can distinguish it from form_delete and workspaceFolder_update without reading the schema.

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

Usage Guidelines3/5

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

The consequences (forms trashed, folders irreversible) are useful context, but the description never explicitly says when to choose this over form_delete or other deletion tools, nor does it state prerequisites. Usage is only implied.

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

workspaceFolder_listList foldersA
Read-only
Inspect

List folders in a workspace (paginated). Read-only. Prerequisite: call workspace_list for workspaceId. Returns { items: [{id, name, workspaceId, parentId, createdAt}], nextCursor, hasMore }. Next: workspaceFolder_create to add a subfolder, workspaceFolder_update to rename/move, or form_list with this folderId to drill in.

NameRequiredDescriptionDefault
limitNoPage size (1–100, default 20).
cursorNoOpaque cursor from a prior response's `nextCursor`. Omit to start at page 1.
workspaceIdYes

TDQS

A4.7/5.0
Behavior4/5

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

With readOnlyHint/destructiveHint already declared, the description still adds pagination behavior and, importantly, the full response envelope ({items, nextCursor, hasMore}) in the absence of an output schema. 'Read-only' is redundant with annotations, but the pagination and return-shape disclosure is genuine added context.

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

Conciseness5/5

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

One tight paragraph, front-loaded with purpose and pagination, then prerequisite, return shape, and next-steps. Every clause carries distinct information; nothing is filler.

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

Completeness5/5

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

For a read-only list tool with no output schema, the description covers the response shape, paging contract, prerequisite, and adjacent tools, leaving no material gap for an agent to call it correctly.

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 67%; limit and cursor are already self-documented, but workspaceId has no schema description, and the description supplies its provenance ('call workspace_list for workspaceId'). That fills the gap rather than merely restating the schema.

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 ('List folders in a workspace') plus a scoping qualifier (paginated), which cleanly separates it from workspace_list, workspaceFolder_create, and workspaceFolder_update in the sibling set.

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 names the prerequisite ('call workspace_list for workspaceId') and routes the agent forward to three concrete alternatives with the conditions that select each (add a subfolder, rename/move, drill in with folderId). Both when-to-use and what-comes-next are stated.

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

workspaceFolder_updateUpdate folderAInspect

Update a folder name and/or move it to a different parent. Pass at least one of name or parentId. parentId: null = move to workspace root, omit = leave parent unchanged. Prerequisite: call workspaceFolder_list for folderId and any target parentId. Returns the updated folder { id, name, workspaceId, parentId, createdAt }.

NameRequiredDescriptionDefault
nameNo
folderIdYes
parentIdNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, so the safety profile is partly covered. The description adds the return payload shape and the no-op semantics of omitting parentId, but does not address permission requirements or failure/conflict behavior for a move operation.

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?

Four tight sentences, front-loaded with the action and its constraint, then prerequisites, then the return shape. Dense but every sentence adds usable information with no filler.

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

Completeness5/5

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

For a 3-parameter mutation tool with no output schema and no annotation-level detail on returns, the description supplies the return fields explicitly, the prerequisite lookup, and the parameter constraints. An agent has everything needed to call it correctly.

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

Parameters5/5

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

With 0% schema description coverage, the description carries the full burden and does so well: it explains the required 'at least one of' constraint and the crucial parentId distinction (null = workspace root, omit = unchanged), which the schema cannot convey. Only minor details like name length limits are omitted.

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?

The description states a specific verb and resource ('Update a folder name and/or move it to a different parent'), covering both mutation modes. This cleanly distinguishes it from siblings workspaceFolder_create, workspaceFolder_delete, and workspaceFolder_list.

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 gives an explicit precondition ('Pass at least one of name or parentId') and names a required prerequisite call ('call workspaceFolder_list for folderId and any target parentId'). It does not name alternatives, but the operation is unambiguous enough that no sibling routing is needed.

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

workspace_listList workspacesA
Read-only
Inspect

List workspaces the user can access (owned or member). Read-only. Next: workspaceFolder_list / form_list to drill into a workspace. Returns { items: [{id, name, createdAt, role}], nextCursor, hasMore }.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so 'Read-only' adds no new safety info. However, since there is no output schema, the inline return shape ({ items: [{id, name, createdAt, role}], nextCursor, hasMore }) genuinely discloses behavior the agent could not otherwise see, including pagination via nextCursor/hasMore.

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

Conciseness5/5

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

Three tight sentences with zero waste; the scope qualifier leads, then the routing hint, then the return shape. Every sentence earns its place.

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

Completeness5/5

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

For a zero-parameter read tool with no output schema, the description covers the access scope, the safety profile, the follow-up tools, and the return structure. Nothing material is missing.

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?

The tool takes zero parameters, so per the baseline a 4 applies. The description correctly implies no input filtering, matching the empty schema.

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 (List), resource (workspaces), and scope qualifier (the user can access, owned or member). An agent can distinguish this from workspaceFolder_list and form_list without opening any schema.

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?

Provides clear onward routing ('Next: workspaceFolder_list / form_list to drill into a workspace'), telling the agent what to do after listing. It does not state explicit when-not-to-use conditions, but the context is unambiguous.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Addededitor_insertAiValidation
  2. 5 tool updates
    • Changeddocument_create1 field changed
      • changedInput schema / properties / contentType / enum
        Previous value: -[
        -  "application/pdf",
        -  "image/avif",
        -  "image/bmp",
        -  "image/gif",
        -  "image/jpeg",
        -  "image/png",
        -  "image/svg+xml",
        -  "image/tiff",
        -  "image/webp"
        -]New value: +[
        +  "application/pdf",
        +  "image/avif",
        +  "image/bmp",
        +  "image/gif",
        +  "image/jpeg",
        +  "image/png",
        +  "image/tiff",
        +  "image/webp"
        +]
    • Changededitor_insertRepeatingGroup1 field changed
      • addedInput schema / properties / isHidden
        Added value: +{
        +  "description": "Start hidden (the target of a `show` rule).",
        +  "type": "boolean"
        +}
    • Changededitor_setLogic3 fields changed
      • removedInput schema / properties / logicRule
        Removed value: -{
        -  "description": "Single replacement rule. Insert another logic block for each additional rule.",
        -  "properties": {
        -    "actions": {
        -      "items": {
        -        "oneOf": [
        -          {
        -            "properties": {
        -              "targets": {
        -                "items": {
        -                  "oneOf": [
        -                    {
        -                      "properties": {
        -                        "questionId": {
        -                          "description": "Any element with isHidden (question/paragraph/header/image/embed/list-item/table/row/column). Name kept for back-compat.",
        -                          "type": "string"
        -                        },
        -                        "scope": {
        -                          "const": "question",
        -                          "type": "string"
        -                        }
        -                      },
        -                      "required": [
        -                        "scope",
        -                        "questionId"
        -                      ],
        -                      "type": "object"
        -                    },
        -                    {
        -                      "properties": {
        -                        "optionId": {
        -                          "type": "string"
        -                        },
        -                        "questionId": {
        -                          "type": "string"
        -                        },
        -                        "scope": {
        -                          "const": "option",
        -                          "type": "string"
        -                        }
        -                      },
        -                      "required": [
        -                        "scope",
        -                        "questionId",
        -                        "optionId"
        -                      ],
        -                      "type": "object"
        -                    }
        -                  ]
        -                },
        -                "type": "array"
        -              },
        -              "type": {
        -                "enum": [
        -                  "show",
        -                  "hide"
        -                ],
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "type",
        -              "targets"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "questionIds": {
        -                "items": {
        -                  "type": "string"
        -                },
        -                "type": "array"
        -              },
        -              "type": {
        -                "enum": [
        -                  "require",
        -                  "optional"
        -                ],
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "type",
        -              "questionIds"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "pageId": {
        -                "type": "string"
        -              },
        -              "type": {
        -                "const": "setNextPage",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "type",
        -              "pageId"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "message": {
        -                "type": "string"
        -              },
        -              "type": {
        -                "enum": [
        -                  "preventNextPageNavigation",
        -                  "preventFormSubmit"
        -                ],
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "type"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "fieldId": {
        -                "description": "Target field id to mutate. Pass the nodeId of a calculated-field element (hidden-field targets are rejected).",
        -                "type": "string"
        -              },
        -              "operation": {
        -                "description": "Number fields: add/subtract/multiply/divide/set/reset (use set, never assign, for the first step of a numeric chain). Text fields: assign/concatenate/prepend/reset. Divide: literal 0 is rejected; a 0, empty or non-numeric fieldRef skips the step.",
        -                "oneOf": [
        -                  {
        -                    "properties": {
        -                      "op": {
        -                        "const": "reset",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "op"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "op": {
        -                        "enum": [
        -                          "add",
        -                          "subtract",
        -                          "multiply",
        -                          "divide",
        -                          "set",
        -                          "assign",
        -                          "concatenate",
        -                          "prepend"
        -                        ],
        -                        "type": "string"
        -                      },
        -                      "value": {
        -                        "oneOf": [
        -                          {
        -                            "properties": {
        -                              "kind": {
        -                                "const": "literal",
        -                                "type": "string"
        -                              },
        -                              "value": {
        -                                "type": [
        -                                  "number",
        -                                  "string",
        -                                  "boolean"
        -                                ]
        -                              }
        -                            },
        -                            "required": [
        -                              "kind",
        -                              "value"
        -                            ],
        -                            "type": "object"
        -                          },
        -                          {
        -                            "properties": {
        -                              "fieldId": {
        -                                "type": "string"
        -                              },
        -                              "kind": {
        -                                "const": "fieldRef",
        -                                "type": "string"
        -                              }
        -                            },
        -                            "required": [
        -                              "kind",
        -                              "fieldId"
        -                            ],
        -                            "type": "object"
        -                          }
        -                        ]
        -                      }
        -                    },
        -                    "required": [
        -                      "op",
        -                      "value"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": {
        -                "const": "calculateValue",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "type",
        -              "fieldId",
        -              "operation"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "inputId": {
        -                "description": "Target payment input id — the nodeId of a payment-input element (not the question id).",
        -                "type": "string"
        -              },
        -              "op": {
        -                "description": "How to apply value (default 'set'): 'set' replaces the amount; 'increase'/'decrease' adjust the configured base price. Adjustments stack across rules in document order and clamp at 0.",
        -                "enum": [
        -                  "set",
        -                  "increase",
        -                  "decrease"
        -                ],
        -                "type": "string"
        -              },
        -              "type": {
        -                "const": "setPaymentAmount",
        -                "type": "string"
        -              },
        -              "value": {
        -                "description": "Amount: a literal number, or a fieldRef to a field / calculated value. For increase/decrease this is the delta.",
        -                "oneOf": [
        -                  {
        -                    "properties": {
        -                      "kind": {
        -                        "const": "literal",
        -                        "type": "string"
        -                      },
        -                      "value": {
        -                        "type": [
        -                          "number",
        -                          "string",
        -                          "boolean"
        -                        ]
        -                      }
        -                    },
        -                    "required": [
        -                      "kind",
        -                      "value"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "fieldId": {
        -                        "type": "string"
        -                      },
        -                      "kind": {
        -                        "const": "fieldRef",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "kind",
        -                      "fieldId"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              }
        -            },
        -            "required": [
        -              "type",
        -              "inputId",
        -              "value"
        -            ],
        -            "type": "object"
        -          }
        -        ]
        -      },
        -      "minItems": 1,
        -      "type": "array"
        -    },
        -    "conditionGroup": {
        -      "description": "Top-level: pass directly as conditionGroup. Nested { type: \"group\", group } children capped at 2 levels.",
        -      "properties": {
        -        "children": {
        -          "items": {
        -            "anyOf": [
        -              {
        -                "properties": {
        -                  "condition": {
        -                    "properties": {
        -                      "field": {
        -                        "description": "Field ID — question input, calculated-field, or hidden-field (not a question or container ID).",
        -                        "type": "string"
        -                      },
        -                      "operator": {
        -                        "enum": [
        -                          "equals",
        -                          "notEquals",
        -                          "contains",
        -                          "notContains",
        -                          "greaterThan",
        -                          "lessThan",
        -                          "isEmpty",
        -                          "isNotEmpty",
        -                          "startsWith",
        -                          "endsWith",
        -                          "greaterThanOrEqual",
        -                          "lessThanOrEqual",
        -                          "isBetween",
        -                          "hasCheckedAnyOf",
        -                          "hasNotCheckedAnyOf",
        -                          "hasCheckedAllOf",
        -                          "hasCheckedExactly",
        -                          "isOn",
        -                          "isOff",
        -                          "isSigned",
        -                          "isNotSigned",
        -                          "hasFile",
        -                          "hasNoFile",
        -                          "isCompleted",
        -                          "isNotCompleted",
        -                          "isBefore",
        -                          "isAfter",
        -                          "isRankedFirst",
        -                          "isRankedLast",
        -                          "isRankedAbove",
        -                          "rowAnswerIs",
        -                          "rowAnswerIsNot",
        -                          "rowIsAnswered",
        -                          "rowIsNotAnswered",
        -                          "amountEquals",
        -                          "amountGreaterThan",
        -                          "amountLessThan"
        -                        ],
        -                        "type": "string"
        -                      },
        -                      "value": {
        -                        "description": "Omit for isEmpty/isNotEmpty."
        -                      }
        -                    },
        -                    "required": [
        -                      "field",
        -                      "operator"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  "type": {
        -                    "const": "condition",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "type",
        -                  "condition"
        -                ],
        -                "type": "object"
        -              },
        -              {
        -                "properties": {
        -                  "group": {
        -                    "description": "Nested group (max depth 2): children must be leaf conditions only.",
        -                    "properties": {
        -                      "children": {
        -                        "items": {
        -                          "properties": {
        -                            "condition": {
        -                              "properties": {
        -                                "field": {
        -                                  "description": "Field ID — question input, calculated-field, or hidden-field (not a question or container ID).",
        -                                  "type": "string"
        -                                },
        -                                "operator": {
        -                                  "enum": [
        -                                    "equals",
        -                                    "notEquals",
        -                                    "contains",
        -                                    "notContains",
        -                                    "greaterThan",
        -                                    "lessThan",
        -                                    "isEmpty",
        -                                    "isNotEmpty",
        -                                    "startsWith",
        -                                    "endsWith",
        -                                    "greaterThanOrEqual",
        -                                    "lessThanOrEqual",
        -                                    "isBetween",
        -                                    "hasCheckedAnyOf",
        -                                    "hasNotCheckedAnyOf",
        -                                    "hasCheckedAllOf",
        -                                    "hasCheckedExactly",
        -                                    "isOn",
        -                                    "isOff",
        -                                    "isSigned",
        -                                    "isNotSigned",
        -                                    "hasFile",
        -                                    "hasNoFile",
        -                                    "isCompleted",
        -                                    "isNotCompleted",
        -                                    "isBefore",
        -                                    "isAfter",
        -                                    "isRankedFirst",
        -                                    "isRankedLast",
        -                                    "isRankedAbove",
        -                                    "rowAnswerIs",
        -                                    "rowAnswerIsNot",
        -                                    "rowIsAnswered",
        -                                    "rowIsNotAnswered",
        -                                    "amountEquals",
        -                                    "amountGreaterThan",
        -                                    "amountLessThan"
        -                                  ],
        -                                  "type": "string"
        -                                },
        -                                "value": {
        -                                  "description": "Omit for isEmpty/isNotEmpty."
        -                                }
        -                              },
        -                              "required": [
        -                                "field",
        -                                "operator"
        -                              ],
        -                              "type": "object"
        -                            },
        -                            "type": {
        -                              "const": "condition",
        -                              "type": "string"
        -                            }
        -                          },
        -                          "required": [
        -                            "type",
        -                            "condition"
        -                          ],
        -                          "type": "object"
        -                        },
        -                        "minItems": 1,
        -                        "type": "array"
        -                      },
        -                      "combinator": {
        -                        "enum": [
        -                          "AND",
        -                          "OR"
        -                        ],
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "combinator",
        -                      "children"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  "type": {
        -                    "const": "group",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "type",
        -                  "group"
        -                ],
        -                "type": "object"
        -              }
        -            ]
        -          },
        -          "minItems": 1,
        -          "type": "array"
        -        },
        -        "combinator": {
        -          "enum": [
        -            "AND",
        -            "OR"
        -          ],
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "combinator",
        -        "children"
        -      ],
        -      "type": "object"
        -    }
        -  },
        -  "required": [
        -    "conditionGroup",
        -    "actions"
        -  ],
        -  "type": "object"
        -}
      • addedInput schema / properties / rule
        Added value: +{
        +  "description": "Single replacement rule. Insert another logic block for each additional rule.",
        +  "properties": {
        +    "actions": {
        +      "items": {
        +        "oneOf": [
        +          {
        +            "properties": {
        +              "targets": {
        +                "items": {
        +                  "oneOf": [
        +                    {
        +                      "properties": {
        +                        "questionId": {
        +                          "description": "Any element with isHidden (question/paragraph/header/image/embed/list-item/table/row/column). Name kept for back-compat.",
        +                          "type": "string"
        +                        },
        +                        "scope": {
        +                          "const": "question",
        +                          "type": "string"
        +                        }
        +                      },
        +                      "required": [
        +                        "scope",
        +                        "questionId"
        +                      ],
        +                      "type": "object"
        +                    },
        +                    {
        +                      "properties": {
        +                        "optionId": {
        +                          "type": "string"
        +                        },
        +                        "questionId": {
        +                          "type": "string"
        +                        },
        +                        "scope": {
        +                          "const": "option",
        +                          "type": "string"
        +                        }
        +                      },
        +                      "required": [
        +                        "scope",
        +                        "questionId",
        +                        "optionId"
        +                      ],
        +                      "type": "object"
        +                    }
        +                  ]
        +                },
        +                "type": "array"
        +              },
        +              "type": {
        +                "enum": [
        +                  "show",
        +                  "hide"
        +                ],
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "type",
        +              "targets"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "questionIds": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "type": {
        +                "enum": [
        +                  "require",
        +                  "optional"
        +                ],
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "type",
        +              "questionIds"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "pageId": {
        +                "type": "string"
        +              },
        +              "type": {
        +                "const": "setNextPage",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "type",
        +              "pageId"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "message": {
        +                "type": "string"
        +              },
        +              "type": {
        +                "enum": [
        +                  "preventNextPageNavigation",
        +                  "preventFormSubmit"
        +                ],
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "type"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "fieldId": {
        +                "description": "Target field id to mutate. Pass the nodeId of a calculated-field element (hidden-field targets are rejected).",
        +                "type": "string"
        +              },
        +              "operation": {
        +                "description": "Number fields: add/subtract/multiply/divide/set/reset (use set, never assign, for the first step of a numeric chain). Text fields: assign/concatenate/prepend/reset. Divide: literal 0 is rejected; a 0, empty or non-numeric fieldRef skips the step.",
        +                "oneOf": [
        +                  {
        +                    "properties": {
        +                      "op": {
        +                        "const": "reset",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "op"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "op": {
        +                        "enum": [
        +                          "add",
        +                          "subtract",
        +                          "multiply",
        +                          "divide",
        +                          "set",
        +                          "assign",
        +                          "concatenate",
        +                          "prepend"
        +                        ],
        +                        "type": "string"
        +                      },
        +                      "value": {
        +                        "oneOf": [
        +                          {
        +                            "properties": {
        +                              "kind": {
        +                                "const": "literal",
        +                                "type": "string"
        +                              },
        +                              "value": {
        +                                "type": [
        +                                  "number",
        +                                  "string",
        +                                  "boolean"
        +                                ]
        +                              }
        +                            },
        +                            "required": [
        +                              "kind",
        +                              "value"
        +                            ],
        +                            "type": "object"
        +                          },
        +                          {
        +                            "properties": {
        +                              "fieldId": {
        +                                "type": "string"
        +                              },
        +                              "kind": {
        +                                "const": "fieldRef",
        +                                "type": "string"
        +                              }
        +                            },
        +                            "required": [
        +                              "kind",
        +                              "fieldId"
        +                            ],
        +                            "type": "object"
        +                          }
        +                        ]
        +                      }
        +                    },
        +                    "required": [
        +                      "op",
        +                      "value"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": {
        +                "const": "calculateValue",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "type",
        +              "fieldId",
        +              "operation"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "inputId": {
        +                "description": "Target payment input id — the nodeId of a payment-input element (not the question id).",
        +                "type": "string"
        +              },
        +              "op": {
        +                "description": "How to apply value (default 'set'): 'set' replaces the amount; 'increase'/'decrease' adjust the configured base price. Adjustments stack across rules in document order and clamp at 0.",
        +                "enum": [
        +                  "set",
        +                  "increase",
        +                  "decrease"
        +                ],
        +                "type": "string"
        +              },
        +              "type": {
        +                "const": "setPaymentAmount",
        +                "type": "string"
        +              },
        +              "value": {
        +                "description": "Amount: a literal number, or a fieldRef to a field / calculated value. For increase/decrease this is the delta.",
        +                "oneOf": [
        +                  {
        +                    "properties": {
        +                      "kind": {
        +                        "const": "literal",
        +                        "type": "string"
        +                      },
        +                      "value": {
        +                        "type": [
        +                          "number",
        +                          "string",
        +                          "boolean"
        +                        ]
        +                      }
        +                    },
        +                    "required": [
        +                      "kind",
        +                      "value"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "fieldId": {
        +                        "type": "string"
        +                      },
        +                      "kind": {
        +                        "const": "fieldRef",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "kind",
        +                      "fieldId"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              }
        +            },
        +            "required": [
        +              "type",
        +              "inputId",
        +              "value"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      },
        +      "minItems": 1,
        +      "type": "array"
        +    },
        +    "conditionGroup": {
        +      "description": "Top-level: pass directly as conditionGroup. Nested { type: \"group\", group } children capped at 2 levels.",
        +      "properties": {
        +        "children": {
        +          "items": {
        +            "anyOf": [
        +              {
        +                "properties": {
        +                  "condition": {
        +                    "properties": {
        +                      "field": {
        +                        "description": "Field ID — question input, calculated-field, or hidden-field (not a question or container ID).",
        +                        "type": "string"
        +                      },
        +                      "operator": {
        +                        "enum": [
        +                          "equals",
        +                          "notEquals",
        +                          "contains",
        +                          "notContains",
        +                          "greaterThan",
        +                          "lessThan",
        +                          "isEmpty",
        +                          "isNotEmpty",
        +                          "startsWith",
        +                          "endsWith",
        +                          "greaterThanOrEqual",
        +                          "lessThanOrEqual",
        +                          "isBetween",
        +                          "hasCheckedAnyOf",
        +                          "hasNotCheckedAnyOf",
        +                          "hasCheckedAllOf",
        +                          "hasCheckedExactly",
        +                          "isOn",
        +                          "isOff",
        +                          "isSigned",
        +                          "isNotSigned",
        +                          "hasFile",
        +                          "hasNoFile",
        +                          "isCompleted",
        +                          "isNotCompleted",
        +                          "isBefore",
        +                          "isAfter",
        +                          "isRankedFirst",
        +                          "isRankedLast",
        +                          "isRankedAbove",
        +                          "rowAnswerIs",
        +                          "rowAnswerIsNot",
        +                          "rowIsAnswered",
        +                          "rowIsNotAnswered",
        +                          "amountEquals",
        +                          "amountGreaterThan",
        +                          "amountLessThan"
        +                        ],
        +                        "type": "string"
        +                      },
        +                      "value": {
        +                        "description": "Omit for isEmpty/isNotEmpty."
        +                      }
        +                    },
        +                    "required": [
        +                      "field",
        +                      "operator"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "type": {
        +                    "const": "condition",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "type",
        +                  "condition"
        +                ],
        +                "type": "object"
        +              },
        +              {
        +                "properties": {
        +                  "group": {
        +                    "description": "Nested group (max depth 2): children must be leaf conditions only.",
        +                    "properties": {
        +                      "children": {
        +                        "items": {
        +                          "properties": {
        +                            "condition": {
        +                              "properties": {
        +                                "field": {
        +                                  "description": "Field ID — question input, calculated-field, or hidden-field (not a question or container ID).",
        +                                  "type": "string"
        +                                },
        +                                "operator": {
        +                                  "enum": [
        +                                    "equals",
        +                                    "notEquals",
        +                                    "contains",
        +                                    "notContains",
        +                                    "greaterThan",
        +                                    "lessThan",
        +                                    "isEmpty",
        +                                    "isNotEmpty",
        +                                    "startsWith",
        +                                    "endsWith",
        +                                    "greaterThanOrEqual",
        +                                    "lessThanOrEqual",
        +                                    "isBetween",
        +                                    "hasCheckedAnyOf",
        +                                    "hasNotCheckedAnyOf",
        +                                    "hasCheckedAllOf",
        +                                    "hasCheckedExactly",
        +                                    "isOn",
        +                                    "isOff",
        +                                    "isSigned",
        +                                    "isNotSigned",
        +                                    "hasFile",
        +                                    "hasNoFile",
        +                                    "isCompleted",
        +                                    "isNotCompleted",
        +                                    "isBefore",
        +                                    "isAfter",
        +                                    "isRankedFirst",
        +                                    "isRankedLast",
        +                                    "isRankedAbove",
        +                                    "rowAnswerIs",
        +                                    "rowAnswerIsNot",
        +                                    "rowIsAnswered",
        +                                    "rowIsNotAnswered",
        +                                    "amountEquals",
        +                                    "amountGreaterThan",
        +                                    "amountLessThan"
        +                                  ],
        +                                  "type": "string"
        +                                },
        +                                "value": {
        +                                  "description": "Omit for isEmpty/isNotEmpty."
        +                                }
        +                              },
        +                              "required": [
        +                                "field",
        +                                "operator"
        +                              ],
        +                              "type": "object"
        +                            },
        +                            "type": {
        +                              "const": "condition",
        +                              "type": "string"
        +                            }
        +                          },
        +                          "required": [
        +                            "type",
        +                            "condition"
        +                          ],
        +                          "type": "object"
        +                        },
        +                        "minItems": 1,
        +                        "type": "array"
        +                      },
        +                      "combinator": {
        +                        "enum": [
        +                          "AND",
        +                          "OR"
        +                        ],
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "combinator",
        +                      "children"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "type": {
        +                    "const": "group",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "type",
        +                  "group"
        +                ],
        +                "type": "object"
        +              }
        +            ]
        +          },
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "combinator": {
        +          "enum": [
        +            "AND",
        +            "OR"
        +          ],
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "combinator",
        +        "children"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "conditionGroup",
        +    "actions"
        +  ],
        +  "type": "object"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "formId",
        -  "nodeId",
        -  "logicRule"
        -]New value: +[
        +  "formId",
        +  "nodeId",
        +  "rule"
        +]
    • Changededitor_updateElement1 field changed
      • changedInput schema / properties / content / description
        Previous value: -"Replace the whole text of a paragraph/header/list-item/cell. Not a substring; not for input/option shells (rename a title via properties.label)."New value: +"Replace the whole text of a paragraph/header/list-item/cell, in editor_insertParagraph's markup. Not a substring; not for input/option shells (rename a title via properties.label)."
    • Changedrequest_create1 field changed
      • changedInput schema / properties / form / properties / blocks / description
        Previous value: -"1-200 blocks in form order: { type, key?, ...its editor_insert* tool's params }; load_skill(\"requests\") lists types."New value: +"1-200 blocks in form order: { type, key?, ...its editor_insert* tool's params }; load_skill(\"requests\") lists types and exceptions."
  3. 22 tool updates
    • Changededitor_insertDecisionQuestion4 fields changed
      • changedInput schema / properties / labels / description
        Previous value: -"Option labels in the form language"New value: +"Option labels in the form language, e.g. { approve: \"Approve\", decline: \"Decline\", changes: \"Request changes\" }"
      • addedInput schema / properties / labels / required
        Added value: +[
        +  "approve",
        +  "decline",
        +  "changes"
        +]
      • changedInput schema / properties / title / description
        Previous value: -"Default: \"Do you approve?\""New value: +"Question title in the form language, e.g. \"Do you approve?\""
      • changedInput schema / required
        Previous value: -[
        -  "formId"
        -]New value: +[
        +  "formId",
        +  "title",
        +  "labels"
        +]
    • Changededitor_insertHeader1 field changed
      • changedInput schema / properties / content / description
        Previous value: -"Header text. Raw characters, not HTML entities. Markup: **bold**, *italic*, [text](https://url)."New value: +"Header text. Raw characters, not HTML entities. Markup: **bold**, *italic*, ~~struck~~, `code`, <u>underlined</u>, [text](https://url), <span color|background=\"red\" font=\"font-georgia\" size=\"1.25\">…</span>."
    • Changededitor_insertList1 field changed
      • changedInput schema / properties / items / description
        Previous value: -"List items"New value: +"List items. Same markup as a paragraph."
    • Changededitor_insertLogic2 fields changed
      • removedInput schema / properties / rule / properties / actions / items / anyOf
        Removed value: -[
        -  {
        -    "properties": {
        -      "targets": {
        -        "items": {
        -          "anyOf": [
        -            {
        -              "properties": {
        -                "questionId": {
        -                  "description": "Any element with isHidden (question/paragraph/header/image/embed/list-item/table/row/column). Name kept for back-compat.",
        -                  "type": "string"
        -                },
        -                "scope": {
        -                  "const": "question",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "scope",
        -                "questionId"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "optionId": {
        -                  "type": "string"
        -                },
        -                "questionId": {
        -                  "type": "string"
        -                },
        -                "scope": {
        -                  "const": "option",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "scope",
        -                "questionId",
        -                "optionId"
        -              ],
        -              "type": "object"
        -            }
        -          ]
        -        },
        -        "type": "array"
        -      },
        -      "type": {
        -        "enum": [
        -          "show",
        -          "hide"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "targets"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "questionIds": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "type": {
        -        "enum": [
        -          "require",
        -          "optional"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "questionIds"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "pageId": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "setNextPage",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "pageId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "message": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "preventNextPageNavigation",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "message": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "preventFormSubmit",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "fieldId": {
        -        "description": "Target field id to mutate. Pass the nodeId of a calculated-field element (hidden-field targets are rejected).",
        -        "type": "string"
        -      },
        -      "operation": {
        -        "properties": {
        -          "op": {
        -            "description": "Number fields: add/subtract/multiply/divide/set/reset (use set, never assign, for the first step of a numeric chain). Text fields: assign/concatenate/prepend/reset. Divide by literal 0 is rejected; empty, non-numeric, or zero fieldRef divisors are runtime no-ops.",
        -            "enum": [
        -              "add",
        -              "subtract",
        -              "multiply",
        -              "divide",
        -              "set",
        -              "reset",
        -              "assign",
        -              "concatenate",
        -              "prepend"
        -            ],
        -            "type": "string"
        -          },
        -          "value": {
        -            "anyOf": [
        -              {
        -                "properties": {
        -                  "kind": {
        -                    "const": "literal",
        -                    "type": "string"
        -                  },
        -                  "value": {}
        -                },
        -                "required": [
        -                  "kind",
        -                  "value"
        -                ],
        -                "type": "object"
        -              },
        -              {
        -                "properties": {
        -                  "fieldId": {
        -                    "type": "string"
        -                  },
        -                  "kind": {
        -                    "const": "fieldRef",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "kind",
        -                  "fieldId"
        -                ],
        -                "type": "object"
        -              }
        -            ],
        -            "description": "Omit for reset."
        -          }
        -        },
        -        "required": [
        -          "op"
        -        ],
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "calculateValue",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "fieldId",
        -      "operation"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "inputId": {
        -        "description": "Target payment input id — the nodeId of a payment-input element (not the question id).",
        -        "type": "string"
        -      },
        -      "op": {
        -        "description": "How to apply value (default 'set'): 'set' replaces the amount; 'increase'/'decrease' adjust the configured base price. Adjustments stack across rules in document order and clamp at 0.",
        -        "enum": [
        -          "set",
        -          "increase",
        -          "decrease"
        -        ],
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "setPaymentAmount",
        -        "type": "string"
        -      },
        -      "value": {
        -        "anyOf": [
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "literal",
        -                "type": "string"
        -              },
        -              "value": {}
        -            },
        -            "required": [
        -              "kind",
        -              "value"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "fieldId": {
        -                "type": "string"
        -              },
        -              "kind": {
        -                "const": "fieldRef",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "kind",
        -              "fieldId"
        -            ],
        -            "type": "object"
        -          }
        -        ],
        -        "description": "Amount: a literal number, or a fieldRef to a field / calculated value. For increase/decrease this is the delta."
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "inputId",
        -      "value"
        -    ],
        -    "type": "object"
        -  }
        -]
      • addedInput schema / properties / rule / properties / actions / items / oneOf
        Added value: +[
        +  {
        +    "properties": {
        +      "targets": {
        +        "items": {
        +          "oneOf": [
        +            {
        +              "properties": {
        +                "questionId": {
        +                  "description": "Any element with isHidden (question/paragraph/header/image/embed/list-item/table/row/column). Name kept for back-compat.",
        +                  "type": "string"
        +                },
        +                "scope": {
        +                  "const": "question",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "scope",
        +                "questionId"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "properties": {
        +                "optionId": {
        +                  "type": "string"
        +                },
        +                "questionId": {
        +                  "type": "string"
        +                },
        +                "scope": {
        +                  "const": "option",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "scope",
        +                "questionId",
        +                "optionId"
        +              ],
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "type": "array"
        +      },
        +      "type": {
        +        "enum": [
        +          "show",
        +          "hide"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "targets"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "questionIds": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "type": {
        +        "enum": [
        +          "require",
        +          "optional"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "questionIds"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "pageId": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "setNextPage",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "pageId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "message": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "preventNextPageNavigation",
        +          "preventFormSubmit"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "fieldId": {
        +        "description": "Target field id to mutate. Pass the nodeId of a calculated-field element (hidden-field targets are rejected).",
        +        "type": "string"
        +      },
        +      "operation": {
        +        "description": "Number fields: add/subtract/multiply/divide/set/reset (use set, never assign, for the first step of a numeric chain). Text fields: assign/concatenate/prepend/reset. Divide: literal 0 is rejected; a 0, empty or non-numeric fieldRef skips the step.",
        +        "oneOf": [
        +          {
        +            "properties": {
        +              "op": {
        +                "const": "reset",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "op"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "op": {
        +                "enum": [
        +                  "add",
        +                  "subtract",
        +                  "multiply",
        +                  "divide",
        +                  "set",
        +                  "assign",
        +                  "concatenate",
        +                  "prepend"
        +                ],
        +                "type": "string"
        +              },
        +              "value": {
        +                "oneOf": [
        +                  {
        +                    "properties": {
        +                      "kind": {
        +                        "const": "literal",
        +                        "type": "string"
        +                      },
        +                      "value": {
        +                        "type": [
        +                          "number",
        +                          "string",
        +                          "boolean"
        +                        ]
        +                      }
        +                    },
        +                    "required": [
        +                      "kind",
        +                      "value"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "fieldId": {
        +                        "type": "string"
        +                      },
        +                      "kind": {
        +                        "const": "fieldRef",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "kind",
        +                      "fieldId"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              }
        +            },
        +            "required": [
        +              "op",
        +              "value"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      },
        +      "type": {
        +        "const": "calculateValue",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "fieldId",
        +      "operation"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "inputId": {
        +        "description": "Target payment input id — the nodeId of a payment-input element (not the question id).",
        +        "type": "string"
        +      },
        +      "op": {
        +        "description": "How to apply value (default 'set'): 'set' replaces the amount; 'increase'/'decrease' adjust the configured base price. Adjustments stack across rules in document order and clamp at 0.",
        +        "enum": [
        +          "set",
        +          "increase",
        +          "decrease"
        +        ],
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "setPaymentAmount",
        +        "type": "string"
        +      },
        +      "value": {
        +        "description": "Amount: a literal number, or a fieldRef to a field / calculated value. For increase/decrease this is the delta.",
        +        "oneOf": [
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "literal",
        +                "type": "string"
        +              },
        +              "value": {
        +                "type": [
        +                  "number",
        +                  "string",
        +                  "boolean"
        +                ]
        +              }
        +            },
        +            "required": [
        +              "kind",
        +              "value"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "fieldId": {
        +                "type": "string"
        +              },
        +              "kind": {
        +                "const": "fieldRef",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "kind",
        +              "fieldId"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "inputId",
        +      "value"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changededitor_insertParagraph1 field changed
      • changedInput schema / properties / content / description
        Previous value: -"Paragraph text. Raw characters, not HTML entities. Markup: **bold**, *italic*, [text](https://url)."New value: +"Paragraph text. Raw characters, not HTML entities. Markup: **bold**, *italic*, ~~struck~~, `code`, <u>underlined</u>, [text](https://url), <span color|background=\"red\" font=\"font-georgia\" size=\"1.25\">…</span>."
    • Changededitor_insertScheduleAppointmentQuestion1 field changed
      • changedInput schema / properties / availabilityWindowDays / description
        Previous value: -"How many future days respondents may book. Default: 30."New value: +"How many future days respondents may book. Default: 14."
    • Changededitor_insertSelectQuestion1 field changed
      • removedInput schema / properties / multiple
        Removed value: -{
        -  "description": "Allow multiple selections",
        -  "type": "boolean"
        -}
    • Changededitor_insertSwitchQuestion1 field changed
      • removedInput schema / properties / label
        Removed value: -{
        -  "description": "Switch label text",
        -  "type": "string"
        -}
    • Changededitor_insertTable1 field changed
      • changedInput schema / properties / cells / description
        Previous value: -"Cell text, rows x cols, row 0 first. Omit for an empty grid."New value: +"Cell text, rows x cols, row 0 first, same markup as a paragraph. Omit for an empty grid."
    • Changededitor_setLogic2 fields changed
      • removedInput schema / properties / logicRule / properties / actions / items / anyOf
        Removed value: -[
        -  {
        -    "properties": {
        -      "targets": {
        -        "items": {
        -          "anyOf": [
        -            {
        -              "properties": {
        -                "questionId": {
        -                  "description": "Any element with isHidden (question/paragraph/header/image/embed/list-item/table/row/column). Name kept for back-compat.",
        -                  "type": "string"
        -                },
        -                "scope": {
        -                  "const": "question",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "scope",
        -                "questionId"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "optionId": {
        -                  "type": "string"
        -                },
        -                "questionId": {
        -                  "type": "string"
        -                },
        -                "scope": {
        -                  "const": "option",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "scope",
        -                "questionId",
        -                "optionId"
        -              ],
        -              "type": "object"
        -            }
        -          ]
        -        },
        -        "type": "array"
        -      },
        -      "type": {
        -        "enum": [
        -          "show",
        -          "hide"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "targets"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "questionIds": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "type": {
        -        "enum": [
        -          "require",
        -          "optional"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "questionIds"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "pageId": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "setNextPage",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "pageId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "message": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "preventNextPageNavigation",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "message": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "preventFormSubmit",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "fieldId": {
        -        "description": "Target field id to mutate. Pass the nodeId of a calculated-field element (hidden-field targets are rejected).",
        -        "type": "string"
        -      },
        -      "operation": {
        -        "properties": {
        -          "op": {
        -            "description": "Number fields: add/subtract/multiply/divide/set/reset (use set, never assign, for the first step of a numeric chain). Text fields: assign/concatenate/prepend/reset. Divide by literal 0 is rejected; empty, non-numeric, or zero fieldRef divisors are runtime no-ops.",
        -            "enum": [
        -              "add",
        -              "subtract",
        -              "multiply",
        -              "divide",
        -              "set",
        -              "reset",
        -              "assign",
        -              "concatenate",
        -              "prepend"
        -            ],
        -            "type": "string"
        -          },
        -          "value": {
        -            "anyOf": [
        -              {
        -                "properties": {
        -                  "kind": {
        -                    "const": "literal",
        -                    "type": "string"
        -                  },
        -                  "value": {}
        -                },
        -                "required": [
        -                  "kind",
        -                  "value"
        -                ],
        -                "type": "object"
        -              },
        -              {
        -                "properties": {
        -                  "fieldId": {
        -                    "type": "string"
        -                  },
        -                  "kind": {
        -                    "const": "fieldRef",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "kind",
        -                  "fieldId"
        -                ],
        -                "type": "object"
        -              }
        -            ],
        -            "description": "Omit for reset."
        -          }
        -        },
        -        "required": [
        -          "op"
        -        ],
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "calculateValue",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "fieldId",
        -      "operation"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "inputId": {
        -        "description": "Target payment input id — the nodeId of a payment-input element (not the question id).",
        -        "type": "string"
        -      },
        -      "op": {
        -        "description": "How to apply value (default 'set'): 'set' replaces the amount; 'increase'/'decrease' adjust the configured base price. Adjustments stack across rules in document order and clamp at 0.",
        -        "enum": [
        -          "set",
        -          "increase",
        -          "decrease"
        -        ],
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "setPaymentAmount",
        -        "type": "string"
        -      },
        -      "value": {
        -        "anyOf": [
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "literal",
        -                "type": "string"
        -              },
        -              "value": {}
        -            },
        -            "required": [
        -              "kind",
        -              "value"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "fieldId": {
        -                "type": "string"
        -              },
        -              "kind": {
        -                "const": "fieldRef",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "kind",
        -              "fieldId"
        -            ],
        -            "type": "object"
        -          }
        -        ],
        -        "description": "Amount: a literal number, or a fieldRef to a field / calculated value. For increase/decrease this is the delta."
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "inputId",
        -      "value"
        -    ],
        -    "type": "object"
        -  }
        -]
      • addedInput schema / properties / logicRule / properties / actions / items / oneOf
        Added value: +[
        +  {
        +    "properties": {
        +      "targets": {
        +        "items": {
        +          "oneOf": [
        +            {
        +              "properties": {
        +                "questionId": {
        +                  "description": "Any element with isHidden (question/paragraph/header/image/embed/list-item/table/row/column). Name kept for back-compat.",
        +                  "type": "string"
        +                },
        +                "scope": {
        +                  "const": "question",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "scope",
        +                "questionId"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "properties": {
        +                "optionId": {
        +                  "type": "string"
        +                },
        +                "questionId": {
        +                  "type": "string"
        +                },
        +                "scope": {
        +                  "const": "option",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "scope",
        +                "questionId",
        +                "optionId"
        +              ],
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "type": "array"
        +      },
        +      "type": {
        +        "enum": [
        +          "show",
        +          "hide"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "targets"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "questionIds": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "type": {
        +        "enum": [
        +          "require",
        +          "optional"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "questionIds"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "pageId": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "setNextPage",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "pageId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "message": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "preventNextPageNavigation",
        +          "preventFormSubmit"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "fieldId": {
        +        "description": "Target field id to mutate. Pass the nodeId of a calculated-field element (hidden-field targets are rejected).",
        +        "type": "string"
        +      },
        +      "operation": {
        +        "description": "Number fields: add/subtract/multiply/divide/set/reset (use set, never assign, for the first step of a numeric chain). Text fields: assign/concatenate/prepend/reset. Divide: literal 0 is rejected; a 0, empty or non-numeric fieldRef skips the step.",
        +        "oneOf": [
        +          {
        +            "properties": {
        +              "op": {
        +                "const": "reset",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "op"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "op": {
        +                "enum": [
        +                  "add",
        +                  "subtract",
        +                  "multiply",
        +                  "divide",
        +                  "set",
        +                  "assign",
        +                  "concatenate",
        +                  "prepend"
        +                ],
        +                "type": "string"
        +              },
        +              "value": {
        +                "oneOf": [
        +                  {
        +                    "properties": {
        +                      "kind": {
        +                        "const": "literal",
        +                        "type": "string"
        +                      },
        +                      "value": {
        +                        "type": [
        +                          "number",
        +                          "string",
        +                          "boolean"
        +                        ]
        +                      }
        +                    },
        +                    "required": [
        +                      "kind",
        +                      "value"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "fieldId": {
        +                        "type": "string"
        +                      },
        +                      "kind": {
        +                        "const": "fieldRef",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "kind",
        +                      "fieldId"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              }
        +            },
        +            "required": [
        +              "op",
        +              "value"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      },
        +      "type": {
        +        "const": "calculateValue",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "fieldId",
        +      "operation"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "inputId": {
        +        "description": "Target payment input id — the nodeId of a payment-input element (not the question id).",
        +        "type": "string"
        +      },
        +      "op": {
        +        "description": "How to apply value (default 'set'): 'set' replaces the amount; 'increase'/'decrease' adjust the configured base price. Adjustments stack across rules in document order and clamp at 0.",
        +        "enum": [
        +          "set",
        +          "increase",
        +          "decrease"
        +        ],
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "setPaymentAmount",
        +        "type": "string"
        +      },
        +      "value": {
        +        "description": "Amount: a literal number, or a fieldRef to a field / calculated value. For increase/decrease this is the delta.",
        +        "oneOf": [
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "literal",
        +                "type": "string"
        +              },
        +              "value": {
        +                "type": [
        +                  "number",
        +                  "string",
        +                  "boolean"
        +                ]
        +              }
        +            },
        +            "required": [
        +              "kind",
        +              "value"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "fieldId": {
        +                "type": "string"
        +              },
        +              "kind": {
        +                "const": "fieldRef",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "kind",
        +              "fieldId"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "inputId",
        +      "value"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changededitor_testLogic1 field changed
      • changedInput schema / properties / answers / additionalProperties
        Previous value: -trueNew value: +{}
    • Changededitor_updateElement49 fields changed
      • changedInput schema / properties / properties / properties / multiple / description
        Previous value: -"Allow several answers — select, picture choice (picture choice drops its preselection)."New value: +"Allow several answers — picture choice only (drops its preselection). A select takes one answer."
      • removedInput schema / properties / properties / properties / validation / properties / accept / anyOf
        Removed value: -[
        -  {
        -    "pattern": "^(\\s*(\\.[A-Za-z0-9]+|[A-Za-z0-9*]+\\/[A-Za-z0-9.+*-]+)\\s*)(,\\s*(\\.[A-Za-z0-9]+|[A-Za-z0-9*]+\\/[A-Za-z0-9.+*-]+)\\s*)*$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / accept / pattern
        Added value: +"^(\\s*(\\.[A-Za-z0-9]+|[A-Za-z0-9*]+\\/[A-Za-z0-9.+*-]+)\\s*)(,\\s*(\\.[A-Za-z0-9]+|[A-Za-z0-9*]+\\/[A-Za-z0-9.+*-]+)\\s*)*$"
      • addedInput schema / properties / properties / properties / validation / properties / accept / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / maxDate / anyOf
        Removed value: -[
        -  {
        -    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / maxDate / pattern
        Added value: +"^\\d{4}-\\d{2}-\\d{2}$"
      • addedInput schema / properties / properties / properties / validation / properties / maxDate / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / maxFiles / anyOf
        Removed value: -[
        -  {
        -    "maximum": 100,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / maxFiles / maximum
        Added value: +100
      • addedInput schema / properties / properties / properties / validation / properties / maxFiles / minimum
        Added value: +1
      • addedInput schema / properties / properties / properties / validation / properties / maxFiles / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / maxLength / anyOf
        Removed value: -[
        -  {
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / maxLength / minimum
        Added value: +0
      • addedInput schema / properties / properties / properties / validation / properties / maxLength / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / maxSelections / anyOf
        Removed value: -[
        -  {
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / maxSelections / minimum
        Added value: +0
      • addedInput schema / properties / properties / properties / validation / properties / maxSelections / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / maxSize / anyOf
        Removed value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "maximum": 1073741824,
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / maxSize / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / properties / properties / validation / properties / maxSize / maximum
        Added value: +1073741824
      • addedInput schema / properties / properties / properties / validation / properties / maxSize / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / maxTime / anyOf
        Removed value: -[
        -  {
        -    "pattern": "^([01]\\d|2[0-3]):([0-5]\\d)$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / maxTime / pattern
        Added value: +"^([01]\\d|2[0-3]):([0-5]\\d)$"
      • addedInput schema / properties / properties / properties / validation / properties / maxTime / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / minAnsweredRows / anyOf
        Removed value: -[
        -  {
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / minAnsweredRows / minimum
        Added value: +0
      • addedInput schema / properties / properties / properties / validation / properties / minAnsweredRows / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / minDate / anyOf
        Removed value: -[
        -  {
        -    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / minDate / pattern
        Added value: +"^\\d{4}-\\d{2}-\\d{2}$"
      • addedInput schema / properties / properties / properties / validation / properties / minDate / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / minFiles / anyOf
        Removed value: -[
        -  {
        -    "maximum": 100,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / minFiles / maximum
        Added value: +100
      • addedInput schema / properties / properties / properties / validation / properties / minFiles / minimum
        Added value: +1
      • addedInput schema / properties / properties / properties / validation / properties / minFiles / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / minLength / anyOf
        Removed value: -[
        -  {
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / minLength / minimum
        Added value: +0
      • addedInput schema / properties / properties / properties / validation / properties / minLength / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / minSelections / anyOf
        Removed value: -[
        -  {
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / minSelections / minimum
        Added value: +0
      • addedInput schema / properties / properties / properties / validation / properties / minSelections / type
        Added value: +[
        +  "integer",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / minTime / anyOf
        Removed value: -[
        -  {
        -    "pattern": "^([01]\\d|2[0-3]):([0-5]\\d)$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / minTime / pattern
        Added value: +"^([01]\\d|2[0-3]):([0-5]\\d)$"
      • addedInput schema / properties / properties / properties / validation / properties / minTime / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / pattern / anyOf
        Removed value: -[
        -  {
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / pattern / minLength
        Added value: +1
      • addedInput schema / properties / properties / properties / validation / properties / pattern / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / properties / properties / validation / properties / step / anyOf
        Removed value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / properties / properties / validation / properties / step / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / properties / properties / validation / properties / step / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedform_list4 fields changed
      • removedInput schema / properties / limit / default
        Removed value: -20
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / properties / workspaceId / minLength
        Added value: +1
    • Changedform_update10 fields changed
      • changedInput schema / properties / cover / description
        Previous value: -"Set or remove the form cover. Discriminated by `type`. Per-variant fields validated server-side: type=color requires color; type=image requires url; type=none takes no other fields. For type=image, never invent or guess a URL (no stock, placeholder, or Unsplash links) — use a URL the user provided or an uploaded image; if you have neither, ask the user instead."New value: +"Set or remove the form cover. Discriminated by `type`: type=color requires color; type=image requires url; type=none takes no other fields. For type=image, never invent or guess a URL (no stock, placeholder, or Unsplash links) — use a URL the user provided or an uploaded image; if you have neither, ask the user instead."
      • addedInput schema / properties / cover / properties / offsetY / default
        Added value: +50
      • changedInput schema / properties / cover / properties / url / description
        Previous value: -"http(s) or data:image URI the user provided (type=image) — never invented"New value: +"http(s) or data:image URI the user provided — never invented (type=image)"
      • addedInput schema / properties / cover / properties / url / pattern
        Added value: +"^(https?:\\/\\/|data:image\\/)"
      • addedInput schema / properties / formId / minLength
        Added value: +1
      • changedInput schema / properties / logo / description
        Previous value: -"Set or remove the form logo. Discriminated by `type`. Per-variant fields validated server-side: type=icon requires name; type=image requires url; type=none takes no other fields. For type=image, never invent or guess a URL — use a URL the user provided or an uploaded image; if you have neither, ask the user instead."New value: +"Set or remove the form logo. Discriminated by `type`: type=icon requires name; type=image requires url; type=none takes no other fields. For type=image, never invent or guess a URL — use a URL the user provided or an uploaded image; if you have neither, ask the user instead."
      • changedInput schema / properties / logo / properties / name / description
        Previous value: -"Icon name (type=icon)"New value: +"(type=icon)"
      • changedInput schema / properties / logo / properties / url / description
        Previous value: -"http(s) or data:image URI the user provided (type=image) — never invented"New value: +"http(s) or data:image URI the user provided — never invented (type=image)"
      • addedInput schema / properties / logo / properties / url / pattern
        Added value: +"^(https?:\\/\\/|data:image\\/)"
      • addedInput schema / properties / name / minLength
        Added value: +1
    • ChangedformSettings_get1 field changed
      • addedInput schema / properties / formId / minLength
        Added value: +1
    • ChangedformSettings_update31 fields changed
      • changedInput schema / properties / draftRetentionDays / description
        Previous value: -"Days to keep abandoned drafts (0–36500). null reverts to runtime default."New value: +"Days to keep abandoned drafts. null reverts to runtime default."
      • addedInput schema / properties / draftRetentionDays / maximum
        Added value: +36500
      • addedInput schema / properties / draftRetentionDays / minimum
        Added value: +0
      • changedInput schema / properties / draftRetentionDays / type
        Previous value: -[
        -  "number",
        -  "null"
        -]New value: +[
        +  "integer",
        +  "null"
        +]
      • addedInput schema / properties / formId / minLength
        Added value: +1
      • changedInput schema / properties / maxEdits / description
        Previous value: -"Max post-submit edits allowed per submission (requires editAfterSubmit). 0 = unlimited on Pro and Business, 3 on Free; max 3."New value: +"Max post-submit edits allowed per submission (requires editAfterSubmit). 0 = unlimited on Pro and Business, 3 on Free."
      • addedInput schema / properties / maxEdits / maximum
        Added value: +3
      • addedInput schema / properties / maxEdits / minimum
        Added value: +0
      • changedInput schema / properties / maxEdits / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / maxSubmissionsPerRespondent / description
        Previous value: -"Max submissions one respondent may make via \"Submit another response\" (requires allowAnotherResponse). 0 = unlimited; max 1000. Hard-enforced for signed-in respondents; client-gated for anonymous."New value: +"Max submissions per respondent via \"Submit another response\" (requires allowAnotherResponse). 0 = unlimited. Enforced for signed-in respondents, client-gated for anonymous."
      • addedInput schema / properties / maxSubmissionsPerRespondent / maximum
        Added value: +1000
      • addedInput schema / properties / maxSubmissionsPerRespondent / minimum
        Added value: +0
      • changedInput schema / properties / maxSubmissionsPerRespondent / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / notificationEmails / description
        Previous value: -"Email addresses receiving submission notifications. At most 10; duplicates are collapsed case-insensitively."New value: +"Email addresses receiving submission notifications. Duplicates are collapsed case-insensitively."
      • removedInput schema / properties / notificationEmails / items / format
        Removed value: -"email"
      • addedInput schema / properties / notificationEmails / items / pattern
        Added value: +"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"
      • changedInput schema / properties / notificationEmails / type
        Previous value: -"array"New value: +[
        +  "array",
        +  "null"
        +]
      • changedInput schema / properties / password / description
        Previous value: -"Form access password (≥4 chars). Setting a string implies passwordEnabled:true. Pass null to clear the gate (sets passwordEnabled:false)."New value: +"Form access password. Setting a string implies passwordEnabled:true. Pass null to clear the gate (sets passwordEnabled:false)."
      • changedInput schema / properties / redirectQueryParams / type
        Previous value: -"array"New value: +[
        +  "array",
        +  "null"
        +]
      • addedInput schema / properties / redirectUrl / pattern
        Added value: +"^(https?:\\/\\/.+)?$"
      • changedInput schema / properties / reminderSteps / description
        Previous value: -"Reminder schedule as idle offsets from the respondent's last activity, e.g. [\"1d\",\"3d\",\"1w\"]. Max 5 steps, sorted and deduped on save; [] = no automatic reminders. Applies to both abandoned public-link responses and requests."New value: +"Idle offsets from the respondent's last activity, e.g. [\"1d\",\"3d\",\"1w\"]. Max 5, sorted and deduped on save; [] = none. Applies to abandoned public-link responses and requests."
      • addedInput schema / properties / reminderSteps / items / minLength
        Added value: +1
      • changedInput schema / properties / reminderSteps / type
        Previous value: -"array"New value: +[
        +  "array",
        +  "null"
        +]
      • changedInput schema / properties / requestInvitationSubject / description
        Previous value: -"Custom subject for the request invitation email (request_create delivery \"email\"). Plain text with optional {{variable}} placeholders; context and prefill keys resolve, submission metadata does not. Pro tier."New value: +"Subject of the request invitation email (request_create delivery \"email\"). Plain text with {{variable}} placeholders; context and prefill keys resolve, submission metadata does not. Pro tier."
      • changedInput schema / properties / respondentReminderIdleWindow / description
        Previous value: -"Single-step form of `reminderSteps`, kept for forms authored before multi-step schedules. Ignored when `reminderSteps` is set."New value: +"Single-step form of `reminderSteps`, kept for older forms. Ignored when `reminderSteps` is set."
      • addedInput schema / properties / respondentReminderRequiredFieldIds / items / minLength
        Added value: +1
      • changedInput schema / properties / respondentReminderRequiredFieldIds / type
        Previous value: -"array"New value: +[
        +  "array",
        +  "null"
        +]
      • changedInput schema / properties / submissionRetentionDays / description
        Previous value: -"Days to keep submissions (0–36500). null reverts to runtime default. Setting a value also clears any fixed deletion date configured in the form builder (the two retention modes are mutually exclusive). Business plan."New value: +"Days to keep submissions. null = runtime default. Also clears a fixed deletion date set in the builder (the two modes are exclusive). Business plan."
      • addedInput schema / properties / submissionRetentionDays / maximum
        Added value: +36500
      • addedInput schema / properties / submissionRetentionDays / minimum
        Added value: +0
      • changedInput schema / properties / submissionRetentionDays / type
        Previous value: -[
        -  "number",
        -  "null"
        -]New value: +[
        +  "integer",
        +  "null"
        +]
    • ChangedformShareLink_update5 fields changed
      • removedInput schema / properties / customSlug / anyOf
        Removed value: -[
        -  {
        -    "maxLength": 64,
        -    "minLength": 3,
        -    "pattern": "^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]{3,}$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / customSlug / maxLength
        Added value: +64
      • addedInput schema / properties / customSlug / minLength
        Added value: +3
      • addedInput schema / properties / customSlug / pattern
        Added value: +"^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]{3,}$"
      • addedInput schema / properties / customSlug / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • ChangedformTheme_get1 field changed
      • addedInput schema / properties / formId / minLength
        Added value: +1
    • ChangedformTheme_set9 fields changed
      • addedInput schema / properties / formId / minLength
        Added value: +1
      • changedInput schema / properties / theme / properties / button / properties / radius / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / theme / properties / choice / properties / borderWidth / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / theme / properties / choice / properties / radius / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / theme / properties / foundation / properties / fontSize / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / theme / properties / foundation / properties / radius / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / theme / properties / input / properties / borderWidth / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / theme / properties / input / properties / radius / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / theme / properties / rating / properties / size / type
        Previous value: -"number"New value: +"integer"
    • ChangedformWebhook_create1 field changed
      • removedInput schema / properties / headers / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
    • ChangedformWebhook_update1 field changed
      • removedInput schema / properties / headers / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
    • Changedrequest_create11 fields changed
      • removedInput schema / properties / context / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / form / properties / baseline
        Removed value: -{
        -  "description": "Form id to copy logo, cover, theme, settings and emails from.",
        -  "type": "string"
        -}
      • addedInput schema / properties / form / properties / cover
        Added value: +{
        +  "description": "{ type: \"color\", color: \"#rrggbb\" } or { type: \"image\", url, offsetY? }."
        +}
      • addedInput schema / properties / form / properties / emoji
        Added value: +{
        +  "description": "One emoji, shown beside the name.",
        +  "type": "string"
        +}
      • changedInput schema / properties / form / properties / language / description
        Previous value: -"UI language tag. Default: the baseline's, else \"en\"."New value: +"UI language tag. Default: \"en\"."
      • addedInput schema / properties / form / properties / logo
        Added value: +{
        +  "description": "{ type: \"icon\", name } (load_skill(\"requests\") lists names) or { type: \"image\", url }."
        +}
      • removedInput schema / properties / form / properties / settings / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • changedInput schema / properties / form / properties / theme / description
        Previous value: -"{ light?, dark? }: preset id or whole formTheme_set theme per mode; wins over the baseline's."New value: +"{ light?, dark? }: preset id or whole formTheme_set theme per mode."
      • addedInput schema / properties / form / properties / translations
        Added value: +{
        +  "description": "{ \"<language>\": { \"<text as written>\": \"<translated>\" } }, every string of the form; see load_skill(\"requests\")."
        +}
      • removedInput schema / properties / metadata / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / prefill / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
  4. 25 tool updates
    • Changededitor_insertCheckboxQuestion4 fields changed
      • addedInput schema / properties / defaultOptions
        Added value: +{
        +  "description": "Labels of the options checked by default",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / maxSelections
        Added value: +{
        +  "description": "Most options to pick",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / minSelections
        Added value: +{
        +  "description": "Fewest options to pick",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / randomizeOptions
        Added value: +{
        +  "description": "Shuffle option order per respondent",
        +  "type": "boolean"
        +}
    • Changededitor_insertContactQuestion3 fields changed
      • addedInput schema / properties / defaultCountry
        Added value: +{
        +  "description": "Phone only: preselected country, ISO 3166-1 alpha-2",
        +  "pattern": "^[A-Z]{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / pattern
        Added value: +{
        +  "description": "Regex the email or url must match",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / requireVerification
        Added value: +{
        +  "description": "Email only: respondent confirms the address by emailed code (Business plan)",
        +  "type": "boolean"
        +}
    • Changededitor_insertDateQuestion2 fields changed
      • addedInput schema / properties / maxDate
        Added value: +{
        +  "description": "Latest date, YYYY-MM-DD",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / minDate
        Added value: +{
        +  "description": "Earliest date, YYYY-MM-DD",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
    • Changededitor_insertFileQuestion1 field changed
      • addedInput schema / properties / minFiles
        Added value: +{
        +  "description": "Fewest files to upload",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changededitor_insertHeader2 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"Header text (plain text — pass raw characters like \"&\" and \"<\", not HTML entities like \"&amp;\")"New value: +"Header text. Raw characters, not HTML entities. Markup: **bold**, *italic*, [text](https://url)."
      • removedInput schema / properties / content / minLength
        Removed value: -1
    • Changededitor_insertMatrixQuestion2 fields changed
      • addedInput schema / properties / minAnsweredRows
        Added value: +{
        +  "description": "Fewest rows to answer",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / requireAllRows
        Added value: +{
        +  "description": "Every row needs an answer",
        +  "type": "boolean"
        +}
    • Changededitor_insertParagraph1 field changed
      • changedInput schema / properties / content / description
        Previous value: -"Paragraph text (plain text — pass raw characters like \"&\" and \"<\", not HTML entities like \"&amp;\")"New value: +"Paragraph text. Raw characters, not HTML entities. Markup: **bold**, *italic*, [text](https://url)."
    • Changededitor_insertPictureChoiceQuestion3 fields changed
      • addedInput schema / properties / defaultOptions
        Added value: +{
        +  "description": "Labels preselected; one at most unless multiple",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / maxSelections
        Added value: +{
        +  "description": "Most pictures to pick (multiple only)",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / minSelections
        Added value: +{
        +  "description": "Fewest pictures to pick (multiple only)",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changededitor_insertRadioQuestion2 fields changed
      • addedInput schema / properties / defaultOption
        Added value: +{
        +  "description": "Label of the option preselected",
        +  "type": "string"
        +}
      • addedInput schema / properties / randomizeOptions
        Added value: +{
        +  "description": "Shuffle option order per respondent",
        +  "type": "boolean"
        +}
    • Changededitor_insertRankingQuestion1 field changed
      • addedInput schema / properties / randomizeOptions
        Added value: +{
        +  "description": "Shuffle starting order per respondent",
        +  "type": "boolean"
        +}
    • Changededitor_insertSelectQuestion1 field changed
      • addedInput schema / properties / randomizeOptions
        Added value: +{
        +  "description": "Shuffle option order per respondent",
        +  "type": "boolean"
        +}
    • Changededitor_insertTable1 field changed
      • addedInput schema / properties / cells
        Added value: +{
        +  "description": "Cell text, rows x cols, row 0 first. Omit for an empty grid.",
        +  "items": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "type": "array"
        +}
    • Changededitor_insertTextQuestion1 field changed
      • addedInput schema / properties / pattern
        Added value: +{
        +  "description": "Regex the answer must match; anchor with ^ $.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Changededitor_insertTimeQuestion2 fields changed
      • addedInput schema / properties / maxTime
        Added value: +{
        +  "description": "Latest time, HH:mm",
        +  "pattern": "^([01]\\d|2[0-3]):([0-5]\\d)$",
        +  "type": "string"
        +}
      • addedInput schema / properties / minTime
        Added value: +{
        +  "description": "Earliest time, HH:mm",
        +  "pattern": "^([01]\\d|2[0-3]):([0-5]\\d)$",
        +  "type": "string"
        +}
    • Changededitor_updateElement3 fields changed
      • addedInput schema / properties / properties / properties / multiple
        Added value: +{
        +  "description": "Allow several answers — select, picture choice (picture choice drops its preselection).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / properties / properties / randomizeOptions
        Added value: +{
        +  "description": "Shuffle options per respondent — radio, checkbox, select, ranking.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / properties / properties / validation
        Added value: +{
        +  "description": "Answer rules of a question (target it or its input); keys follow the input. text/url: minLength, maxLength, pattern. email: pattern, requireVerification (Business). number, rating, scale: min, max; number also step. date: minDate, maxDate YYYY-MM-DD. time: minTime, maxTime HH:mm. checkbox, multi picture: minSelections, maxSelections. matrix: requireAllRows, minAnsweredRows. file: minFiles, maxFiles, maxSize bytes, accept. null clears a rule.",
        +  "properties": {
        +    "accept": {
        +      "anyOf": [
        +        {
        +          "pattern": "^(\\s*(\\.[A-Za-z0-9]+|[A-Za-z0-9*]+\\/[A-Za-z0-9.+*-]+)\\s*)(,\\s*(\\.[A-Za-z0-9]+|[A-Za-z0-9*]+\\/[A-Za-z0-9.+*-]+)\\s*)*$",
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "max": {
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "maxDate": {
        +      "anyOf": [
        +        {
        +          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "maxFiles": {
        +      "anyOf": [
        +        {
        +          "maximum": 100,
        +          "minimum": 1,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "maxLength": {
        +      "anyOf": [
        +        {
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "maxSelections": {
        +      "anyOf": [
        +        {
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "maxSize": {
        +      "anyOf": [
        +        {
        +          "exclusiveMinimum": 0,
        +          "maximum": 1073741824,
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "maxTime": {
        +      "anyOf": [
        +        {
        +          "pattern": "^([01]\\d|2[0-3]):([0-5]\\d)$",
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "min": {
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "minAnsweredRows": {
        +      "anyOf": [
        +        {
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "minDate": {
        +      "anyOf": [
        +        {
        +          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "minFiles": {
        +      "anyOf": [
        +        {
        +          "maximum": 100,
        +          "minimum": 1,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "minLength": {
        +      "anyOf": [
        +        {
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "minSelections": {
        +      "anyOf": [
        +        {
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "minTime": {
        +      "anyOf": [
        +        {
        +          "pattern": "^([01]\\d|2[0-3]):([0-5]\\d)$",
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "pattern": {
        +      "anyOf": [
        +        {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "requireAllRows": {
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "requireVerification": {
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "step": {
        +      "anyOf": [
        +        {
        +          "exclusiveMinimum": 0,
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • ChangedformSettings_update2 fields changed
      • addedInput schema / properties / requestInvitationBody
        Added value: +{
        +  "description": "Custom body for the request invitation email. Same placeholders as the subject; newlines become paragraphs. Pro tier.",
        +  "type": "string"
        +}
      • addedInput schema / properties / requestInvitationSubject
        Added value: +{
        +  "description": "Custom subject for the request invitation email (request_create delivery \"email\"). Plain text with optional {{variable}} placeholders; context and prefill keys resolve, submission metadata does not. Pro tier.",
        +  "type": "string"
        +}
    • AddedformWebhook_create
    • AddedformWebhook_delete
    • AddedformWebhook_list
    • AddedformWebhook_test
    • AddedformWebhook_update
    • AddedpaymentConnection_setDefault
    • Changedrequest_create4 fields changed
      • addedInput schema / properties / form
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Build the form in this call instead of formId. The same form again reuses the first one.",
        +  "properties": {
        +    "baseline": {
        +      "description": "Form id to copy logo, cover, theme, settings and emails from.",
        +      "type": "string"
        +    },
        +    "blocks": {
        +      "description": "1-200 blocks in form order: { type, key?, ...its editor_insert* tool's params }; load_skill(\"requests\") lists types.",
        +      "items": {},
        +      "type": "array"
        +    },
        +    "language": {
        +      "description": "UI language tag. Default: the baseline's, else \"en\".",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "Dashboard name, max 100 chars. Same for every recipient: personalise through prefill and context.",
        +      "type": "string"
        +    },
        +    "settings": {
        +      "additionalProperties": {},
        +      "description": "formSettings_update's settings, fields by key; see load_skill(\"requests\").",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "theme": {
        +      "description": "{ light?, dark? }: preset id or whole formTheme_set theme per mode; wins over the baseline's."
        +    }
        +  },
        +  "required": [
        +    "name",
        +    "blocks"
        +  ],
        +  "type": "object"
        +}
      • changedInput schema / properties / formId / description
        Previous value: -"Published form to send. Call fields_list(formId) first for its keys."New value: +"Published form to send. Call fields_list(formId) first for its keys. Or pass form instead."
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace for form. Defaults to the token workspace.",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "formId"
        -]
    • Addedscheduler_listEventTypes
    • AddedworkspaceConnection_list
  5. 1 tool update
    • Changedrequest_create2 fields changed
      • changedInput schema / properties / delivery / description
        Previous value: -"\"none\" (default) returns the link for you to deliver; \"email\" sends the invitation (needs recipient.email; Pro+, or one of Free's 10 free invitations)."New value: +"\"none\" (default) returns the link for you to deliver; \"email\" sends the invitation (needs recipient.email; Pro+, or one of Free's 10 free invitations, which go only to your own address)."
      • changedInput schema / properties / reminders / description
        Previous value: -"Idle-time offsets, e.g. [\"2d\",\"5d\"] (max 5, units m/h/d). Omit to inherit the form schedule, [] for none. Needs recipient.email (Pro+)."New value: +"Idle-time offsets, e.g. [\"2d\",\"5d\"] (max 5, units m/h/d, at least 1h). Omit to inherit the form schedule, [] for none. Needs recipient.email (Pro+)."
  6. 1 tool update
    • ChangedtranslationDraft_update1 field changed
      • changedInput schema / properties / entries / items / properties / value / description
        Previous value: -"The translation as a Slate fragment (Descendant[]). Pass it as a NATIVE JSON array — e.g. [{\"text\":\"Bonjour\"}], or with marks/links like [{\"text\":\"more \"},{\"type\":\"link\",\"url\":\"https://x.com\",\"children\":[{\"text\":\"here\"}]}] — so you never hand-escape nested JSON (escaping a stringified fragment is the #1 cause of failed link/underline translations). A JSON-stringified array string is also accepted for back-compat. Even plain text MUST be an array of leaves, never a bare prose string. Mirror the source fragment's structure + marks (bold/italic/underline/strikeThrough/links/variables); only translate the leaf text. For email body keys (`email.*.body`), preserve the paragraph/block roots from `sourceFragment`; do not write leaf-only `[{\"text\":\"...\"}]`."New value: +"The translation as a rich-text fragment (Descendant[]). Pass it as a NATIVE JSON array — e.g. [{\"text\":\"Bonjour\"}], or with marks/links like [{\"text\":\"more \"},{\"type\":\"link\",\"url\":\"https://x.com\",\"children\":[{\"text\":\"here\"}]}] — so you never hand-escape nested JSON (escaping a stringified fragment is the #1 cause of failed link/underline translations). A JSON-stringified array string is also accepted for back-compat. Even plain text MUST be an array of leaves, never a bare prose string. Mirror the source fragment's structure + marks (bold/italic/underline/strikeThrough/links/variables); only translate the leaf text. For email body keys (`email.*.body`), preserve the paragraph/block roots from `sourceFragment`; do not write leaf-only `[{\"text\":\"...\"}]`."
  7. 76 tool updates
    • First observeddocument_create
    • First observededitor_deleteElement
    • First observededitor_formatText
    • First observededitor_getDocument
    • First observededitor_insertCalculatedField
    • First observededitor_insertCheckboxQuestion
    • First observededitor_insertContactQuestion
    • First observededitor_insertDateQuestion
    • First observededitor_insertDecisionQuestion
    • First observededitor_insertDocumentsBlock
    • First observededitor_insertEmbedded
    • First observededitor_insertFileQuestion
    • First observededitor_insertHeader
    • First observededitor_insertHiddenField
    • First observededitor_insertImage
    • First observededitor_insertLinearScaleQuestion
    • First observededitor_insertList
    • First observededitor_insertLogic
    • First observededitor_insertMatrixQuestion
    • First observededitor_insertNumberQuestion
    • First observededitor_insertPageDivider
    • First observededitor_insertParagraph
    • First observededitor_insertPaymentQuestion
    • First observededitor_insertPictureChoiceQuestion
    • First observededitor_insertRadioQuestion
    • First observededitor_insertRankingQuestion
    • First observededitor_insertRatingQuestion
    • First observededitor_insertRepeatingGroup
    • First observededitor_insertRow
    • First observededitor_insertScheduleAppointmentQuestion
    • First observededitor_insertSelectQuestion
    • First observededitor_insertSignatureQuestion
    • First observededitor_insertSwitchQuestion
    • First observededitor_insertTable
    • First observededitor_insertTextQuestion
    • First observededitor_insertTimeQuestion
    • First observededitor_insertVariable
    • First observededitor_setLogic
    • First observededitor_testLogic
    • First observededitor_updateElement
    • First observedfields_list
    • First observedform_create
    • First observedform_delete
    • First observedform_get
    • First observedform_list
    • First observedform_publish
    • First observedform_restore
    • First observedform_unpublish
    • First observedform_update
    • First observedformAnalytics_get
    • First observedformSettings_get
    • First observedformSettings_update
    • First observedformShareLink_create
    • First observedformShareLink_list
    • First observedformShareLink_update
    • First observedformSubmission_list
    • First observedformTheme_get
    • First observedformTheme_set
    • First observedload_skill
    • First observedload_tools
    • First observedrequest_cancel
    • First observedrequest_create
    • First observedrequest_get
    • First observedrequest_list
    • First observedrequest_remind
    • First observedrequest_replayCallback
    • First observedtranslationDraft_get
    • First observedtranslationDraft_publish
    • First observedtranslationDraft_update
    • First observedtranslationLanguage_delete
    • First observedtranslationLanguage_list
    • First observedworkspace_list
    • First observedworkspaceFolder_create
    • First observedworkspaceFolder_delete
    • First observedworkspaceFolder_list
    • First observedworkspaceFolder_update

Publisher details

Operator
Formbase AS · Publisher source
Operator website
https://formstep.io
Vendor relationship
First-party
Trust center
Not available
Restrictions
Not applicable

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Enables agents and apps to verify end-user identity through company API keys, human login links with multi-channel notifications, OIDC client registration, and budget-aware billing.
    13
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables identity verification from any MCP client by providing tools to create verification sessions, generate capture links, screen against sanctions and PEP lists, read results, and manage the review queue.
    19 npm
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Provides instant access to verified, enriched business intelligence for any UK company, including legal identity, financial health, web presence, and hiring activity in a single call.
    -
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.