RooQuiz
Server Details
Create and manage quizzes, question banks, and translations; capture and manage leads, respondents, and bookings; and pull stats and funnel analytics on RooQuiz — a lightweight assessment platform for lead capture and viral sharing.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
Available Tools
48 toolsadd_lead_commentAInspect
Write an internal follow-up note on a lead of the current team (visible to team members only, never to the respondent). Max 2000 characters. Optionally attach the record id of the submission the note is about, as context. Read existing notes with get_lead(includeComments: true). Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The note text | |
| leadId | Yes | The lead id (the leadId returned by list_leads) | |
| recordId | No | Optional record id this note is about (as returned by get_lead records / list_records) |
Output Schema
| Name | Required | Description |
|---|---|---|
| body | No | The note text as stored |
| leadId | No | The lead it was written on |
| commentId | No | The created note |
| createdAt | No | ISO datetime |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only say readOnlyHint=false and destructiveHint=false, which is minimal. The description adds valuable behavioral context: notes are visible to team members only, never to the respondent, max length is 2000 characters, and the operation is not idempotent — a timeout may still mean success, so blind retries can create duplicates. This goes well 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured: purpose and visibility first, then constraint, optional parameter context, read alternative, and idempotency warning. Every sentence adds information and no space is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with an output schema, the description covers all necessary context: what the operation does, visibility rules, constraints, how to read existing notes, and the retry hazard. The agent has enough information to correctly invoke the tool and handle unusual outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds extra nuance by explaining that recordId is optional 'context' about the submission, which clarifies its role more practically than the schema's phrasing. It also reinforces the body length limit in line with the schema's maxLength.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Write an internal follow-up note on a lead') and the resource ('lead of the current team'), while distinguishing it from sibling tools like update_lead or add_question by specifying it is an internal, team-only comment. The purpose is immediately evident and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool and points to an alternative for related behavior: 'Read existing notes with get_lead(includeComments: true).' It also gives important retry guidance by warning about the non-idempotent timeout behavior and how to handle it, leaving no ambiguity about when or how to retry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_questionAInspect
Append an item to the end of a form. type is a question type, Breaker (page break — only formId + type are needed, other fields are ignored) or a display block (Statement / Swiper). Question types: SingleCheck / MultiCheck / TrueFalse; FillBlank (free text — scored in quiz via correctAnswer, an unscored data-collection field in scored_quiz); DropDown (single or multiple via multiple — prefer it over SingleCheck/MultiCheck past 20 choices); Cascade (hierarchical via choices[i].children, scored_quiz only); Ordering (quiz only, order-sensitive grading); DateField / TimeField (unscored data-collection fields, scored_quiz only, no correctAnswer/score); NumberField (quiz: optional numeric correctAnswer + score; scored_quiz: the submitted number feeds report formulas); Rate (scored_quiz only, the submitted 1..steps rating is the question score unless per-star scores are set in the web app). Display blocks carry no answer: { type: "Statement", content } renders a rich-text passage (intro, section lead-in, disclaimer) and { type: "Swiper", items } an image carousel; both work in every scene. Configure random_knowledge_quiz question banks in the web app. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | NumberField only: maximum allowed input value (must be >= min). Rejected for other question types. | |
| min | No | NumberField only: minimum allowed input value (respondents cannot submit a smaller number). Rejected for other question types. | |
| code | No | Optional stable identifier for this question (field code). Omit it to let the server auto-generate one. Set a meaningful code (e.g. "q1") when report.formula or a dimension needs to reference this question, so you can write the formula as `{{q1}}` in the same call instead of round-tripping via get_form. Rules: start with a letter or underscore, then only letters/digits/underscores (no hyphens, spaces, or leading digit), at most 64 chars, and not a reserved math word (e, E, pi, PI, tau, phi, i, Infinity, NaN, true, false, null, undefined). Must be unique among all items in the form. | |
| name | No | Question stem text. Allows plain text or restricted HTML (tag allowlist: <p> <strong>/<b> <em>/<i> <u> <s> <mark> <span> <sup> <sub> <br>; other tags are stripped and the text kept). | |
| type | Yes | Question type; Breaker means a page break, no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer | |
| unit | No | NumberField only: display unit suffix shown after the input, e.g. "kg" / "$" / "min". Rejected for other question types. | |
| items | No | Swiper only, and required there: the carousel slides in display order, 1-10 of them. Upload the images with prepare_image_upload / finalize_image_upload first and pass the returned media IDs. Rejected for every other type. | |
| score | No | Points this question is worth, default 0 (not scored). Quiz scene: awarded when the answer matches correctAnswer, and a positive value is required once correctAnswer is set. Scored Quiz scene: pairing it with correctAnswer enables the fallback mode above, but choices[i].score is more flexible. Rejected in the outcome_quiz scene, for DateField / TimeField / Rate, and — in the scored_quiz scene — for NumberField (where the submitted number itself is the score) and FillBlank (collected only, never scored). | |
| steps | No | Rate only: number of rating steps, i.e. the highest rating (3-10, default 5). In the scored_quiz scene the submitted rating value (1..steps) is the question score, unless a per-star score is configured in the web app. Rejected for other question types. | |
| words | No | Rate only: optional scale labels evenly distributed under the rating control, e.g. ["Poor", "Excellent"] for the two endpoints (up to 5 labels). Rejected for other question types. | |
| formId | Yes | The form ID to append the item to | |
| aiMatch | No | Only for FillBlank in the knowledge_quiz scene. Enables AI grading: the AI compares the respondent answer against correctAnswer and scores by accuracy, instead of requiring an exact string match. Requires correctAnswer (the standard answer) and score > 0 (the score earned when accuracy reaches the threshold). Pass an empty object {} to enable with default settings; omit for plain exact-match grading. | |
| choices | No | Choice-based questions only (SingleCheck / MultiCheck / DropDown / Ordering / Cascade), where it is required; ignored for every other type, including TrueFalse — its two options come from trueLabel / falseLabel. Per-type limits: SingleCheck / MultiCheck 2-20 items — for a longer list use DropDown (2-100 items) instead; Ordering 2-10 items; Cascade nests via choices[i].children (up to 3 levels, at most 100 nodes in total). IMPORTANT (knowledge_quiz scene): vary the position of the correct option(s) across questions — do NOT always place the correct answer first. Distribute correct answers roughly evenly over all positions so they are not predictable. | |
| content | No | Statement only, and required there: the text respondents read — an intro, a section lead-in, instructions, a disclaimer. The block renders this and nothing else. Same rich-text rules as `description` (headings / lists / links / <img src> / math formulas). This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. | |
| explain | No | Optional answer explanation. The frontend renders it in the question's "answer explanation" field (DescriptionEditor); the rich-text rules are identical to description. Do not stuff the answer explanation into description — that is the question's supplementary note and will not be shown as an explanation to respondents/graders. | |
| shuffle | No | Ordering only: shuffle the displayed choice order for each respondent. Defaults to true for MCP-created questions — the stored choices order would otherwise leak the correct order when correctAnswer matches it. Pass false only when the initial order is intentionally meaningful. Rejected for other question types. | |
| multiple | No | DropDown only: allow selecting multiple options (default false = single select). Affects the quiz-scene correctAnswer shape: an array of labels/codes when true, a single one when false. Rejected for other question types (SingleCheck/MultiCheck are inherently single/multi). | |
| required | No | Whether the question is required, default false | |
| precision | No | DateField / TimeField only: picker precision. DateField accepts year | month | day | hour | minute | second (default day; e.g. "month" shows a year-month picker, "second" a full datetime picker). TimeField accepts only minute | second (default minute). Ignored for other question types. | |
| trueLabel | No | TrueFalse only: custom display text for the "true" option (e.g. "Yes" / "Agree"). Ignored for other question types. Leave empty to fall back to the built-in default for the form language ("Correct" in English forms). Does not change the stored answer value, which stays "true". | |
| falseLabel | No | TrueFalse only: custom display text for the "false" option (e.g. "No" / "Disagree"). Ignored for other question types. Leave empty to fall back to the built-in default for the form language ("Incorrect" in English forms). Does not change the stored answer value, which stays "false". | |
| description | No | Optional supplementary note for the question. Allows a wider HTML subset: everything the stem allows + <h1>-<h6> <ul> <ol> <li> <blockquote> <a href> <img src> <hr> <art-field> (variable placeholder, data-type / data-cid); unsafe protocols (javascript:/data:) and unknown attributes are stripped. This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. | |
| trueOutcomes | No | Outcome scene + TrueFalse only (required there together with falseOutcomes): the outcome codes that answering "true" votes for. Use [] for a side that votes for nothing. Rejected for other question types / scenes. | |
| correctAnswer | No | The "correct answer" of the knowledge_quiz scene; setting it makes the question scored, so pair it with a positive `score`. The shape follows the question type — see the anyOf branches; a choice is referenced by its label or its code, so reference it by code whenever the same label appears more than once (Ordering rejects an ambiguous label outright). Required on SingleCheck / MultiCheck / DropDown / Ordering in the knowledge_quiz scene, optional on FillBlank / NumberField there. NumberField answers must be typeable within min / max and decimalPlaces. Rejected for DateField / TimeField / Rate (data-collection and rating fields; configure date/time scoring in the web app), rejected for FillBlank in the scored_quiz scene (free text is collected only there), and rejected in the outcome_quiz scene (no right or wrong answers there). In the scored_quiz scene prefer choices[i].score per option; passing correctAnswer + score there only falls back to "the matching choice gets score, others get 0". | |
| decimalPlaces | No | NumberField only: how many decimal places respondents may enter (stored as the field's numeric precision), default 0 = integers only. Rejected for other question types. Note this is different from the string `precision` of DateField / TimeField. | |
| falseOutcomes | No | Outcome scene + TrueFalse only (required there together with trueOutcomes): the outcome codes that answering "false" votes for. Use [] for a side that votes for nothing. Rejected for other question types / scenes. | |
| trueDimensionScores | No | scored_quiz scene + TrueFalse only: the points answering "true" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes. | |
| falseDimensionScores | No | scored_quiz scene + TrueFalse only: the points answering "false" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| field | No | The created question, including its generated code |
| formId | No | The form that was edited |
| itemCount | No | Question / page-break count after the append |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations say only that the tool is not read-only and not destructive, so the description carries the full burden — and it delivers. The non-idempotency warning ('if the call times out it may still have succeeded... retrying blindly can create a duplicate') is exactly the behavioral disclosure an agent cannot infer. It also clarifies ignore-vs-reject semantics ('other fields are ignored', 'rejected for other question types'), preventing misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence names the core operation, and the long body earns its length because the tool genuinely spans 14 enum values and three scoring scenes. The nested parentheticals ('scored via correctAnswer, an unscored data-collection field in scored_quiz') reduce scanability, so a structured per-type summary would be clearer — but nothing in the prose is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 28-parameter tool with nested objects and complex scene/type interactions, the description plus the schema's own field-applicability summary cover every call-shaping decision: per-type required fields, scene restrictions, rejection behavior, and retry safety. An output schema exists, so return-value documentation is appropriately left out of the description's job.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every one of the 28 parameters, but the description adds cross-field semantics the schema cannot: which fields to omit per type, the correctAnswer-shape dependency on `multiple`, and the scene-level interplay (e.g., 'the submitted number feeds report formulas' for NumberField). This meaningfully raises the value above the baseline 3 that full schema coverage alone earns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb plus resource — 'Append an item to the end of a form' — and pins the position ('end'), which sets it apart from the sibling insert_question without needing to name it. The body then enumerates the 14 item types and contrasts them with display-only blocks, so an agent knows exactly what this tool creates versus create_form.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong situational guidance: prefer DropDown over SingleCheck/MultiCheck past 20 choices, maps each question type and field to its scene (quiz / scored_quiz / outcome_quiz), and routes random_knowledge_quiz bank setup to the web app as an explicit exclusion. It does not name sibling insertion/update tools as alternatives, so the append-vs-insert contrast is implied rather than stated — the only gap from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assign_leadsAInspect
Assign one or more leads of the current team to a member, or clear the assignee. Pass every lead id in a single call (up to 50) — do not loop one call per lead. The assignee must be an active non-viewer member (see list_lead_settings.assignableMembers); pass "me" for yourself, or omit / null to unassign. Each change is recorded on the lead's timeline, and the assignee gets one aggregated notification for the whole batch.
| Name | Required | Description | Default |
|---|---|---|---|
| leadIds | Yes | The lead ids to assign, max 50 per call | |
| assigneeId | No | The member userId to assign to, or "me" for the current token's own user. Omit (or pass null) to clear the assignee. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | How many leads were changed |
| items | No | Per-lead result |
| assigneeId | No | The member they were assigned to, or null when cleared |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses notable side effects: 'me' or null to unassign, timeline recording for each change, and one aggregated notification for the whole batch. It also sets the member eligibility constraint, which is behavioral context the annotations don't convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then packs behavioral details into a compact statement. It's slightly longer than necessary but every sentence adds distinct value, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a complete schema, annotations consistently marking mutation/non-destruction, and an output schema present, the description supplies the remaining essential context: batching limits, assignee viability requirement, and side effects. It gives an agent enough information to call the tool correctly in one pass.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage for both parameters, including max 50 and 'me' semantics. The description adds extra meaning by clarifying that omitting or passing null unassigns, and by explaining the batching constraint directly in the tool's workflow rather than only in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('assign') and resource ('leads') and clarifies the dual behavior: assign to a member or clear the assignee. It clearly distinguishes from siblings like update_lead by focusing on the assignment operation and batching rules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives actionable usage guidance: pass all lead ids in a single call up to 50, don't loop per lead, and the assignee must be an active non-viewer member. It references list_lead_settings for valid assignees, though it doesn't explicitly mention alternative tools or 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.
create_formAInspect
Create a form in the team this token is bound to. Pass the questions array and report configuration in one call instead of following up with per-question calls. In the outcome_quiz scene report.outcomes is REQUIRED at create time (TrueFalse votes via trueOutcomes/falseOutcomes). For a scored_quiz with dimensions, define report.dimensionAnalysis.dimensions with codes and formulas over question codes in this same call; a question may override its score for one dimension via choices[i].dimensionScores (TrueFalse: trueDimensionScores/falseDimensionScores). The returned structuredContent.fields carries each question code — read those first, then fill in a scored_quiz report.formula (e.g. q_a + q_b) or a report.dimensionAnalysis via update_form / set_dimension_analysis. Creates the primary language only; add other languages with create_form_translation. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
| Name | Required | Description | Default |
|---|---|---|---|
| scene | Yes | quiz=exam, scored_quiz=scored_quiz, outcome=typing quiz (votes decide which outcome type wins) | |
| theme | No | Optional visual theme matching the quiz topic/mood. Default light. Pick the one that best fits the quiz: light (clean neutral bright; default — formal/general quizzes); corporate (professional blue+gray; B2B, career, business assessments); dark (modern sleek dark; tech, night, cool personality quizzes); cupcake (soft pink cute rounded; fun, food, kids, lighthearted); pastel (gentle pastel artsy; lifestyle, aesthetics, soft mood); valentine (pink romantic hearts; love, relationships, holidays); synthwave (neon purple/pink retro; gaming, trends, bold personality); luxury (dark + gold premium; finance, luxury brands, high-end); forest (deep green nature; environment, health, outdoors); coffee (warm brown cozy; food & drink, cafe, lifestyle); autumn (warm orange/brown seasonal; autumn, cozy, harvest); halloween (purple+orange spooky; Halloween, horror, festive fun); night (deep calm blue; astronomy, mindfulness, calm tech); cyberpunk (high-contrast neon yellow; tech, esports, gaming). | light |
| title | Yes | Form title (1-200 characters) | |
| report | No | Report configuration. knowledge_quiz / scored_quiz: overallAnalysis fields are flat at the top level and dimensionAnalysis is nested (strongly recommended for the scored_quiz scene, optional for the knowledge_quiz scene). outcome: only the outcomes key is allowed, and it is required at create time. | |
| language | No | Default zh_CN | zh_CN |
| openGraph | No | Social share card (Open Graph) settings: the title / description / image shown when the answer link is shared to social media or chat apps. In update_form each sub-key is merged independently (only the keys you pass change; pass an empty string to clear one). SEO keywords are generated automatically and cannot be set here. | |
| questions | No | Optional. A list of questions/page breaks to create at once, written into form.fields in order. Question types: SingleCheck/MultiCheck/TrueFalse; FillBlank (free text — scored in quiz via correctAnswer, an unscored data-collection field in scored_quiz); DropDown (single or multiple via `multiple`, use it instead of SingleCheck/MultiCheck when there are more than 20 choices); Cascade (hierarchical choices via children, scored_quiz only); Ordering (quiz only, correctAnswer = all choices in the correct order); DateField/TimeField as unscored data-collection fields (scored_quiz only); NumberField (quiz: optional numeric correctAnswer + score; scored_quiz: the submitted number feeds report formulas); Rate (scored_quiz only, the 1..steps rating value is the question score unless per-star scores are set in the web app). Insert a page break with { type: "Breaker" }, which the AI can interleave between questions to paginate. Display blocks collect no answer: { type: "Statement", content } is a rich-text passage (intro / section lead-in / disclaimer) and { type: "Swiper", items } an image carousel. At most 100 items. | |
| systemText | No | Optional. Answer-page system text overrides as a key→text map; empty values are dropped and fall back to the language default. | |
| description | No | Optional form description. Allows description-scope rich text (including <img src>). This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The new form id |
| url | No | Admin edit URL |
| scene | No | knowledge_quiz / scored_quiz / outcome_quiz |
| theme | No | Answer-page theme name |
| title | No | Form title |
| fields | No | Every question code — read these before writing a formula or dimensions |
| language | No | Primary language of the form |
| outcomes | No | Outcome types (outcome_quiz scene only) |
| shareUrl | No | Public share / answer link |
| hasReport | No | Whether a report configuration was passed |
| publicToken | No | Token behind the public answer link |
| questionCount | No | How many questions / page breaks were created |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnlyHint=false and destructiveHint=false; the description adds crucial behavioral context beyond them: creates primary language only, is not idempotent, timeout may still mean success, and retrying blindly can create duplicates. It also discloses that structuredContent.fields carries question codes and that the user must read them first before filling formulas. This is substantial behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but not bloated. It front-loads the key purpose and workflow before diving into scene-specific details, and every sentence carries meaningful guidance. It could arguably be slightly shorter, but the density is justified given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's very high complexity (nested report and question schemas, three scenes, multiple scoring modes) and the fact that an output schema exists, the description covers the essential workflow seams: what must be provided at create time, what must be deferred to update calls, the idempotency warning, and the language restriction. Nothing an agent needs to decide between creating vs. updating is left ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 elevates this by providing cross-parameter workflow semantics (e.g., the relationships between questions codes, report.formula, dimensionAnalysis, and the returned structuredContent). It explains creation-time dependencies that the schema's individual field descriptions cannot express, though much of the parameter meaning is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Create a form in the team this token is bound to') and immediately differentiates itself from sibling tools by noting it passes questions and report configuration in one call rather than per-question follow-ups. It clearly distinguishes the create operation from update_form, set_dimension_analysis, and create_form_translation, which are named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use create_form vs. update_form / set_dimension_analysis (fill in formula and dimensionAnalysis afterwards) and vs. create_form_translation (primary language only, add other languages separately). It also gives precise scene-specific guidance (outcome_quiz requires report.outcomes at create time; scored_quiz dimensions must be defined in the same call).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_form_from_templateAInspect
Create a new form in the current team from a public template (find template ids with list_templates). Clones the template structure, scoring/report configuration, visual settings, and all language versions in one call; pass title to override the template title. After creation you can adjust it with update_form / update_question etc. This is the fastest way to build a quiz when a suitable template exists — prefer it over building from scratch with create_form. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Optional new form title; defaults to the template title | |
| templateId | Yes | The template ID to create the form from |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The new form id |
| url | No | Admin edit URL |
| scene | No | knowledge_quiz / scored_quiz / outcome_quiz |
| title | No | Form title |
| language | No | Primary language cloned from the template |
| shareUrl | No | Public share / answer link |
| publicToken | No | Token behind the public answer link |
| translationLanguages | No | Languages cloned along with the structure |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond annotations by disclosing that the call clones structure, scoring/report configuration, visual settings, and all language versions in one call. It also surfaces the critical non-idempotency behavior: timeouts may have succeeded, so blind retries can create duplicates. This is exactly the kind of behavioral nuance an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence contributes: what it does, what it copies, how to override the title, where to find template IDs, when to prefer it, and the duplicate-risk caveat. It is front-loaded with the core action and includes no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter creation tool with an output schema, the description covers the essential context: source of IDs, scope of cloning, post-creation workflow, alternatives, and unique failure behavior. The non-idempotency warning addresses the most important edge case an agent could encounter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema documents both parameters. The description adds practical meaning by explaining how to discover a templateId via list_templates and how title overrides the template title. This supplements the schema without repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create a new form in the current team from a public template.' It further distinguishes this tool from sibling create_form by positioning it as the template-based path, and points to list_templates for ID lookup. This is unambiguous and well-separated from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: prefer this when a suitable template exists, versus building from scratch with create_form. It also references list_templates for finding template IDs and mentions post-creation adjustment via update_form / update_question. This effectively routes the agent to the correct tool among many siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_form_translationAInspect
Add a language version (translation) to a form. Clones the source text as the initial draft and returns it so you can translate right away: edit the human-readable text in place, keep every code identical to the source, then save with update_form_translation. The language must differ from the form's primary language, and there is at most one translation per language (see list_form_translations).
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The source form UUID | |
| language | Yes | Target language for the new version. Must differ from the form's primary language. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cloned | No | The cloned source draft — translate the text in place, keep every code, then save |
| formId | No | The source form |
| language | No | Language of the new version |
| shareUrl | No | Public link for this language (source token + ?lang=) |
| translationId | No | The new translation id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses key behaviors: the source text is cloned into the new version, the result is returned for immediate translation, and code fields must stay identical to the source. This gives the agent a clear model of what happens on invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the main action and outcome are in the first sentence, followed by essential workflow constraints in the second. No filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the purpose, constraints, next steps, and relationship to sibling tools. With an output schema present and annotations providing safety cues, nothing critical is missing for an agent to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both formId and language with 100% coverage. The description adds contextual meaning (language must differ, translation is per-language) but does not introduce new parameter details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: add a language version (translation) to a form. It also distinguishes itself from related siblings like update_form_translation and list_form_translations by explaining the cloning and post-save workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit context: language must differ from primary, at most one translation per language, and the workflow of editing then calling update_form_translation. It also points to list_form_translations for checking existing translations. It could be more explicit about when not to use this tool, but the constraints strongly imply that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_formADestructiveInspect
Move a form into the trash (soft delete) in the current team. The form is hidden from list_forms but kept recoverable for 5 days (then auto-purged); use restore_form to bring it back. Only the form owner or the team owner / admin can delete. Submission records are kept until permanent purge.
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The form UUID to move to trash |
Output Schema
| Name | Required | Description |
|---|---|---|
| formId | No | The form moved to trash |
| message | No | Human-readable result, including how long it stays recoverable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate destructive behavior, but the description adds substantial context beyond that: soft delete semantics, 5-day recoverable window, auto-purge behavior, and that submission records are preserved until permanent purge. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with the core action front-loaded, followed by recovery, permissions, and data-retention details. Every sentence contributes meaningful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter soft-delete tool, the description covers the essential context: what happens to the form, how long it remains recoverable, how to restore it, who has permission, and what happens to submissions. The output schema and annotations cover the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter formId is already described as 'The form UUID to move to trash.' The description adds the 'current team' scope but otherwise relies on the schema, which is acceptable at the baseline for full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: 'Move a form into the trash (soft delete) in the current team.' It clearly differentiates from siblings like restore_form and delete_form_translation by naming the exact operation and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use restore_form as the recovery alternative, notes that the form is hidden from list_forms after deletion, and states the permission requirement (form owner or team owner/admin). This gives clear guidance on when and by whom the tool can be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_form_translationADestructiveInspect
Delete one language version (translation) of a form. Submission records are anchored to the source form and are NOT deleted; reports for historical records in this language fall back to the source text. The primary language cannot be deleted this way (it lives on the form itself).
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The source form UUID | |
| language | Yes | Which language version to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
| formId | No | The source form |
| deleted | No | Always true on success; submission records are kept |
| language | No | Language version that was deleted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though the destructiveHint annotation already marks this as a destructive operation, the description goes further by stating that submission records are anchored to the source form, are not deleted, and that historical reports fall back to the source text. This is exactly the kind of behavioral consequence an agent needs before calling a delete operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences no unnecessary words. The main action appears immediately, followed by the two most important side-effect insights, then a constraint. Everything is structured for fast parsing by an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the purpose, the exact scope (per-language translation), the side-effect safety guarantee (submissions not deleted), the report fallback behavior, and the primary-language restriction. With the input schema and output schema present, nothing relevant to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers both parameters with 100% coverage, so a baseline of 3 is appropriate. The description adds additional meaning by clarifying that the 'language' parameter must be a non-primary translation language, which is important selection guidance beyond the bare enum 'Which language version to delete.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise action-verb and resource: 'Delete one language version (translation) of a form.' That clearly identifies what the tool does and naturally sets it apart from deleting an entire form. The final sentence reinforces the boundary by noting the primary language is not affected by this operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear intended use—deleting a translation language—and explicitly warns that the primary language cannot be removed through this tool. It does not name sibling alternatives like 'delete_form' when a full form deletion is intended, so a small routing gap remains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_questionADestructiveInspect
Delete a single item from a form by code — a question, a page break (Breaker) or a display block (Statement / Swiper). Deleting the last one is allowed (a form can be an empty shell).
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The code of the question to delete | |
| formId | Yes | The form ID the question belongs to |
Output Schema
| Name | Required | Description |
|---|---|---|
| formId | No | The form that was edited |
| deletedCode | No | The question code that was removed |
| remainingCount | No | Question / page-break count left in the form |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, so the description's mention of 'delete' is consistent. The description adds valuable behavioral context beyond annotations: it explicitly states that deleting the last item is permitted (form can be empty), and clarifies that it handles non-question entities (page breaks, display blocks). This transparency about edge cases exceeds what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and scope. It efficiently packs key information: the primary purpose, the range of deletable item types, and an important edge rule (deleting the last one). No redundant words or irrelevant details; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation with only two well-described parameters and an existing output schema, the description covers the essential behavioral gaps: what can be deleted and the rule about the last item. It would be improved by mentioning any side effects or cascading behavior, but for this tool's simplicity the coverage is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (formId and code) are already documented. The description's phrase 'by code' reinforces the code parameter but adds no new semantics not present in the schema. With high coverage, a baseline of 3 is appropriate; the description does not need to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb ('Delete'), a specific resource ('a single item from a form'), and enumerates the allowed item types (question, page break, display block). It clearly separates this tool from delete_form and delete_form_translation by scoping to individual components. The addition of the 'last one is allowed' rule further clarifies the exact scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by specifying what it deletes, but it does not explicitly contrast with alternatives like delete_form or state when to choose this over other deletion tools. The context (sibling names) makes the distinction obvious, but the description itself lacks explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_formAInspect
Duplicate a form in the current team: clones its structure, scoring, report, visual settings and all language translations into a brand-new form owned by you (with fresh share links). Does NOT copy submission records, sharing, integrations, or ban state. Useful for cloning a proven quiz and tweaking it. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
| Name | Required | Description | Default |
|---|---|---|---|
| newTitle | No | Optional title for the copy; defaults to "<source title> (copy)" | |
| sourceFormId | Yes | The form UUID to duplicate |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The new (copied) form id |
| url | No | Admin edit URL of the copy |
| scene | No | knowledge_quiz / scored_quiz / outcome_quiz |
| title | No | Title of the copy |
| shareUrl | No | Public share / answer link of the copy |
| fieldCount | No | How many questions were copied |
| publicToken | No | Fresh token of the copy |
| translationLanguages | No | Languages copied along with the structure |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the schema: it states exact cloned fields, what is deliberately excluded, that share links are regenerated, and that the operation is not idempotent after a timeout. This is especially important for a mutating tool with no annotations to disclose side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded, covers what, what-not, and how-to-avoid-duplication in four dense sentences. Every sentence adds meaningful value, and the non-idempotency warning is high-value rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description thoroughly covers selection and side-effect safety. The only notable gap is that it does not explicitly state what the tool returns (such as the new form object/id), which would be helpful in a multi-step workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters fully, including the default title for newTitle. The description adds no significant parameter-level meaning beyond what the schema provides, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('duplicate a form') and precisely enumerates what is and is not cloned, making its purpose unmistakable. It also distinguishes itself from related sibling tools by stating it creates a brand-new copy with fresh share links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: 'useful for cloning a proven quiz and tweaking it', and warns against relying on it for things like preserving submission records or sharing. It does not name a specific alternative tool to use instead, but the 'does not copy' list clearly communicates 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.
finalize_image_uploadAInspect
Step 2 of 2 for adding an image: call this AFTER you have PUT the file to the uploadUrl returned by prepare_image_upload. It verifies the uploaded object in storage, records it in the team media library and returns a media id + public URL. To use the image as a quiz cover or a landing-page cover, call update_form with flagImg or landingImage set to the returned media id.
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | Optional alt text for the image. | |
| key | Yes | The object key returned by prepare_image_upload. | |
| filename | Yes | Original filename for admin display / download (same value passed to prepare_image_upload). | |
| mimeType | Yes | Image MIME type used at prepare time. Must be one of image/png, image/jpeg, image/gif, image/webp. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | Permanent object key |
| url | No | Public URL of the stored image |
| mediaId | No | Media id — pass it to update_form as flagImg / landingImage |
| filename | No | Original filename |
| filesize | No | Size in bytes, as measured on storage |
| mimeType | No | Detected image MIME type |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly discloses the state-changing effects: verifying the object, recording it in the team media library, and returning a media ID and public URL. This adds behavior beyond annotations. It also implicitly warns that the upload must exist for verification, though it does not fully describe error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences capture the full workflow. The front-loaded 'Step 2 of 2' orients the user immediately, and every sentence in the description adds useful information with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the prerequisite sequence, the side effects, the return value, and downstream usage. With an output schema available and a complete parameter schema, nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 coordination semantics by noting that key, filename, mimeType are the values from prepare_image_upload, which is critical for correct invocation. Alt text is not described in the prose but is already explained in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific verb 'finalize', positions it as 'Step 2 of 2' for adding an image, and clearly distinguishes it from prepare_image_upload. It says exactly what the tool does: verifies the upload, records it in the media library, and returns a media ID and public URL.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is explicit: call this AFTER the PUT request to the uploadUrl from prepare_image_upload. It also provides downstream guidance for using the returned media id with update_form for covers. This makes when-to-use vs. alternatives unmistakable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_active_tenantARead-onlyInspect
Return the team (tenant) this token is currently operating against. All write tools default to this team. Also reports examineeSignupDisabled: when true this team has switched respondent self-signup off, so only respondents already on its roster can sign in — every quiz that asks for a login (submissionAccess examinee_only, or login_to_view_report at the report gate) turns away anyone new. Check it before blaming a quiz for "nobody can submit".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Team id |
| name | No | Team name |
| role | No | Your role in this team |
| slug | No | Team slug |
| examineeSignupDisabled | No | true = respondent self-signup is off for this team, so any quiz that asks for a login turns away respondents who are not on the roster yet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only behavior, so the description adds valuable context beyond them: it reveals the additional `examineeSignupDisabled` field and explains why it matters for quizzes requiring login. This is useful behavioral insight that an agent would otherwise not infer from the schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is slightly longer than the most minimal needed, but each clause carries meaning, including the nuanced exam-signup explanation. It is front-loaded with the core purpose and elaborates in a way that earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters and an output schema, the only important context an agent needs is what the active tenant means and how to interpret the notable field. The description covers the full usage scenario, including the 'nobody can submit' pitfall, making it complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so the description rightly spends no time on them. The baseline is 4 since there is no parameter semantics gap to compensate for; the description's focus on the return fields is the appropriate semantic equivalent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies a clear verb ('Return') and resource ('team (tenant) this token is currently operating against') while also clarifying the relevant scope: active tenant, as opposed to a list of all tenants or switching. The added detail about write tools defaulting to this team further disambiguates this from sibling getters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly tells when to check the active tenant ('Check it before blaming a quiz for "nobody can submit"') and explains the field's implications for signup behavior. It does not explicitly name alternatives or exclusion cases, but the intent is unambiguous given the context and sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_booking_availabilityARead-onlyInspect
Read the current team's bookable time slots in a date range, computed from the team's weekly booking rules minus what is already taken. Returns enabled:false when the team has booking switched off or the plan does not include it. Pass bookingId to get the slots for rescheduling that booking (its own slot is not counted as taken) — always call this before reschedule_booking, since a start time outside the available slots is rejected. The range is clamped server-side if you ask for too many days.
| Name | Required | Description | Default |
|---|---|---|---|
| toDate | Yes | Range end (exclusive), ISO datetime | |
| fromDate | Yes | Range start, ISO datetime | |
| bookingId | No | Optional: compute availability for rescheduling this booking, excluding the slot it currently occupies. Omit to see availability for the team as a whole. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slots | No | Bookable start times as ISO datetimes — reschedule_booking only accepts one of these |
| enabled | No | false when the team has booking off or the plan does not include it |
| timezone | No | The team's booking timezone |
| slotSeats | No | Per-slot capacity |
| requireApproval | No | Whether new requests need approval (returned when booking is off) |
| slotDurationMinutes | No | Length of one slot |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by disclosing behavioral nuances: returned availability is computed from weekly rules minus taken slots, enabled:false appears when booking is off or plan doesn't include it, the booking's own slot is excluded when rescheduling, and server-side clamping of the date range. This is detailed and non-obvious 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence adds relevant information: core functionality, failure/disabled state, rescheduling behavior, required ordering, and clamping. It is front-loaded with the core action and flows naturally from general to specific, with no filler or repeated schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the central behavior, edge cases (disabled/enabled:false), rescheduling nuances, server-side constraint, and relationship to required sibling call, leaving little to infer. The existence of an output schema reduces the need to explain return shape; the added context about the bookingId parameter and clamping is more than enough for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters with descriptions, so the baseline is 3. The description additionally enriches the meaning of bookingId by explaining its role in rescheduling and non-counted slots, and warns about server-side range clamping—but it does not substantially expand on fromDate/toDate beyond the schema's 'ISO datetime' and 'exclusive' scope.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read'), a resource ('bookable time slots'), and the computation source ('weekly booking rules minus what is already taken'). It is clearly distinguished from sibling tools by its scope (availability vs. bookings/leads/forms), and the mention of reschedule_booking shows where it fits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context for when to use the bookingId variant and the strong instruction to call this before reschedule_booking because out-of-range start times are rejected. It does not explicitly name alternatives to exclude or mention when to prefer list_bookings, but the usage context is clear and practically actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_examineeARead-onlyInspect
View the full detail of one examinee (a.k.a. respondent) in the current team by its examineeId (the business ID shown in list_examinees, e.g. AB1234567890), including customData. Sensitive auth fields are never returned.
| Name | Required | Description | Default |
|---|---|---|---|
| examineeId | Yes | The examinee business ID (e.g. AB1234567890), as shown in list_examinees |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Masked name (J*n) |
| No | Masked email (j***g@example.com); never pass it back as an argument | |
| avatar | No | Uploaded avatar as { id, url } |
| status | No | Account status |
| tenant | No | Team (tenant) the respondent belongs to |
| createdAt | No | ISO datetime of first sign-up |
| updatedAt | No | ISO datetime of the last change |
| customData | No | Team-defined custom fields; phone-typed values come back masked |
| examineeId | No | Business ID of the respondent (e.g. AB1234567890) — use it to address them |
| avatarPreset | No | Preset avatar key, when no image was uploaded |
| emailVerified | No | Whether the email has been verified |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses useful behavioral context beyond annotations: it says customData is included and that sensitive auth fields are never returned. These are meaningful runtime guarantees that help the agent interpret results and set expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the core action and resource, adds the key identifying constraint, and closes with the important security behavior. There is no wasted language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a simple fetch-by-ID tool with only one required parameter, an output schema, and helpful annotations, the description is complete. It covers scope, identifier provenance, response contents, and the non-return of sensitive fields, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the parameter at 100% coverage, including the business ID example. The description reinforces that the ID is from list_examinees and gives an example, but adds little new semantic meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('View') and resource ('full detail of one examinee'), with a clear scope ('in the current team') and the exact identifier to use. It also distinguishes itself from list_examinees by clarifying it returns full detail rather than a summary list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool: when a caller needs full examinee detail or customData rather than just the identifier list. It does not explicitly name alternatives or exclusions, but the contrast with list_examinees and the single-ID focus provide adequate usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_formARead-onlyInspect
View one form of the current team in full, including the questions list fields[] and the report configuration. For outcome forms, the outcome codes that question votes reference live in report.outcomeAnalysis.outcomes. language is the primary language; existing non-primary language versions are listed in translationLanguages.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The form UUID | |
| includeFields | No | Whether to return fields[] (raw data of questions + page breaks), default true. For large forms you can pass false to skip | |
| includeReport | No | Whether to return the report configuration, default true |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Form id |
| scene | No | knowledge_quiz / scored_quiz / outcome_quiz |
| theme | No | Answer-page theme name |
| title | No | Form title |
| fields | No | Full question list with code / choices / scoring (only when includeFields) |
| report | No | Report configuration, trimmed to the scene (only when includeReport) |
| isActive | No | Whether the form is open for submissions |
| language | No | Primary language |
| shareUrl | No | Public share / answer link |
| createdAt | No | ISO datetime |
| openGraph | No | Social share card { title, description, image, keywords } |
| updatedAt | No | ISO datetime |
| systemText | No | Overridden system copy, keyed by text key |
| description | No | Form description |
| publicToken | No | Token behind the public answer link |
| translationLanguages | No | Languages that already have a translation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and non-destructive; the description adds value by revealing where outcome codes live and how language versions are represented. This is helpful context beyond the annotations, though it does not discuss errors or edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded, and every sentence carries meaningful scoping or nesting information. It is easy to scan and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the read-only annotations, full schema coverage, and presence of an output schema, the description covers what an agent needs to invoke the tool successfully. It also provides helpful pointers into the response structure, though it could clarify the active-tenant context slightly more explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage and clearly documents id, includeFields, and includeReport with defaults. The description mentions fields[] and report configuration but does not add much parameter-specific guidance beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('View one form of the current team in full') and explicitly names the main contents: questions fields[] and the report configuration. This clearly distinguishes it from sibling tools like list_forms, get_form_translation, and get_form_funnel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it — when a single form's full configuration is needed — but it does not explicitly contrast the tool with alternatives or provide when-not-to-use guidance. The 'current team' scope is useful, but the choice between this and related getters is left to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_form_funnelARead-onlyInspect
Read the conversion funnel for a form in the current team over the last N days, from the form_sessions telemetry: overall stages (viewed → started → submitted → leadCaptured → reportViewed → ctaClicked → shared), per-channel funnel (by utm_source, with embedded flag), UTM combos, and drop-off points (which question unsubmitted sessions stalled on). Use this to find where respondents drop and improve conversion.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days, default 30, max 180 | |
| formId | Yes | The form UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | No | Look-back window actually used |
| formId | No | The form this funnel belongs to |
| dropOff | No | Where unsubmitted sessions gave up |
| overall | No | Stage counts: { viewed, started, submitted, leadCaptured, reportViewed, ctaClicked, shared } |
| channels | No | Funnel split by channel |
| utmCombos | No | Funnel split by UTM combo |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and non-destructive, and the description adds behavioral context: the data source (form_sessions telemetry), scoping to the current team, the look-back window, and the specific funnel/drop-off reports returned. This goes beyond the annotations and clearly sets expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but not padded. It front-loads the core purpose and then enumerates the specific outputs. The funnel stage list and per-channel breakdowns are informative and earn their place, though the sentence is slightly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema, high schema parameter coverage, and safety annotations, the description is complete enough for an agent to select and invoke the tool correctly. It specifies scope, data source, output dimensions, and the intended use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 formId and days including default and max/min. The description only reflects the 'last N days' notion without adding new meaning to parameters. This matches the baseline expected when schema carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Read the conversion funnel for a form in the current team over the last N days'. It then enumerates the exact funnel stages and breakdowns, making it clearly distinct from generic siblings like get_form_stats or get_form.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear intended use: 'Use this to find where respondents drop and understand/improve conversion.' It implies this tool is for conversion analysis rather than general form reading or stats, but it doesn't explicitly exclude alternatives or mention 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.
get_form_statsARead-onlyInspect
Read submission statistics for a form in the current team over the last N days: KPI overview (total / today / last 7 / last 30, unique examinees, anonymous, report status counts, average score, latest submission), daily submission trend, channels (by utm_source), UTM combos, login types (anonymous vs registered), device breakdown, and per-question answer distributions. Use this to gauge how a quiz is performing and to suggest improvements.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days, default 30, max 180 | |
| formId | Yes | The form UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | No | Look-back window actually used |
| trend | No | One entry per day in the window, zero-filled |
| formId | No | The form these stats belong to |
| devices | No | Submissions by device type |
| channels | No | Submissions by utm_source |
| overview | No | KPI block: { totalSubmissions, todaySubmissions, yesterdaySubmissions, last7daysSubmissions, last30daysSubmissions, uniqueExaminees, anonymousSubmissions, reportCompleted, reportFailed, reportPending, avgScore, latestSubmittedAt } |
| utmCombos | No | Submissions by UTM combo |
| loginTypes | No | Anonymous vs registered submissions |
| answerDistributions | No | Per-question answer distribution (choice-style questions only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds useful behavioral context by specifying the scope ('current team', 'last N days') and the precise breadth of what is returned, which goes beyond the raw schema annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the verb, resource, time scope, and team scope, then lists the returned statistical categories. It is a long single sentence, but each part is useful and not redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool returns a rich set of analytics, and the description covers the operation, scope, time window, and the actual data product, while the output schema handles formal return details. Nothing important needed to call or interpret the tool correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter schema coverage is 100%, with both formId and days documented. The description adds little semantic detail beyond calling days 'last N days', which aligns with the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete, non-generic operation: 'Read submission statistics for a form in the current team over the last N days', then enumerates the specific report components it returns. It clearly distinguishes this tool from sibling operations like get_form_funnel or list_records, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear intended use: 'Use this to gauge how a quiz is performing and to suggest improvements.' However, it does not explicitly contrast with alternatives like get_form_funnel or get_form, so it lacks explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_form_translationARead-onlyInspect
Read the full content of one language version (translation) of a form, including the mirrored fields[] and report. Use this to fetch the current draft before translating: edit the human-readable text in place, keep every code identical to the source form, then save with update_form_translation. Returns an error if that language version does not exist yet (create it first with create_form_translation).
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The source form UUID | |
| language | Yes | Which language version to read |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | No | Translated title |
| fields | No | Translated questions, mirroring the source codes |
| formId | No | The source form |
| report | No | Translated report copy |
| isActive | No | Whether this language version is live |
| language | No | Language of this version |
| shareUrl | No | Public link for this language |
| updatedAt | No | ISO datetime |
| systemText | No | Translated system copy |
| description | No | Translated description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds behavioral value by explaining the failure case when a language version does not exist yet and by clarifying that the returned content includes mirrored fields[] and a report.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each serving a clear purpose: what the tool reads, how to use it in the edit/save workflow, and when it errors. The main purpose is front-loaded and there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with two fully documented parameters, a schema, and read-only annotations, the description covers the main function, the mutation workflow it supports, and the error condition. Nothing needed 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documentation covers both parameters completely the formId and language enum, so the baseline is at 3. The description reinforces the language parameter's meaning by calling it a 'language version (translation)', which is consistent with the schema but adds minimal extra semantic detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Read the full content of one language version (translation) of a form', and additionally highlights the mirrored fields[] and report. It also references the relevant sibling operations (update_form_translation, create_form_translation), so an agent can tell it apart from get_form and list_form_translations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit workflow guidance: use this tool to fetch the current draft before editing, keep codes identical to the source form, then save with update_form_translation. It also states when the call fails and directs the agent to create the translation first with create_form_translation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_leadARead-onlyInspect
View one lead of the current team by leadId: follow-up status, assignee, colour tags, the respondent block, and the next upcoming booking. Optionally include the respondent's submission history (which quizzes they took, with score / level), the team's internal follow-up comments, and the change timeline (status / assignee / tag changes plus submissions). Reference a lead by its leadId and a respondent by examineeId, never by a masked email.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | The lead id (the leadId returned by list_leads) | |
| includeRecords | No | Include the respondent's submission history (default true) | |
| includeComments | No | Include the internal follow-up comments written by team members (default false) | |
| includeActivities | No | Include the change timeline: status / assignee / tag changes and submissions (default false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | No | Colour tag codes on this lead |
| leadId | No | Lead id — address a lead by this, never by a masked email |
| status | No | Follow-up status code (team-defined, see list_lead_settings) |
| records | No | Submission history as { totalDocs, items } (unless includeRecords was false) |
| assignee | No | The member handling this lead as { id, email, username }, or null |
| comments | No | Internal follow-up notes written by team members (only when includeComments) |
| createdAt | No | ISO datetime the lead was created |
| firstForm | No | The quiz that first captured this lead as { id, title } |
| activities | No | Change timeline as { totalDocs, items } (only when includeActivities) |
| respondent | No | The respondent { id, examineeId, email, name, customData, ... }, PII masked |
| nextBooking | No | The next active booking of this respondent, or null |
| recordCount | No | How many times this respondent submitted |
| lastRecordAt | No | ISO datetime of the most recent submission |
| firstRecordAt | No | ISO datetime of the first submission |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and destructiveHint=false, the annotations already establish that this is a safe read operation. The description adds useful behavioral context by specifying current-team scope, optional data inclusions, and the leadId/examineeId reference rule. It does not need to explain return format since an output schema is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two focused sentences with no filler. The primary purpose is front-loaded, followed by optional include behavior and a defensible reference rule. Every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the required leadId, optional boolean parameters, read-only annotations, and existing output schema, the description is sufficiently complete for an agent to select and invoke the tool correctly. It covers scope, optional behavior, and a critical lookup guardrail without leaving any obvious missing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 leadId and the three inclusion flags. The description adds context around those flags and reinforces the leadId naming convention, but it does not provide significantly more parameter-level meaning than the input schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('view one lead') and the resource ('by leadId'), and it enumerates the specific data returned: follow-up status, assignee, colour tags, respondent block, and next upcoming booking. It does not explicitly name sibling tools like get_examinee or list_leads, so sibling differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage context: retrieving a single lead of the current team by leadId, with control over optional inclusions such as submission history, comments, and activity timeline. It also offers the practical guardrail that respondents are referenced by examineeId and never by masked email. It stops short of 5 because it does not explicitly list alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recordARead-onlyInspect
View the full detail of one submission record (lead) in the current team by its record id (the id field returned by list_records), including the examinee, the submitted answers, UTM metadata and the complete frozen report result (overall / dimensions / outcome / AI evaluation). Answers are returned as the respondent wrote them, except that any email address or phone number inside them comes back masked.
| Name | Required | Description | Default |
|---|---|---|---|
| recordId | Yes | The record id (the `id` returned by list_records) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Record id — address a submission by this |
| data | No | The submitted answers keyed by question code, as typed by the respondent — with any email address or phone number inside them masked |
| formId | No | The quiz this submission belongs to |
| examinee | No | The respondent { id, examineeId, email, name, customData }, PII masked |
| metadata | No | Channel attribution { utmSource, utmMedium, utmCampaign, utmTerm, utmContent, referrer } |
| reportUrl | No | Public report page URL for this submission |
| updatedAt | No | ISO datetime of the last change |
| shareToken | No | Token that makes this single report page shareable |
| submittedAt | No | ISO datetime of submission |
| reportResult | No | The complete frozen report { status, overallAnalysis, dimensionAnalysis, outcome, aiEvaluation, aiSuggestion } |
| serialNumber | No | Per-form sequence number of the submission |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=true and destructiveHint=false, so this is clearly a safe read operation. The description adds useful behavioral nuance beyond those hints: the report result is 'frozen', and email addresses or phone numbers in answers are masked on return. This gives the agent realistic expectations about data fidelity without needing to call the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary purpose and resource, followed by a useful enumeration of contents and the key masking behavior. Every clause contributes actionable information, and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a one-parameter schema, an existing output schema, and annotations covering safety, the description is complete. It explains how the id is obtained, scopes the record to the current team, lists the key subcomponents, and reveals the masking behavior an agent needs to set expectations before invoking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents recordId and even restates the provenance from list_records. The description largely repeats that same provenance. Since schema_description_coverage is 100%, the baseline is 3; the description does not add much parameter meaning beyond tying the operation to the current team.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('View the full detail of one submission record') and then enumerates the included contents: examinee, answers, UTM metadata, and the frozen report result. This scope is clear enough to distinguish get_record from list_records (one record vs. lists) and from get_form or get_lead, even without naming them as alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this when you need the complete detail of a single record in the current team, and it explicitly ties the required parameter to the id returned by list_records. It does not name explicit alternatives or when-not-to-use conditions, so it stops short of a 5, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_questionAInspect
Insert an item at a specific position: a question, a page break (Breaker) or a display block (Statement with content / Swiper with items). Use after / before to reference an existing field code (from get_form's field.code). To insert at the very front: before references the first field's code. To insert at the end, use add_question. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | NumberField only: maximum allowed input value (must be >= min). Rejected for other question types. | |
| min | No | NumberField only: minimum allowed input value (respondents cannot submit a smaller number). Rejected for other question types. | |
| code | No | Optional stable identifier for this question (field code). Omit it to let the server auto-generate one. Set a meaningful code (e.g. "q1") when report.formula or a dimension needs to reference this question, so you can write the formula as `{{q1}}` in the same call instead of round-tripping via get_form. Rules: start with a letter or underscore, then only letters/digits/underscores (no hyphens, spaces, or leading digit), at most 64 chars, and not a reserved math word (e, E, pi, PI, tau, phi, i, Infinity, NaN, true, false, null, undefined). Must be unique among all items in the form. | |
| name | No | Question stem text. Allows plain text or restricted HTML (tag allowlist: <p> <strong>/<b> <em>/<i> <u> <s> <mark> <span> <sup> <sub> <br>; other tags are stripped and the text kept). | |
| type | Yes | Question type; Breaker means a page break, no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer | |
| unit | No | NumberField only: display unit suffix shown after the input, e.g. "kg" / "$" / "min". Rejected for other question types. | |
| after | No | Insert after this code; choose either after or before | |
| items | No | Swiper only, and required there: the carousel slides in display order, 1-10 of them. Upload the images with prepare_image_upload / finalize_image_upload first and pass the returned media IDs. Rejected for every other type. | |
| score | No | Points this question is worth, default 0 (not scored). Quiz scene: awarded when the answer matches correctAnswer, and a positive value is required once correctAnswer is set. Scored Quiz scene: pairing it with correctAnswer enables the fallback mode above, but choices[i].score is more flexible. Rejected in the outcome_quiz scene, for DateField / TimeField / Rate, and — in the scored_quiz scene — for NumberField (where the submitted number itself is the score) and FillBlank (collected only, never scored). | |
| steps | No | Rate only: number of rating steps, i.e. the highest rating (3-10, default 5). In the scored_quiz scene the submitted rating value (1..steps) is the question score, unless a per-star score is configured in the web app. Rejected for other question types. | |
| words | No | Rate only: optional scale labels evenly distributed under the rating control, e.g. ["Poor", "Excellent"] for the two endpoints (up to 5 labels). Rejected for other question types. | |
| before | No | Insert before this code; choose either after or before | |
| formId | Yes | The form ID to insert the item into | |
| aiMatch | No | Only for FillBlank in the knowledge_quiz scene. Enables AI grading: the AI compares the respondent answer against correctAnswer and scores by accuracy, instead of requiring an exact string match. Requires correctAnswer (the standard answer) and score > 0 (the score earned when accuracy reaches the threshold). Pass an empty object {} to enable with default settings; omit for plain exact-match grading. | |
| choices | No | Choice-based questions only (SingleCheck / MultiCheck / DropDown / Ordering / Cascade), where it is required; ignored for every other type, including TrueFalse — its two options come from trueLabel / falseLabel. Per-type limits: SingleCheck / MultiCheck 2-20 items — for a longer list use DropDown (2-100 items) instead; Ordering 2-10 items; Cascade nests via choices[i].children (up to 3 levels, at most 100 nodes in total). IMPORTANT (knowledge_quiz scene): vary the position of the correct option(s) across questions — do NOT always place the correct answer first. Distribute correct answers roughly evenly over all positions so they are not predictable. | |
| content | No | Statement only, and required there: the text respondents read — an intro, a section lead-in, instructions, a disclaimer. The block renders this and nothing else. Same rich-text rules as `description` (headings / lists / links / <img src> / math formulas). This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. | |
| explain | No | Optional answer explanation. The frontend renders it in the question's "answer explanation" field (DescriptionEditor); the rich-text rules are identical to description. Do not stuff the answer explanation into description — that is the question's supplementary note and will not be shown as an explanation to respondents/graders. | |
| shuffle | No | Ordering only: shuffle the displayed choice order for each respondent. Defaults to true for MCP-created questions — the stored choices order would otherwise leak the correct order when correctAnswer matches it. Pass false only when the initial order is intentionally meaningful. Rejected for other question types. | |
| multiple | No | DropDown only: allow selecting multiple options (default false = single select). Affects the quiz-scene correctAnswer shape: an array of labels/codes when true, a single one when false. Rejected for other question types (SingleCheck/MultiCheck are inherently single/multi). | |
| required | No | Whether the question is required, default false | |
| precision | No | DateField / TimeField only: picker precision. DateField accepts year | month | day | hour | minute | second (default day; e.g. "month" shows a year-month picker, "second" a full datetime picker). TimeField accepts only minute | second (default minute). Ignored for other question types. | |
| trueLabel | No | TrueFalse only: custom display text for the "true" option (e.g. "Yes" / "Agree"). Ignored for other question types. Leave empty to fall back to the built-in default for the form language ("Correct" in English forms). Does not change the stored answer value, which stays "true". | |
| falseLabel | No | TrueFalse only: custom display text for the "false" option (e.g. "No" / "Disagree"). Ignored for other question types. Leave empty to fall back to the built-in default for the form language ("Incorrect" in English forms). Does not change the stored answer value, which stays "false". | |
| description | No | Optional supplementary note for the question. Allows a wider HTML subset: everything the stem allows + <h1>-<h6> <ul> <ol> <li> <blockquote> <a href> <img src> <hr> <art-field> (variable placeholder, data-type / data-cid); unsafe protocols (javascript:/data:) and unknown attributes are stripped. This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. | |
| trueOutcomes | No | Outcome scene + TrueFalse only (required there together with falseOutcomes): the outcome codes that answering "true" votes for. Use [] for a side that votes for nothing. Rejected for other question types / scenes. | |
| correctAnswer | No | The "correct answer" of the knowledge_quiz scene; setting it makes the question scored, so pair it with a positive `score`. The shape follows the question type — see the anyOf branches; a choice is referenced by its label or its code, so reference it by code whenever the same label appears more than once (Ordering rejects an ambiguous label outright). Required on SingleCheck / MultiCheck / DropDown / Ordering in the knowledge_quiz scene, optional on FillBlank / NumberField there. NumberField answers must be typeable within min / max and decimalPlaces. Rejected for DateField / TimeField / Rate (data-collection and rating fields; configure date/time scoring in the web app), rejected for FillBlank in the scored_quiz scene (free text is collected only there), and rejected in the outcome_quiz scene (no right or wrong answers there). In the scored_quiz scene prefer choices[i].score per option; passing correctAnswer + score there only falls back to "the matching choice gets score, others get 0". | |
| decimalPlaces | No | NumberField only: how many decimal places respondents may enter (stored as the field's numeric precision), default 0 = integers only. Rejected for other question types. Note this is different from the string `precision` of DateField / TimeField. | |
| falseOutcomes | No | Outcome scene + TrueFalse only (required there together with trueOutcomes): the outcome codes that answering "false" votes for. Use [] for a side that votes for nothing. Rejected for other question types / scenes. | |
| trueDimensionScores | No | scored_quiz scene + TrueFalse only: the points answering "true" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes. | |
| falseDimensionScores | No | scored_quiz scene + TrueFalse only: the points answering "false" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| field | No | The created question, including its generated code |
| formId | No | The form that was edited |
| position | No | 0-based index the question landed at |
| itemCount | No | Question / page-break count after the insert |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, openWorldHint=false, destructiveHint=false — they do not convey the critical non-idempotence behavior. The description adds substantial transparency: calls may succeed despite a timeout, blind retries can create duplicates, and the correct recovery procedure is to check first. It also discloses the anchor requirement (existing field code from get_form), which is behavioral context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two dense sentences that front-load the core purpose and most important routing rule, then add the idempotence warning. Every clause earns its place — there is no filler, no restatement of schema content, and the critical operational warning is placed at the end where it completes the mental model rather than competing with the purpose statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 30 parameters, a rich schema, nested objects, an output schema, and a field-applicability matrix in the input schema, the description still covers the key contextual points an agent needs to call it correctly: position anchors, end-insert routing, and non-idempotence recovery. It does not enumerate every type-field combination, but the schema already carries that burden; the description correctly focuses on the decision-level context that the schema does not convey.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema itself documents every parameter, setting a baseline of 3. The description adds value above that baseline by naming the two anchor parameters (before/after) up front, referencing get_form's field.code as the source, and establishing add_question as the endpoint alternative. The semantic distinction between before/after and end-insert is positioned in the description text, not just in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Insert an item at a specific position') and enumerates the insertable item kinds (question, page break Breaker, display block Statement/Swiper). It distinguishes itself from add_question (append at end) and references get_form's field.code as the anchor mechanism, which clearly separates it from siblings like update_question or move_question.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use before/after anchors, how to insert at the very front, and that insert-at-end should go to add_question. The not-idempotent warning with a check-then-retry strategy gives concrete operation guidance. This is explicit usage direction that an agent can act on without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invite_memberAInspect
Invite someone to the active team (tenant) by email. Sends an invitation email with a join link and returns that link. Only the team owner or an admin can invite; the call is rejected for other roles. role defaults to "member" and may be "viewer" (read-only) or "admin". You cannot invite someone as the owner. Fails if the email is already a member or already has a pending invite, or if the team has hit its member limit. Operates on the team this token currently targets — use list_my_tenants / switch_active_tenant to change teams first.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Role to grant. Defaults to "member": "viewer" is read-only, "admin" manages the whole team. Cannot be "owner". | |
| Yes | Email address of the person to invite. |
Output Schema
| Name | Required | Description |
|---|---|---|
| role | No | Role granted by the invite |
| No | Address the invite was sent to | |
| inviteUrl | No | The invite link that was emailed — you may relay it to the user |
| inviteToken | No | Token embedded in the invite link |
| membershipId | No | The created membership record |
| isUserRegistered | No | Whether that address already had a RooQuiz account |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate this is a write operation but the description goes further by disclosing that an email is sent, that a join link is returned, and that the call is rejected for non-admin roles. It also clarifies active-tenant scoping and specific failure modes, adding substantial context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then layers permission, role defaults, failure conditions, and tenant-scoping guidance. Every sentence carries distinct operational value, and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential context: target scope, required permissions, role constraints, side effects, return value, and common failure cases. An output schema exists, so return-value details need not be fully spelled out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents both parameters, including the role enum semantics and default. The description repeats much of this information rather than adding new parameter-level meaning, so the baseline of 3 is appropriate even though the tool context is rich.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: invite someone to the active team by email. It also names the key outcome, sending an invitation and returning a join link, which distinguishes it from unrelated sibling tools. No ambiguity remains about what operation the tool performs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the permission model, role defaults, and failure conditions, and it tells the caller to use list_my_tenants/switch_active_tenant if a different team should be targeted. This provides clear when-to-use and how-to-prepare guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bookingsARead-onlyInspect
List the 1:1 bookings (discovery calls / consultations booked from a quiz report page) of the current team, earliest first. Each item carries the time range, status, meeting type, the attendee, the source quiz and submission, and the lead owner who should handle it. Filter by status / quiz / respondent / time range. Typical use: status "pending" lists the approval queue waiting on someone. Reference a booking by its bookingId; the attendee name / email come back masked.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only bookings starting strictly before this ISO datetime, optional | |
| from | No | Only bookings starting on/after this ISO datetime, optional | |
| page | No | Page number (1-based), default 1 | |
| sort | No | Sort by start time, default startAt (earliest first) | |
| limit | No | Items per page, default 20, max 100 | |
| formId | No | Only bookings that came from this quiz, optional | |
| status | No | Filter by status. pending = a request awaiting approval (the team has requireApproval on), scheduled = a confirmed meeting, the rest are terminal. Optional. | |
| recordId | No | Only bookings tied to this submission record, optional | |
| examineeId | No | Only bookings by this respondent — the internal examinee id (get_lead's respondent.id), not the examineeId business code. Optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | 1-based page returned |
| items | No | The page of bookings (earliest first by default) |
| totalDocs | No | Total bookings matching the filter |
| totalPages | No | Total pages available |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this tool as read-only and non-destructive, and the description adds meaningful behavioral context beyond that: bookings are scoped to the current team, sorted earliest first, tied to a lead owner and source quiz, and attendee names/emails come back masked. These details are not inferable from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, then adds distinct, practical details: item shape, filtering, a typical approval-queue workflow, and the masked attendee caveat. There is no filler or redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with 9 optional, well-documented parameters and an output schema, this description is complete enough for selecting and invoking the tool. It covers scope, ordering, item content, filtering behaviors, and a real workflow in several lines, so an agent can confidently decide when and how to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter already has a clear description covering time range, status enum semantics, quiz, respondent, pagination, and sort. The tool description reinforces the filtering categories but does not add meaningful parameter-level details beyond what the schema already explains, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb, 'List', and a concrete resource: '1:1 bookings (discovery calls / consultations booked from a quiz report page) of the current team'. It clearly distinguishes this from sibling tools like get_booking_availability, reschedule_booking, and update_booking_status by stating exactly what resource and scope this operation is about.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: read-only listing of the current team's 1:1 bookings, earliest first, with defined filters and a typical use case ('status pending lists the approval queue waiting on someone'). It does not explicitly name alternative sibling tools or say when not to use this tool, so it is slightly short of fully explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_examineesARead-onlyInspect
List the examinees — also called respondents, the people who answer the quizzes — of the current team, newest first. Sensitive auth fields (password, verification code, reset token, etc.) are never returned. The examineeId business ID is returned unmasked and is what get_examinee / update_examinee take. Use get_examinee for one examinee's full detail including customData.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Items per page, default 20, max 100 | |
| search | No | Fuzzy match by email or name, optional | |
| status | No | Filter by status, optional |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | How many are returned in this page |
| items | No | The page of respondents (newest first), PII masked |
| total | No | Total respondents matching the filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and destructiveHint annotations, the description reveals important behavior: sensitive auth fields are never returned, the business ID is unmasked, and ordering is newest first. This is meaningful context the agent cannot infer from annotations or schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it states purpose and ordering first, then field-sensitive behavior, then routing guidance. Every sentence earns its place without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, all parameters are documented, and annotations cover the safety profile, the description fills the remaining gaps: scope, ordering, sensitive-field filtering, and selection between siblings. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters (limit, search, status) are already fully described in the JSON schema, including defaults, enums, and constraints. The description adds no extra parameter-level guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb (list), a clear resource (examinees/respondents), and states scope (current team) and ordering (newest first). It also distinguishes itself from get_examinee by explaining the difference in scope and detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use get_examinee instead: when full detail including customData is needed. It also explains that examineeId is the value consumed by get_examinee / update_examinee, giving the agent a clear routing rule across siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_formsARead-onlyInspect
List the forms of the current team. Returned in reverse chronological order of creation, without question content (use get_form for details).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Items per page, default 20, max 100 | |
| scene | No | Filter by scene, optional | |
| titleContains | No | Fuzzy match by title, optional |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | The page of forms (newest first) |
| totalDocs | No | Total forms matching the filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations: results are returned in reverse chronological creation order and omit question content. This helps the agent understand what the response will and will not contain without relying on assumptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single lean sentence that fronts the core purpose and immediately appends the most important caveat (no question content) with a pointer to get_form. Every phrase earns its place, there is no fluff, and the structure makes the primary action and the exception equally clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool, the description covers the essential behavioral nuances: team scope, ordering, and exclusion of question content. The tool has an output schema, so return values don't need to be described, and annotations plus full parameter schema cover the rest. Nothing necessary for safe and correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter (limit, scene, titleContains) is documented with enough meaning in the schema itself. The description does not add extra parameter-level semantics, which is acceptable given the baseline of 3 when the schema fully covers the parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb ('List') and a clear resource ('forms of the current team'), and additionally distinguishes the listing behavior from detail retrieval by noting that question content is omitted and pointing to get_form for details. This makes the purpose immediately identifiable and differentiates it from sibling tools like create_form and delete_form.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: list forms when you need an overview, and use get_form when you need question content or details. It gives explicit guidance on the alternative tool for a different need, though it does not mention other related tools like list_form_translations or list_templates, which would have made the routing even clearer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_form_translationsARead-onlyInspect
List the existing language versions (translations) of a form. Returns each translation's language, isActive flag, public share link and timestamps. The primary language lives on the form itself (see get_form.language) and is not listed here.
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The source form UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | How many translations exist (the primary language is not listed) |
| formId | No | The source form |
| translations | No | The existing language versions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe read-only nature of the tool. The description adds valuable behavioral detail: the response includes language, isActive flag, public share links, and timestamps, and the primary language is deliberately not included. This is meaningful beyond what the annotations express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: the first states the operation, the second itemizes the returned data, and the third explains an important exclusion. There is no filler, and the most critical recognition comes immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only list operation with an existing output schema and annotations, the description is complete. It tells the agent what will be listed, what fields are returned, and what is deliberately absent, leaving no important detail missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, formId, is fully described in the schema as 'The source form UUID', giving 100% schema description coverage. The description restates the form context but adds no extra semantic detail beyond the schema's own documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description begins with 'List the existing language versions (translations) of a form', which is a specific verb and resource. It also distinguishes itself by noting the primary language lives on the form itself and pointing to get_form.language, so an agent can tell this tool apart from related get_form and get_form_translation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly conveys the tool's purpose and explicitly excludes the primary language, directing the agent to get_form.language for that concern. However, it does not explicitly mention get_form_translation as the alternative for retrieving a single translation, leaving a small gap in alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_leadsARead-onlyInspect
List the leads (CRM records) of the current team — one lead per respondent across all forms, carrying follow-up status, assignee, colour tags, submission count and the next upcoming booking. Newest activity first by default. Filter by status / assignee / tags / created-at range / keyword / whether they have an upcoming booking. Status codes and tag codes are team-defined — call list_lead_settings first to get the valid ones, never guess. Reference a lead by its leadId and a respondent by examineeId, never by a masked email.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-based), default 1 | |
| sort | No | Sort order, default -lastRecordAt (most recent submission first) | |
| limit | No | Items per page, default 20, max 100 | |
| status | No | Filter by follow-up status code (see list_lead_settings), optional | |
| keyword | No | Fuzzy match on the respondent's name or email. Matching runs server-side against the real values, so you can search by a full or partial email even though results come back masked. | |
| tagCodes | No | Filter by colour tag codes; a lead matches if it has ANY of them (OR). Optional. | |
| createdTo | No | Only leads created strictly before this ISO datetime (half-open), optional | |
| assigneeId | No | Filter by the assigned member userId (see list_lead_settings.assignableMembers). Pass "me" for the current token's own user. Optional. | |
| createdFrom | No | Only leads created on/after this ISO datetime, optional | |
| hasUpcomingBooking | No | true = only leads with an active upcoming booking, false = only those without. Omit to not filter. Note: this filters within the page, so counts stay on the unfiltered basis. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | 1-based page returned |
| items | No | The page of leads, PII masked |
| totalDocs | No | Total leads matching the filter |
| totalPages | No | Total pages available |
| hasNextPage | No | Whether another page follows |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior beyond annotations and schema: aggregation semantics ("one lead per response across all forms", i.e., dedup does not include), default ordering ("newest activity first by default"), and masked email handling ("never by a masked email"). These are real behavioral traits an agent could not infer from the parameter schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, each earning its place: purpose + aggregation semantics, default ordering, filter summary, code-domain management, and ID/masking convention. It is front-loaded with the core definition and does not repeat schema boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with an output schema, the description covers the decision-critical semantics: aggregation, default sorting, code validation, and masked-employee handling. Pagination bounds, the page-local filtering caveat, and the special assignee value "me" remain in the schema, which is acceptable. The complete is modest — it does not name sibling alternatives for raw-record or single-lead access — so very close to fully complete but not absolutely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already fully documented and the baseline is 3. The description adds value on top by summarizing the filter dimensions in one line (status / assignee / tags / created-at range / keyword / upcoming booking) and by providing the identifier discipline (leadId vs examineeId, never a masked email) that the schema itself does not state. This moves it above baseline, though it still relies on the schema for precise meanings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb + resource + scope: "List the leads (CRM records) of the current team" and immediately disambiguates it from siblings with "one lead per respondent across all forms". It also lists what each lead carries (status, assignee, tags, next upcoming booking), so the agent can distinguish list_leads from list_records and list_examinees without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: the tool targets the current team's aggregated CRM view, and it adds an explicit prerequisite — "call list_lead_settings first to get the valid ones, never guess." However, it does not explicitly name alternative tools to rule out (e.g., when to use list_records or get_lead instead), so the when-not-to guidance 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.
list_lead_settingsARead-onlyInspect
Read the current team's lead configuration: the follow-up status codes (with label and colour, in display order), the colour tag library, and the members a lead can be assigned to. Call this before update_lead / set_lead_tags / assign_leads — status codes, tag codes and member ids are all team-specific and the write tools reject unknown values.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | No | The team's colour tag library |
| statuses | No | Follow-up statuses in display order |
| assignableMembers | No | Active non-viewer members a lead can be assigned to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this read-only and non-destructive, so the safety profile is covered. The description adds useful behavioral context beyond the clues: the returned codes/ids are team-scoped and the write tools will reject unknown values, which explains the side-effect context of a read tool meant as a prerequisite. It does not describe errors or pagination, but those are irrelevant here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences carry all needed information without any waste: the first lists the three concrete outputs, the second gives the essential call-before context and rationale. The most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a zero-parameter input schema, a low-complexity read operation, and an existing output schema, the description is fully adequate. It explains what is returned, that data is team-specific, and how the result should be used before related write calls. Nothing necessary for an agent 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters and an empty input schema, so there is no parameter meaning for the description to add. Per the baseline for zero-parameter tools, this is complete enough without any parameter-specific descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with an explicit verb and resource ('Read the current team's lead configuration') and lists exactly what is returned: follow-up status codes with label/color/order, the color tag library, and assignable members. It also differentiates itself from the write-related siblings because it is positioned as the read-side lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: call it before update_lead / set_lead_tags / assign_leads. It explains why this ordering matters, since the values are team-specific and the write tools reject unknown values. This is strong routing context for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_tenantsARead-onlyInspect
List all teams (tenants) the current user belongs to. isActive marks the team this token currently operates against.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tenants | No | Teams you are an active member of |
| activeTenantId | No | The team this token currently operates on |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: the result includes all user memberships and the isActive field indicates the token's current operating tenant. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one efficient sentence with no fluff. The main action is front-loaded and the field clarification (isActive) is added in a compact clause, earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is low-complexity (0 params), has an output schema, and annotations cover the safety profile. The description adequately explains what it lists and how to interpret the key field. Nothing an agent needs 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, baseline is 4. There are no parameters to describe, and the schema has nothing to document, so this score is appropriate and the description need not compensate for anything.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and clearly identifies the resource: all teams/tenants the current user belongs to. It also explains the isActive field, distinguishing it from get_active_tenant by noting all tenants are returned and the active one is marked.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage—when you need the full list of tenants for the current user—but does not explicitly mention alternatives like get_active_tenant or switch_active_tenant, nor does it state when to prefer this tool over those. The mention of isActive provides indirect context but not explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recordsARead-onlyInspect
List submission records (leads) of the current team, newest first. Each item includes the examinee (name / email / customData if captured), the submitted answers, UTM metadata and a compact report result (status / score / level / outcome). Optionally filter by form, report status, and submitted-at range. Reference a respondent by examineeId, never by a masked email; email addresses and phone numbers written into the answers come back masked too. Use get_record for one record's full detail.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-based), default 1 | |
| limit | No | Items per page, default 20, max 100 | |
| since | No | Only records submitted on/after this ISO datetime, optional | |
| until | No | Only records submitted on/before this ISO datetime, optional | |
| formId | No | Filter by form UUID, optional | |
| status | No | Filter by report generation status, optional |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | 1-based page returned |
| items | No | The page of submissions (newest first) |
| limit | No | Page size actually used |
| totalDocs | No | Total submissions matching the filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/destructive annotations, it discloses meaningful behavioral traits: newest-first ordering, the compact report shape, team-level scoping, automatic masking of emails and phone numbers, and the instruction to reference respondents by examineeId because masks are not stable identifiers. This is genuinely useful context that the annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense yet compact: one sentence for the core behavior, one for item shape, one for optional filters, and one safety/alternatives tip. Every sentence earns its place, and the most important information is at the front.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the readOnly annotations, full input-schema coverage, and the presence of an output schema, this description leaves very little unresolved. It explains item contents, filtering, masking constraints, and routes to get_record, so an agent can confidently select and call the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all 6 parameters with 100% coverage, so the baseline is 3. The description does add a concise grouping of the optional filters (form, report status, submitted-at range), but it mostly restates what the parameter descriptions already say rather than introducing new semantic meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource combination: "List submission records (leads) of the current team, newest first." It enumerates what each item includes and explicitly distinguishes itself from get_record, making the tool's scope clear even among many list_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on optional filters and on how to reference respondents safely, and it explicitly points to get_record when full detail is needed. It does not explicitly contrast this endpoint with list_leads or list_examinees, but the behavior description and mention of report results make the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesARead-onlyInspect
List active templates in the public template library (id, title, scene, description, category, recommended flag, usage count), most-used first. Use this to find a template, then call create_form_from_template with its id to create a form from it — the fastest way to build a quiz when a suitable template exists.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Items per page, default 20, max 100 | |
| scene | No | Filter by scene, optional | |
| categoryId | No | Filter by category id, optional | |
| isRecommended | No | When true, only return recommended templates | |
| titleContains | No | Fuzzy match by title, optional |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | The page of templates |
| totalDocs | No | Total templates matching the filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and non-destructive behavior, so the description adds useful context without needing to repeat safety. It clarifies active-only results, the public library scope, field set, and most-used-first ordering, which helps set expectations for what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences with no filler. The first sentence states what the tool lists; the second gives the recommended next action. The key scope information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema, output schema availability, and annotations defining read-only/non-destructive behavior, there is no meaningful gap in what an agent needs to select and invoke the tool. The description also connects it to the logical follow-up tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents limit, scene, categoryId, isRecommended, and titleContains. The description adds workflow-level context about using the template id afterward, but it does not need to add parameter details because the schema fully handles that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and object: it lists active templates from the public template library, and enumerates the fields returned. This clearly distinguishes it from list_forms and create_form_from_template because it identifies templates as the resource rather than forms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use the tool: 'Use this to find a template, then call create_form_from_template with its id.' It also gives the decision criterion ('when a suitable template exists'). It stops short of saying when not to use it or naming an alternative such as create_form.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_questionAInspect
Move an existing item (question, page break or display block) to a specific position by code. Choose either after or before, referencing another field's code. Move to the front: before references the current first field's code. Move to the end: after references the current last field's code.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The field code to move (a question, a Breaker or a display block) | |
| after | No | Move after this code; choose either after or before | |
| before | No | Move before this code; choose either after or before | |
| formId | Yes | form ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | No | 0-based index after the move |
| code | No | The question that was moved |
| from | No | 0-based index before the move |
| formId | No | The form that was edited |
| changed | No | false when the question already sat at the target position |
| position | No | Current index — returned instead of from/to when no move was needed |
| questionCount | No | Total question / page-break count |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate the tool is not read-only and not destructive; the description adds the nuance that to move to the front or end you must reference the current first/last field's code. It discloses the requirement to reference existing codes and the positional behavior, which goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with minimal redundancy. It leads with the purpose, then explains the mechanism, and finishes with the front/end special cases. Each sentence earns its place, though it could combine the front/end guidance more tightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high schema coverage and existing output schema, the description covers all essential mechanics: what to move, how to specify position, and how to handle front/end cases. Nothing an agent needs 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline of 3 applies. The description adds meaning by clarifying that 'after' and 'before' are mutually exclusive ('choose either'), and by explaining how to achieve front/end moves using current boundary codes—details not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Move'), a specific resource ('existing item (question, page break or display block)'), and explains the positional mechanics with 'after' and 'before'. It clearly separates this from sibling add/delete/update tools by focusing on repositioning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly defines when to use it (to change an item's position) and gives concrete instructions for both relative moves and front/end placement. It does not explicitly name alternatives, but the tool's purpose is self-evident given the sibling set, so an agent can correctly select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_image_uploadARead-onlyInspect
Step 1 of 2 for adding an image (PNG / JPEG / GIF / WebP) to the current team media library. This tool does NOT receive image bytes — it returns a short-lived presigned URL you upload the file to directly, so even large images never pass through this conversation. Workflow: (1) save the image to a local temp file; (2) if the file is larger than 5MB, compress / downscale it to 5MB or less FIRST (e.g. sips -Z 2048 in.png --out out.jpg on macOS, or magick in.png -resize "2048x2048>" -quality 82 out.webp) — uploads over 5MB are rejected; (3) call this tool with filename, mimeType and (optionally) fileSize; (4) HTTP PUT the temp file to the returned uploadUrl with the matching Content-Type header, e.g. curl -X PUT --upload-file <file> "<uploadUrl>" -H "Content-Type: image/png"; (5) call finalize_image_upload with the returned key; (6) delete the temp file. Max 5MB after compression. Only image/png, image/jpeg, image/gif and image/webp are accepted.
| Name | Required | Description | Default |
|---|---|---|---|
| fileSize | No | Optional file size in bytes (of the file you will actually upload, after any compression). If provided it is checked against the 5MB cap and the team storage quota up front; the authoritative check still runs in finalize_image_upload against the actual uploaded size. | |
| filename | Yes | Original filename for admin display / download, e.g. "cover.png". | |
| mimeType | Yes | Image MIME type. Must be one of image/png, image/jpeg, image/gif, image/webp. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | Staging object key to pass to finalize_image_upload |
| expiresIn | No | Seconds until the presigned URL expires |
| uploadUrl | No | Presigned PUT URL — upload the bytes here, then call finalize_image_upload |
| requiredContentType | No | Content-Type header the PUT must send, or R2 rejects it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true and destructiveHint=false, and the description adds substantial context around that: the tool never sees the image bytes, the returned URL is short-lived, uploads over 5MB are rejected, and the optional fileSize is checked up front against the 5MB cap and storage quota. It also exposes the subtle asymmetry that while this call itself is read-only, the overall workflow is a mutation performed via the direct PUT — which resolves any confusion the readOnlyHint could cause.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the key concept ('Step 1 of 2... returns a presigned URL... does NOT receive image bytes') and the numbered workflow is clearly structured. It is a bit long and repeats the 5MB rule a couple of times, and the curl example is generous in detail, but every major section earns its place for a tool with a non-obvious two-step protocol.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a complex presigned-URL flow, the description is effectively a complete operating manual: preconditions (temp file, compression, allowed MIME), the exact invocation, the follow-up finalize call, and cleanup. An output schema exists and will specify return fields, so the description doesn't need to — the only marginal omission (what to do on a failed PUT status) is below the bar for an MCP-tool description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds value beyond the schema: it clarifies fileSize should be the post-compression size ('the file you will actually upload, after any compression' is expanded by the compression step instructions), and it ties mimeType to the requirement that the PUT Header's Content-Type must match. It doesn't deeply enumerate each parameter, but with a fully documented schema that burden is already carried.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a concrete, scoped purpose: 'Step 1 of 2 for adding an image (PNG / JPEG / GIF / WebP) to the current team media library.' It explicitly distinguishes its contract — it does NOT receive image bytes, it returns a presigned URL — and the sibling finalize_image_upload is directly named, so an agent immediately knows what this tool is and what it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a complete procedural guide: compress/downscale any file >5MB first (with concrete sips/magick examples), call this tool with filename/mimeType/fileSize, HTTP PUT the file to the returned uploadUrl, then call finalize_image_upload, then delete the temp file. It also states hard applicability rules (5MB cap, four allowed MIME types) and explicitly names the required follow-up sibling, so an agent knows exactly when and how to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reschedule_bookingAInspect
Move a confirmed booking of the current team to a different time, as the organiser. The new start time must be one of the available slots — call get_booking_availability with this bookingId first and pick a startAt from its slots. The attendee is emailed about the new time, the 24h reminder is re-armed, and the booking.rescheduled integration event fires. Only works on a scheduled booking; it is rejected if the slot got taken in the meantime or if that respondent already has another active booking.
| Name | Required | Description | Default |
|---|---|---|---|
| startAt | Yes | The new start time, ISO datetime — must be one of the slots from get_booking_availability | |
| bookingId | Yes | The booking id (the bookingId returned by list_bookings) |
Output Schema
| Name | Required | Description |
|---|---|---|
| endAt | No | New end, ISO datetime |
| status | No | Booking status after the move |
| startAt | No | New start, ISO datetime |
| timezone | No | Timezone of the new slot |
| bookingId | No | The booking that was moved |
| slotDurationMinutes | No | Length of the slot |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses concrete behavioral consequences: the attendee is emailed, the 24-hour reminder is re-armed, and a booking.rescheduled integration event fires. It also explains rejection conditions, which is valuable context for a mutating operation that is not marked destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences cover purpose, required prerequisite call, parameter constraints, side effects, and failure conditions without wasted words. The most important scoping information comes first and the practical how-to guidance is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a two-parameter mutation with an output schema: it states preconditions, valid input origin, side effects, event behavior, and rejection cases. Nothing an agent needs to call this tool correctly or anticipate failures is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds useful context by connecting bookingId to get_booking_availability and specifying that startAt must be selected from that call's slots, but most of the parameter meaning is already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-plus-resource statement: 'Move a confirmed booking of the current team to a different time, as the organiser.' This clearly distinguishes it from siblings like get_booking_availability, review_booking, and update_booking_status by focusing on the rescheduling action and the organizer/team scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: call get_booking_availability with this bookingId first, pick a startAt from its slots, and provide that as the new time. It also states when it will not work: rejected if the slot was taken or if the respondent already has another active booking, and only applies to confirmed/scheduled bookings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_formAInspect
Restore a form from the trash in the current team (undo delete_form). Only the form owner or the team owner / admin can restore; errors if the form is not in the trash.
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The form UUID to restore from trash |
Output Schema
| Name | Required | Description |
|---|---|---|
| formId | No | The form restored from trash |
| message | No | Human-readable result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description adds meaningful behavioral details: the restore operation's authorization requirements and its error condition when the form is not trashed. It does not fully explore side effects, but for a single-parameter restore action with an output schema, this is substantive additional context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with no filler. It front-loads the core purpose ('Restore a form from the trash'), then adds the inverse-operation reference and the key constraints. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with one fully documented parameter, an output schema, and annotations indicating mutation but non-destructiveness, the description provides sufficient context: purpose, scope, permissions, and failure condition. The agent has everything needed to decide whether and how to invoke restore_form correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: formId is documented as 'The form UUID to restore from trash'. The tool description does not add further parameter-level detail, but nor is it required to because the schema already fully explains the only parameter. Baseline 3 is appropriate given the high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: 'Restore a form from the trash in the current team'. It explicitly frames it as 'undo delete_form', which distinguishes it from both delete_form and the various create/update siblings. The verb and resource are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit conditions for use: it is the inverse of delete_form, applies within the current team, and is only permitted for the form owner or team owner/admin. It also states when it will fail ('errors if the form is not in the trash'), giving the agent clear call-time guardrails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_bookingAInspect
Approve or decline a pending booking request of the current team. Approving turns it into a confirmed meeting and sends the attendee the confirmation with the meeting address; declining sends a short "not approved" note with the optional reason. Only works on a booking whose status is pending, and a request whose meeting time has already passed can only be declined. On approval you may set the meeting link / instructions for this one meeting (leave empty to fall back to the team-level settings). Only the team owner / admin or the lead owner can review.
| Name | Required | Description | Default |
|---|---|---|---|
| decision | Yes | approve = confirm the meeting and release the address; decline = reject the request | |
| bookingId | Yes | The booking id (the bookingId returned by list_bookings) | |
| meetingLink | No | Approve only: the meeting URL for this meeting. Empty falls back to the team setting. | |
| declineReason | No | Decline only: the reason shown to the attendee, max 500 chars. Optional. | |
| meetingInstructions | No | Approve only: how to join / what to prepare, max 1000 chars. Empty falls back to the team setting. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | scheduled after approving, cancelled after declining |
| bookingId | No | The booking that was reviewed |
| reviewedAt | No | ISO datetime of the review |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description enriches the annotations with real behavioral detail: approval sends confirmation with the meeting address, declining sends a note, expired requests cannot be approved, meeting link/instructions may fall back to team settings, and access is limited to owner/admin/lead owner. This is exactly the context beyond readOnly/destructive hints that is useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries distinct information: the decision action, notification side effects, state constraints, per-meeting overrides, and authorization. It is dense yet not bloated, and it front-loads the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema is present and the input schema is fully documented, the description covers all critical decision-relevant context: status preconditions, time-based limitation, side effects, optional parameter implications, and permission rules. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and each parameter has a descriptive schema entry already. The description adds some usage context around approval vs decline behavior, but it largely mirrors the schema text for meetingLink, meetingInstructions, and declineReason. Thus it meets but does not exceed the baseline for complete schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Approve or decline'), a specific resource ('a pending booking request'), and the current team scope. It differentiates the tool from siblings like update_booking_status by specifying the pending-status condition and the approval/decline decision structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit conditions: only pending bookings can be reviewed, and past-dated requests can only be declined. It does not name sibling alternatives directly, but the conditions on booking status effectively define when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_dimension_analysisAInspect
Set the multi-dimension analysis (form.report.dimensionAnalysis) of a form, replacing the dimension list without touching overallAnalysis (title / radar settings you omit are kept). Dimension codes are stable: pass dimensions[].code to keep or set one, or omit it and a dimension with the same name keeps its existing code. In the knowledge_quiz scene each dimension needs fieldCodes (question codes); in the scored_quiz scene a formula is optional — dimensions that questions score into via choices[i].dimensionScores sum those automatically, so only give a formula to dimensions no question scores directly. A dimension still referenced by a question's dimensionScores or by report.formula (the overall formula) cannot be removed. Pass an empty dimensions array to clear the multi-dimension analysis. Call get_form first to read the question and dimension codes. Not supported for random_knowledge_quiz forms.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Multi-dimension analysis title | |
| formId | Yes | The form ID to configure | |
| dimensions | No | The dimension list (at most 50). Pass an empty array to clear the multi-dimension analysis. | |
| showRadarChart | No | Whether to show the radar chart, default true | |
| showStandardLine | No | Whether to show the standard-score line on the radar chart |
Output Schema
| Name | Required | Description |
|---|---|---|
| formId | No | The form that was edited |
| dimensions | No | The dimensions after the replace |
| dimensionCount | No | How many dimensions are configured now (0 = cleared) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false, so the description carries the behavioral burden and it excels: it discloses partial-update behavior (omitted title/radar settings are kept), dimension code stability rules, the removal constraint for dimensions referenced by question dimensionScores or report.formula, scene-dependent treatment of formula/fieldCodes, and the standardScore auto-computation defaults. Notably it tempers destructiveHint=false by explaining exactly what can and cannot be removed, with no contradiction to 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph of roughly 230 words that is front-loaded with the core purpose and where every sentence carries operational information. It loses one point because the dense wall-of-text formatting makes scene-specific rules harder to scan — short scene-labeled segments or bullets would improve parseability — but there is no padding or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters, nested dimension objects, two scene variants, and an output schema, the description covers everything an agent needs to call it correctly: prerequisites, unsupported forms, preservation semantics, code stability, removal constraints, and clearing behavior. Return values are already handled by the output schema, so their absence from the description is not a gap. The only minor omission is explicit error behavior for invalid references, which the schema partially covers ('Each code must exist in the form').
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds meaningful cross-parameter semantics beyond individual schema descriptions: which parameters apply in which scene, how formula and fieldCodes interact, how standardScore defaults are derived, and how the empty dimensions array triggers a clear. It does not need to restate per-field constraints since the schema already documents them, but the scene-conditional behavior is genuine added value, warranting a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb-resource pair — 'Set the multi-dimension analysis (form.report.dimensionAnalysis) of a form' — and immediately clarifies the exact mutation semantics: replaces the dimension list while preserving overallAnalysis. It is clearly distinguishable from all siblings (update_form, create_form, get_form) because it names the precise report field it operates on and states its unsupported form type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions per scene ('In the knowledge_quiz scene each dimension needs fieldCodes; in the scored_quiz scene a formula is optional'), an explicit when-not ('Not supported for random_knowledge_quiz forms'), a prerequisite ('Call get_form first to read the question and dimension codes'), and a clear usage pattern for clearing ('Pass an empty dimensions array'). This is actionable routing guidance, not just a generic statement of purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_lead_tagsAInspect
Set the colour tags on one or more leads of the current team. Pass every lead id in a single call (up to 50) — do not loop. mode: "replace" (default, overwrite the whole tag set — for editing a single lead), "add" or "remove" (for batches, where each lead has different tags and overwriting would wipe other people's tags). Tag codes must exist in the team's tag library (see list_lead_settings.tags); "remove" also accepts stale codes. Changes are recorded on each lead's timeline.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | How to apply the tags, default replace | replace |
| tags | Yes | The tag codes to apply, from list_lead_settings.tags[].code | |
| leadIds | Yes | The lead ids to tag, max 50 per call |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | replace / add / remove |
| count | No | How many leads were changed |
| items | No | Per-lead result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly discloses semantics beyond the annotations: 'replace' overwrites the whole tag set, 'add' and 'remove' have batch-oriented behavior, 'remove' accepts stale codes, and changes are recorded on each lead's timeline. It also states the tag-code existence requirement without relying on schema descriptions alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and efficiently structured: it front-loads the tool's purpose, then packs the most important operational constraints into a small number of sentences. Every sentence earns its place, and the mode-specific guidance is clear without being bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with a mode enum, array limits, team-scoped behavior, and a business-library dependency, the description is complete. It explains when to use each mode, how tags are validated, what happens to existing tags, and where the changes are recorded; an output schema also exists, so return-value details are not required in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all three parameters at 100% coverage, so the baseline is 3. The description adds valuable operational meaning, especially for 'mode' behavior and batch expectations, but since the schema interface already carries descriptive parameter docs, the description's extra contribution is strong but not fully essential.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Set the colour tags on one or more leads of the current team.' It clearly identifies the action, the target entity (leads), and the team scope, which makes the tool distinguishable from siblings like update_lead, assign_leads, and list_lead_settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit operational guidance: pass all lead ids in one call, do not loop, respect the 50-lead maximum, and select the mode based on single-lead edits versus batch operations. It explains why using 'replace' for batches can wipe other people's tags, and it names list_lead_settings.tags as the source for valid tag codes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_active_tenantAInspect
Switch the active team (tenant) for this token. The change persists across sessions until switched again. Caller must be a member of the target team.
| Name | Required | Description | Default |
|---|---|---|---|
| tenantId | Yes | Target team ID. Use list_my_tenants to discover. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The team the token now operates on |
| name | No | Team name |
| slug | No | Team slug |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only say the tool is not read-only and not destructive), the description discloses the key behavioral trait that the switch persists across sessions, and the access requirement that the caller must be a member. No contradiction with annotations exists, as the readOnlyHint=false is consistent with a state-changing operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exactly three short sentences: the action, the persistence effect, and the membership precondition. Every sentence carries distinct information, the most important facts are front-loaded, and there is no redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter) with a rich schema and an output schema available, so the description's coverage of purpose, side-effect persistence, and eligibility precondition is sufficient. Nothing an agent needs to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with the sole parameter (tenantId) well documented, including a pointer to list_my_tenants for discovery. The description adds no additional parameter-level information, so with full schema coverage baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Switch), a precise resource (active team/tenant), and the exact scope (for this token). It clearly distinguishes itself from the get_active_tenant (read) and list_my_tenants (discover) siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a precondition (caller must be a member of the target team) and states that the change persists across sessions, which implies when it should be used. However, it does not explicitly name alternative tools or state when not to use it - the cue to use list_my_tenants for discovery lives only in the parameter schema rather than in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_booking_statusAInspect
Close out a confirmed booking of the current team: mark it completed, mark the attendee as a no-show, or cancel it. Only works on a booking whose status is scheduled; completed / no_show additionally require the meeting to have already started. Cancelling notifies the attendee by email and fires the booking.cancelled integration event; completed / no_show are internal bookkeeping and do not contact the attendee. To handle a pending request use review_booking instead.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | completed = the meeting happened, no_show = the attendee did not turn up, cancelled = call it off and notify them | |
| bookingId | Yes | The booking id (the bookingId returned by list_bookings) |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | completed / no_show / cancelled |
| bookingId | No | The booking that was closed out |
| cancelledAt | No | ISO datetime, set when the booking was cancelled |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavioral side effects beyond annotations: cancellation notifies the attendee by email and fires an integration event, while completed/no_show do not contact the attendee. It also explains the difference between status transitions. This adds significant context not available in the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then systematically adds preconditions, side effects, and an alternative. It is a bit longer than minimal, but every sentence is necessary and adds distinct value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and the annotations, the description provides everything an agent needs: valid statuses, eligibility conditions, side effects, and sibling routing. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already covers all parameters (100%) and defines enum values, the description adds clear behavioral nuances for each status (e.g., cancellation triggers notification, completed/no_show are internal). It enriches the schema's plain definitions with operational meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('close out') and the resource ('a confirmed booking of the current team'), then enumerates the exact acceptable outcomes. It also distinguishes itself from the sibling review_booking by explicitly naming the tool for pending requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly specifies the precondition: only works on bookings with status 'scheduled', and adds time-based requirements for completed/no_show. It also gives an explicit exclusion: 'To handle a pending request use review_booking instead'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_examineeADestructiveInspect
Update an examinee (a.k.a. respondent) in the current team, located by its examineeId (the business ID from list_examinees). Editable: name / status (active|disabled) / customData (validated against the team's examinee field definitions: required / unique / type / regex). email, tenant and examineeId cannot be changed. customData REPLACES the whole object and masked values are rejected: never re-send customData you just read, or you will wipe or corrupt phone fields — only write values the user gave you.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New examinee name | |
| status | No | Enable (active) or disable the examinee | |
| customData | No | Custom field values as a code→value map, validated against the team's examineeFields definitions (required / unique / type / regex). The keys are that team's own field codes — get_examinee shows which codes exist, but only send values the user gave you: this replaces the whole customData object, and re-sending a value you read back (phone fields come back masked) wipes or corrupts it. | |
| examineeId | Yes | The examinee business ID (e.g. AB1234567890) to update |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Masked name (J*n) |
| No | Masked email (j***g@example.com); never pass it back as an argument | |
| avatar | No | Uploaded avatar as { id, url } |
| status | No | Account status |
| tenant | No | Team (tenant) the respondent belongs to |
| createdAt | No | ISO datetime of first sign-up |
| updatedAt | No | ISO datetime of the last change |
| customData | No | Team-defined custom fields; phone-typed values come back masked |
| examineeId | No | Business ID of the respondent (e.g. AB1234567890) — use it to address them |
| avatarPreset | No | Preset avatar key, when no image was uploaded |
| emailVerified | No | Whether the email has been verified |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive behavior, but the description goes further by explaining exactly how: customData replaces the whole object, masked values are rejected, and replaying a previously read customData can wipe or corrupt phone fields. This is precisely the kind of behavioral context beyond annotations that an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the operation and resource, followed by a concise list of editable and immutable fields and a distinct warning. It earns its length, though the customData warning partially repeats the input schema's customData description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutate operation with a nested customData object, the description provides the essential operational context: identity selection, field editability, validation behavior, and the destructive consequence of echoing masked data. The presence of a full output schema and complete input schema rounds out the tool definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of the parameters, so the schema already handles most semantics. The description adds valuable clarification: email, tenant, and examineeId cannot be changed, customData is validated against field definitions, and readonly/masked values must not be re-sent. This is meaningful but partially redundant with the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Update an examinee' and states it operates in the current team, identified by examineeId. It also clarifies what is editable versus immutable, which makes the tool's scope distinct from sibling read/list tools like get_examinee and list_examinees.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear prerequisite: the examinee is located by the business ID from list_examinees, and it scopes updates to the current team. It also notes immutable fields. It does not explicitly name alternatives or when-not-to-use scenarios, but for a mutation tool the usage context is established sufficiently.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_formAInspect
Update a form of the current team: title / description / isActive / flagImg / landingImage / theme / report / openGraph / language / systemText. flagImg is the quiz cover, landingImage the landing-page cover (sets the image only, does not toggle the landing page); both take a media id from finalize_image_upload, a media URL, or "" to clear. report and openGraph (the social share card on the answer link) merge by sub-key — only what you pass is replaced, "" clears an openGraph sub-key; in the outcome_quiz scene outcomes are matched by code so existing images survive, and removing an outcome still referenced by question votes is rejected. systemText is replaced wholesale ({} clears it). language is changeable only while the form has no language versions; scene never. Questions go through add_question / update_question / delete_question / move_question, dimensionAnalysis alone through set_dimension_analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The form ID to update | |
| theme | No | New visual theme for the answer page. Only this sub-key of personalized is changed; settings are kept. Optional visual theme matching the quiz topic/mood. Default light. Pick the one that best fits the quiz: light (clean neutral bright; default — formal/general quizzes); corporate (professional blue+gray; B2B, career, business assessments); dark (modern sleek dark; tech, night, cool personality quizzes); cupcake (soft pink cute rounded; fun, food, kids, lighthearted); pastel (gentle pastel artsy; lifestyle, aesthetics, soft mood); valentine (pink romantic hearts; love, relationships, holidays); synthwave (neon purple/pink retro; gaming, trends, bold personality); luxury (dark + gold premium; finance, luxury brands, high-end); forest (deep green nature; environment, health, outdoors); coffee (warm brown cozy; food & drink, cafe, lifestyle); autumn (warm orange/brown seasonal; autumn, cozy, harvest); halloween (purple+orange spooky; Halloween, horror, festive fun); night (deep calm blue; astronomy, mindfulness, calm tech); cyberpunk (high-contrast neon yellow; tech, esports, gaming). | |
| title | No | New title | |
| report | No | Report configuration, merged by sub-key into form.report: passing overallAnalysis fields (title/formula/levels/summaryTemplate/suggestionsTemplate/hideOverallScore) replaces overallAnalysis; passing dimensionAnalysis replaces the dimension list (codes are kept by code or by name, omitted title / radar settings are preserved; an empty dimensions array clears it; a dimension still referenced by a question's dimensionScores or by report.formula cannot be removed); in the outcome_quiz scene passing outcomes replaces the outcome list (matched by code, existing images kept; cannot be emptied, and removing an outcome still referenced by question votes is rejected); unspecified parts are kept. Common usage: either set custom question codes in create_form and pass report.formula / dimensionAnalysis in the same call, or call create_form first to get the auto-generated field codes, then update_form to fill in report.formula and/or dimensionAnalysis (which reference question codes). | |
| flagImg | No | Quiz cover image: a media ID returned by finalize_image_upload, or a media URL. Pass an empty string to clear the cover. | |
| isActive | No | Whether to enable response collection | |
| language | No | Change the form's language. Only allowed while the form has no translation links and is not referenced by other language versions; otherwise rejected. | |
| openGraph | No | Social share card (Open Graph) settings: the title / description / image shown when the answer link is shared to social media or chat apps. In update_form each sub-key is merged independently (only the keys you pass change; pass an empty string to clear one). SEO keywords are generated automatically and cannot be set here. | |
| systemText | No | Answer-page system text overrides as a key→text map. Replaces the whole map (pass {} to clear); empty values are dropped and fall back to the language default. | |
| description | No | New description; pass an empty string to clear. Allows description-scope rich text (including <img src>). This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. | |
| landingImage | No | Landing page cover image: a media ID returned by finalize_image_upload, or a media URL. Pass an empty string to clear it. Note: this only sets the image and does NOT toggle the landing page on/off; the landing image is shown only when the landing page is enabled. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Form id |
| scene | No | knowledge_quiz / scored_quiz / outcome_quiz |
| theme | No | Answer-page theme name |
| title | No | Form title after the update |
| flagImg | No | Media id of the quiz cover |
| isActive | No | Whether the form is open for submissions |
| language | No | Primary language |
| hasReport | No | Whether this call replaced the report configuration |
| openGraph | No | Social share card |
| updatedAt | No | ISO datetime |
| systemText | No | Overridden system copy |
| description | No | Form description |
| landingImage | No | Media id of the landing-page cover |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses substantial behavior beyond the annotations: sub-key merge semantics for report and openGraph, empty-string clearing, wholesale replacement of systemText, image-only behavior of landingImage, outcome matching by code, and rejection of removals still referenced. This is far more than the readOnly/destructive hints provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: purpose and field list first, then cross-cutting semantics, then routing exclusions. Every sentence earns its place, and the length is appropriate for an 11-parameter tool with nested objects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given exhaustive schema descriptions, an output schema, and annotations, the description adds exactly the operational context missing from structured fields: merge behavior, constraints, and sibling routing. An agent has what it needs to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description does not need to compensate. It nevertheless adds cross-cutting value by explaining shared patterns across parameters: media IDs/URLs/empty-string clearing, merge-vs-replace behavior, and language-change restrictions that the schema separates per parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update'), a resource ('a form of the current team'), and explicitly enumerates the updatable fields. It also distinguishes itself from sibling operations by routing questions to add_question/update_question/delete_question/move_question and dimensionAnalysis to set_dimension_analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit routing guidance versus related tools and states when language changes are allowed and that scene is immutable. The description also clarifies what this tool is not for, which gives an agent clear selection criteria among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_form_settingsAInspect
Change how a form of the current team is delivered, as opposed to what it says (use update_form for title / questions / report / theme). Editable: submissionAccess (who may answer and whether seeing the report needs a login — this is the lead-capture gate), reportGateRequireCode (whether that login gate collects an emailed verification code, trading completion rate against lead quality), timeLimit, sharing (the result-page share button and personalised share card, which is what drives organic spread), answerSheet, booking (the result-page booking block that feeds the 1:1 call queue), gaTrackingId, sharedWithAll (whether every team member can see this form), and slug (the custom path that gives the public link a memorable, SEO-friendly address). Only the keys you pass are changed. Read the current values with get_form_share_info.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Custom path of the public answer link — the SEO-friendly address (e.g. quizster.app/<team>/burnout-test on the platform domain, or <custom-domain>/burnout-test when the team's custom domain is serving). Lowercase letters, digits and hyphens, 2-64 chars, must start and end with a letter or digit, unique within the team. Pass an empty string to clear back to the random address. Changing it breaks the previous custom path right away, but the token address (/a/<publicToken>) always keeps working and the page's canonical URL follows the custom path. | |
| formId | Yes | The form UUID | |
| booking | No | The result-page booking block. The bookable hours live in the team's booking settings, not here — this is only the switch and the copy. Bookings that come in are handled with list_bookings / review_booking. | |
| sharing | No | Result-page sharing: the share button, the personalised share card and the public summary. Turning this off stops respondents spreading their results. | |
| timeLimit | No | Answer-time countdown. Only knowledge quizzes (knowledge_quiz / random_knowledge_quiz) can turn this on — a countdown makes sense when unanswered means wrong, but rushing a scorecard or a personality quiz just produces careless answers. | |
| answerSheet | No | The answer-sheet sidebar on the answering page | |
| gaTrackingId | No | Google Analytics measurement id (G-XXXXXX) or Universal Analytics id (UA-XXXX-Y). Pass an empty string to clear. | |
| sharedWithAll | No | Whether every member of the team can see and open this form | |
| submissionAccess | No | public = anyone answers and sees the report; login_to_view_report = anyone answers but must sign in to see the report (the default, this is how leads get captured); examinee_only = a login is required before answering at all | |
| reportGateRequireCode | No | Only applies when submissionAccess is login_to_view_report. false (the default for newly created quizzes) = the respondent only types an email and a name to see this one result — far more people finish, but the address is unverified and they get no account, and since result links do get forwarded, the report is effectively as reachable as public for whoever opens the link first. true = the respondent must confirm an emailed 6-digit code, so every captured lead has a verified address and the respondent gets an account they can return to. Quizzes created before this setting existed read as true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | No | Custom path after this change; null when cleared (back to the random address) |
| formId | No | The form that was changed |
| changed | No | Which settings this call changed |
| delivery | No | Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, booking, gaTrackingId, sharedWithAll }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate this is a write operation, leaving the description to carry behavioral context. The description discloses partial-update semantics ('Only the keys you pass are changed') and explains real-world consequences of settings, such as lead capture, completion rate versus lead quality, and organic sharing. It does not mention side effects like slug breakage in the description itself, though the schema covers that in detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with purpose and alternatives before the field list. Each parenthetical earns its place by adding decision-relevant context rather than repeating schema details. The density is justified by the number of editable settings, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (10 parameters, nested objects, one enum), the description provides high-level coverage, partial-update behavior, and sibling routing. The rich schema and output schema handle the remaining validation and return-value details. An agent has enough context to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter. The description adds valuable business-level meaning beyond the schema: which fields form the lead-capture gate, the completion-rate/lead-quality trade-off, and how sharing and booking affect growth and the call queue. This helps an agent reason about parameter combinations, lifting it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Change') and a specific resource ('how a form... is delivered'), and explicitly distinguishes itself from update_form, which handles content like title, questions, report, and theme. It also enumerates the exact editable settings, leaving no ambiguity about what the tool operates on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the sibling tool update_form for content changes and get_form_share_info for reading current values. This gives an agent clear routing guidance: use this tool for delivery/settings changes, not content or read operations. The contrast is direct and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_form_translationAInspect
Save translated copy for one language version of a form. Pass the translated title / description / fields / report / systemText / booking, mirroring the shape returned by get_form_translation; fields you omit keep their current value and partial translation is allowed. Translation fields[] must not introduce codes that do not exist on the source form. Pass isActive=false to pause just this language version, independently of the form's overall isActive.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Translated form title | |
| fields | No | Translated questions mirroring the source structure: same codes, translated text. The current draft comes from get_form_translation (or the clone create_form_translation returns) — edit the text in place and send it back. Merging is by code, not position, so a partial list is fine and omitted questions stay untranslated. | |
| formId | Yes | The source form UUID | |
| report | No | Translated report display text, mirroring the stored report that get_form_translation returns — the nested overallAnalysis / dimensionAnalysis / outcomeAnalysis shape, NOT the flattened `report` input of create_form / update_form. Scores, formulas, thresholds and codes always come from the source; only the text keys below are applied. | |
| booking | No | Translated copy for the result-page booking block (the block that offers a call). Whether the block shows at all always comes from the source form — this only translates its wording. Omit a key or send it empty to keep falling back to the source text. | |
| isActive | No | Enable/pause this language version (independent of the form's overall isActive). | |
| language | Yes | Which language version to update | |
| systemText | No | Translated answer-page system copy, as an open key→text map (e.g. { "submitButton": "Absenden", "nextPage": "Weiter" }). Keys are the answer-page copy keys — read the ones already set from get_form_translation, and note that keys the answer page does not know are stored but never rendered. Every key is optional; an empty value falls back to the built-in text for this language. | |
| description | No | Translated form description |
Output Schema
| Name | Required | Description |
|---|---|---|
| formId | No | The source form |
| updated | No | Which parts of the translation this call changed |
| language | No | Language that was saved |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate non-read-only and non-destructive, so the description carries the behavioral burden, and it delivers. It discloses partial-update semantics, merge-by-code not position, rejection of non-existent codes, fallback behavior for omitted keys, and the fact that this language version's isActive is independent of the form's overall isActive. It also warns about the report shape differing from create_form/update_form and notes that stored-but-unknown keys are not rendered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the purpose, then the core update semantics, a key constraint, and the special isActive flag. There is no filler or repetition of schema content that isn't already doing work.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a highly nested 9-parameter tool, the description plus schema fully covers the workflow: where to get the draft, how to send it back, how merging works, what constraints exist, and what the report shape should be. Output schema exists, so not explaining return values is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds cross-cutting semantics beyond individual parameter docs: mirror the get_form_translation shape, omit fields to keep current values, partial translation is allowed, merge by code, and isActive is independent. This is exactly the kind of workflow-level meaning that makes parameter use correct, not just documentable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Save translated copy for one language version of a form.' It clearly distinguishes this update operation from sibling tools like create_form_translation by emphasizing the one-language-version scope and the partial-update behavior. 'Pass the translated title / description / fields / report / systemText / booking' makes the tool's resource shape concrete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong practical guidance: mirror get_form_translation's shape, omit fields to keep their values, and partial translation is allowed. It also gives a clear special-case instruction for isActive=false. However, it never explicitly names when to use this tool instead of create_form_translation or delete_form_translation, leaving the update-vs-create decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_leadAInspect
Move one lead of the current team to another follow-up status (e.g. new → contacted). The change is recorded on the lead's timeline. Status codes and tag codes are team-defined — call list_lead_settings first to get the valid ones, never guess.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | The lead id (the leadId returned by list_leads) | |
| status | Yes | The target status code, must be one of list_lead_settings.statuses[].code |
Output Schema
| Name | Required | Description |
|---|---|---|
| leadId | No | The lead that was moved |
| status | No | Status code after the move |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful side-effect context beyond the annotations: the status change is recorded on the lead's timeline, and valid status codes are team-defined rather than universal. It does not contradict the readOnlyHint=false or destructiveHint=false annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences, front-loaded with the action and then providing necessary scope and prerequisite context. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter update operation with rich annotations and output schema present, this description is complete: it identifies the scope (current team), the behavior (timeline recording), and the dependency (list_lead_settings). Nothing an agent needs to call it correctly seems missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schemas already define leadId and status well. The description reinforces that status codes come from list_lead_settings and warns against guessing, but adds little new parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is specific: it names the verb ('move'), the resource ('one lead of the current team'), and the precise change (follow-up status, e.g. new → contacted). This clearly distinguishes update_lead from sibling tools like set_lead_tags or add_lead_comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit prerequisite: call list_lead_settings first to get valid status codes and never guess. This is strong practical usage guidance, though it does not name alternative tools or explicitly say when not to use this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_questionAInspect
Update a single question of an existing form, located by code. Changeable: name / description / explain / required / score / correctAnswer / aiMatch (FillBlank AI grading) / precision (DateField/TimeField picker precision) / min / max / unit / decimalPlaces (NumberField) / words (Rate scale labels) / choices (replaces ALL choices of a choice-based question). NOT changeable — delete_question then add_question instead: question type, Rate steps, DropDown multiple, Ordering shuffle. DateField / TimeField / Rate reject score / correctAnswer / aiMatch (configure date/time scoring in the web app). The scored_quiz and outcome_quiz scenes reject the top-level score / correctAnswer / aiMatch as well: pass choices carrying choices[i].score or choices[i].outcomes instead (TrueFalse outcome votes still need delete + recreate). Display blocks are edited here too, with their own keys: Statement takes content, Swiper takes items (replacing all slides), and both take name / description — every question key is rejected on them.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | NumberField only: new maximum allowed value; pass null to remove the upper bound. Ignored for other question types. | |
| min | No | NumberField only: new minimum allowed value; pass null to remove the lower bound. Ignored for other question types. | |
| code | Yes | Question code (field.code), from the get_form / create_form return value | |
| name | No | New question stem, optional | |
| unit | No | NumberField only: new display unit suffix (e.g. "kg"); pass null or an empty string to clear. Ignored for other question types. | |
| items | No | Swiper block only: replace ALL slides with this list (1-10). Slides get fresh ids, so any translated slide titles / notes for this block have to be rewritten afterwards. | |
| score | No | Score for this question; 0 or omitted + no correctAnswer means not scored | |
| words | No | Rate only: new scale labels shown under the rating control (up to 5); pass null or [] to remove the labels. Ignored for other question types. | |
| formId | Yes | The form ID the question belongs to | |
| aiMatch | No | FillBlank AI grading config (knowledge_quiz scene only). Pass an object to enable AI matching (requires the question to have correctAnswer + score > 0); pass null to turn it off and revert to exact-match grading. Omit to leave the existing grading mode untouched. | |
| choices | No | Replace ALL choices of a choice-based question (SingleCheck / MultiCheck / DropDown / Ordering / Cascade; rejected for other types). To keep an existing choice's identity (so past answers still match it) pass its current code from get_form; entries without a code get a new auto-generated code. knowledge_quiz scene: if the existing correctAnswer references a code missing from the new choices, pass a new correctAnswer in the same call. scored_quiz scene: set choices[i].score to rebuild Option Scoring (required if the question currently has Option Scoring). outcome_quiz scene: every choice must carry an outcomes vote list (use [] for a neutral choice). | |
| content | No | Statement block only: the new body text, which is the whole block. Same rich-text rules as description. It cannot be emptied — delete_question the block if you no longer want it. This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. | |
| explain | No | New answer explanation (the question's "answer explanation" field, not the question note); pass an empty string to clear. Same rich-text rules as description. | |
| required | No | Whether the question is required | |
| precision | No | DateField / TimeField only: new picker precision. DateField accepts year | month | day | hour | minute | second; TimeField accepts only minute | second. Ignored for other question types. | |
| trueLabel | No | TrueFalse only: new custom display text for the "true" option; pass an empty string to clear and fall back to the localized default. Ignored for other question types. | |
| falseLabel | No | TrueFalse only: new custom display text for the "false" option; pass an empty string to clear and fall back to the localized default. Ignored for other question types. | |
| description | No | New question note; pass an empty string to clear. This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. | |
| correctAnswer | No | New correct answer; the shape follows the question type — see the anyOf branches. Choices are referenced by label or code (use the code when the same label repeats), and they must exist in the question's current choices, or in the `choices` replacement passed in this same call. NumberField answers must stay typeable within min / max and decimalPlaces. Rejected for DateField / TimeField / Rate, and in the scored_quiz / outcome_quiz scenes. | |
| decimalPlaces | No | NumberField only: new number of decimal places allowed (0 = integers only); pass null to reset to the default 0. Ignored for other question types. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | The question that was updated |
| field | No | The question after the merge |
| formId | No | The form that was edited |
| changed | No | Which question attributes this call changed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, openWorldHint=false, destructiveHint=false), so the description carries the behavioral burden. It discloses that choices replaces ALL choices, that some fields are rejected per question type/scene, that DateField/TimeField/Rate reject certain fields, and that display block updates reject every question key. This is far richer than the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph, but it packs crucial distinctions efficiently: changeable list, not-chargeable list with alternatives, per-type rejections, and display block behavior. It could be slightly better structured with bullet points, but every sentence provides necessary information for a 20-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with 20 parameters, the description covers all critical decision points: which fields are editable, which are not, what is rejected in which scenes, how choices replacement behaves, and how display blocks differ. Given the output schema exists, no additional return-value explanation is needed. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by summarizing cross-parameter constraints (e.g., 'choices' replaces all choices, display blocks use different keys, scene-level rejections). It does not restate every parameter but complements the schema with important usage context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Update') and resource ('a single question of an existing form, located by code'), and immediately enumerates exactly which fields are changeable. It explicitly contrasts itself with delete_question then add_question for unchangeable attributes, distinguishing it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: what can be updated, what cannot be updated (and the recommended alternative), and scene-specific restrictions (e.g., scored_quiz/outcome_quiz reject top-level score/correctAnswer/aiMatch). It also covers display blocks and their own key constraints, leaving no ambiguity about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tenant_slugAInspect
Change the team address of the current team — the first path segment of every quiz link on the platform domain (quizster.app//). Owner / admin only. Lowercase letters, digits, hyphens and underscores, 4-32 chars, must start and end with a letter or digit, unique across the whole platform, and cannot be cleared. Changing it moves EVERY public quiz link of the team at once and the old address stops resolving (cached entries may linger briefly), so treat this as a rare, deliberate rename — not routine tuning; token addresses (/a/) keep working. Read the current value with get_active_tenant.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The new team address |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | No | The new team address — the first path segment of every platform-domain quiz link |
| tenantId | No | The team that was renamed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses important behavioral consequences: owner/admin restriction, global link redirect, old address stopping resolution, cache lag, and token addresses still working. This significantly exceeds the minimal requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds crucial operational context. The core functionality is front-loaded, followed by high-impact constraints and consequences. It could be slightly more concise, but the density is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is fully complete for a slate of one parameter with an output schema: it covers validation, side effects, permissions, and related tools. The agent can safely invoke this tool without needing to consult external documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only says 'The new team address', but the description expands this with validation rules: allowed characters, length limits, prefix/suffix rules, uniqueness, and non-clearing constraint. This provides the agent with all validation logic ahead of invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Change the team address') and the resource (the current team) with a concrete example URL. It distinguishes itself from get_active_tenant by describing a mutation vs. read operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit when-to-use/when-not-to-use context: it is a 'rare, deliberate rename — not routine tuning.' It also names the companion read tool get_active_tenant, giving the agent a clear path to safely check current state.
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. Dates show when Glama detected each change.
6 tool updates
- Changed
add_question5 fields changed- added
Input schema / properties / choices / items / properties / children / items / properties / children / items / properties / dimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.", + "type": "object" +} - added
Input schema / properties / choices / items / properties / children / items / properties / dimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.", + "type": "object" +} - added
Input schema / properties / choices / items / properties / dimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.", + "type": "object" +} - added
Input schema / properties / falseDimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene + TrueFalse only: the points answering \"false\" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.", + "type": "object" +} - added
Input schema / properties / trueDimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene + TrueFalse only: the points answering \"true\" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.", + "type": "object" +}
- Changed
create_form13 fields changed- added
Input schema / properties / questions / items / properties / choices / items / properties / children / items / properties / children / items / properties / dimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.", + "type": "object" +} - added
Input schema / properties / questions / items / properties / choices / items / properties / children / items / properties / dimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.", + "type": "object" +} - added
Input schema / properties / questions / items / properties / choices / items / properties / dimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.", + "type": "object" +} - added
Input schema / properties / questions / items / properties / falseDimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene + TrueFalse only: the points answering \"false\" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.", + "type": "object" +} - added
Input schema / properties / questions / items / properties / trueDimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene + TrueFalse only: the points answering \"true\" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.", + "type": "object" +} - changed
Input schema / properties / report / properties / dimensionAnalysis / descriptionPrevious value: -"Multi-dimension analysis (radar chart + per-dimension breakdown). Each dimension gets a server-generated code returned in structuredContent. In the knowledge_quiz scene set fieldCodes per dimension; in the scored_quiz scene set a formula. Dimensions reference question codes: if you set custom question codes you can configure dimensions in the same create_form call; otherwise create the questions first, then get_form to read the auto-generated codes."New value: +"Multi-dimension analysis (radar chart + per-dimension breakdown). Each dimension has a stable code (pass dimensions[].code or let the server generate one; returned in structuredContent). In the knowledge_quiz scene set fieldCodes per dimension. In the scored_quiz scene every dimension needs a formula over question codes (e.g. `{{q1}} + {{q2}}`); a question may override its score for one dimension via choices[i].dimensionScores, otherwise the formula uses its plain choice score. If you set custom question codes you can configure everything in one create_form call; otherwise create the questions first, then get_form to read the auto-generated codes." - added
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / codeAdded value: +{ + "description": "Optional stable identifier for the dimension (same rules as question codes: starts with a letter or underscore, letters/digits/underscores only). Set it when questions reference the dimension via choices[i].dimensionScores in the same create_form call. When updating, pass the existing code to keep it; if omitted, a dimension with the same name keeps its current code, otherwise one is generated.", + "maxLength": 64, + "type": "string" +} - changed
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / fieldCodes / descriptionPrevious value: -"Required in the knowledge_quiz scene: the question codes this dimension covers (dimension score = sum of these field scores). Each code must exist in the form. Ignored in the scored_quiz scene."New value: +"Required in the knowledge_quiz scene: the question codes this dimension covers (dimension score = sum of these field scores). Each code must exist in the form. Ignored in the scored_quiz scene, where the formula decides which questions count." - changed
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / formula / descriptionPrevious value: -"Required in the scored_quiz scene: the dimension score formula. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` when you set custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Supported operators: + - * / ( ). Ignored in the knowledge_quiz scene."New value: +"Required in the scored_quiz scene: the dimension score formula, usually the sum of the questions in this dimension. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` when you set custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Inside a dimension formula `{{q}}` is the question's score for THIS dimension: its choices[i].dimensionScores override when set, otherwise the plain choice score. A dimension formula cannot reference other dimensions (only report.formula can). Supported operators: + - * / ( ). Ignored in the knowledge_quiz scene." - changed
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / standardScore / descriptionPrevious value: -"Standard score (the radar-chart standard line; in the scored_quiz scene it also acts as the dimension full mark). Default 0."New value: +"Standard score (the radar-chart standard line; in the scored_quiz scene it also acts as the dimension full mark). When omitted in the scored_quiz scene it defaults to the attainable maximum: the formula evaluated with every referenced question at its highest score for this dimension (choices[i].dimensionScores override, else the choice score); 0 when that cannot be estimated, e.g. the formula uses NumberField / date questions. knowledge_quiz defaults to 0." - changed
Input schema / properties / report / properties / formula / descriptionPrevious value: -"Total-score formula for the scored_quiz scene, and the ONLY source of the overall score there — summing question scores is the knowledge_quiz rule, so a scored_quiz without this formula scores null and no level ever matches. Required whenever levels are set. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` for custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Supported operators: + - * / ( ); every referenced code must exist in the current form. Setting dimension formulas does NOT cover this — the overall formula is separate."New value: +"Total-score formula for the scored_quiz scene, and the ONLY source of the overall score there — summing question scores is the knowledge_quiz rule, so a scored_quiz without this formula scores null and no level ever matches. Required whenever levels are set. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` for custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. It may also reference dimension codes the same way (e.g. `{{dim_d}} * 2 + {{dim_i}}`): dimensions are computed first, so the overall score can be a weighted sum of dimension scores; a dimension referenced here cannot be removed later. Supported operators: + - * / ( ); every referenced code must exist in the current form (questions and dimensions). Setting dimension formulas does NOT cover this — the overall formula is separate." - changed
Input schema / properties / report / properties / levels / items / properties / cta / properties / newWindow / descriptionPrevious value: -"Open the link in a new window, default false"New value: +"Deprecated and ignored: the CTA link always opens in a new window." - changed
Input schema / properties / report / properties / outcomes / items / properties / cta / properties / newWindow / descriptionPrevious value: -"Open the link in a new window, default false"New value: +"Deprecated and ignored: the CTA link always opens in a new window."
- Changed
insert_question5 fields changed- added
Input schema / properties / choices / items / properties / children / items / properties / children / items / properties / dimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.", + "type": "object" +} - added
Input schema / properties / choices / items / properties / children / items / properties / dimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.", + "type": "object" +} - added
Input schema / properties / choices / items / properties / dimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.", + "type": "object" +} - added
Input schema / properties / falseDimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene + TrueFalse only: the points answering \"false\" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.", + "type": "object" +} - added
Input schema / properties / trueDimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene + TrueFalse only: the points answering \"true\" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.", + "type": "object" +}
- Changed
set_dimension_analysis4 fields changed- added
Input schema / properties / dimensions / items / properties / codeAdded value: +{ + "description": "Optional stable identifier for the dimension (same rules as question codes: starts with a letter or underscore, letters/digits/underscores only). Set it when questions reference the dimension via choices[i].dimensionScores in the same create_form call. When updating, pass the existing code to keep it; if omitted, a dimension with the same name keeps its current code, otherwise one is generated.", + "maxLength": 64, + "type": "string" +} - changed
Input schema / properties / dimensions / items / properties / fieldCodes / descriptionPrevious value: -"Required in the knowledge_quiz scene: the question codes this dimension covers (dimension score = sum of these field scores). Each code must exist in the form. Ignored in the scored_quiz scene."New value: +"Required in the knowledge_quiz scene: the question codes this dimension covers (dimension score = sum of these field scores). Each code must exist in the form. Ignored in the scored_quiz scene, where the formula decides which questions count." - changed
Input schema / properties / dimensions / items / properties / formula / descriptionPrevious value: -"Required in the scored_quiz scene: the dimension score formula. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` when you set custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Supported operators: + - * / ( ). Ignored in the knowledge_quiz scene."New value: +"Required in the scored_quiz scene: the dimension score formula, usually the sum of the questions in this dimension. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` when you set custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Inside a dimension formula `{{q}}` is the question's score for THIS dimension: its choices[i].dimensionScores override when set, otherwise the plain choice score. A dimension formula cannot reference other dimensions (only report.formula can). Supported operators: + - * / ( ). Ignored in the knowledge_quiz scene." - changed
Input schema / properties / dimensions / items / properties / standardScore / descriptionPrevious value: -"Standard score (the radar-chart standard line; in the scored_quiz scene it also acts as the dimension full mark). Default 0."New value: +"Standard score (the radar-chart standard line; in the scored_quiz scene it also acts as the dimension full mark). When omitted in the scored_quiz scene it defaults to the attainable maximum: the formula evaluated with every referenced question at its highest score for this dimension (choices[i].dimensionScores override, else the choice score); 0 when that cannot be estimated, e.g. the formula uses NumberField / date questions. knowledge_quiz defaults to 0."
- Changed
update_form9 fields changed- changed
Input schema / properties / report / descriptionPrevious value: -"Report configuration, merged by sub-key into form.report: passing overallAnalysis fields (title/formula/levels/summaryTemplate/suggestionsTemplate/hideOverallScore) replaces overallAnalysis; passing dimensionAnalysis replaces it (an empty dimensions array clears it); in the outcome_quiz scene passing outcomes replaces the outcome list (matched by code, existing images kept; cannot be emptied, and removing an outcome still referenced by question votes is rejected); unspecified parts are kept. Common usage: either set custom question codes in create_form and pass report.formula / dimensionAnalysis in the same call, or call create_form first to get the auto-generated field codes, then update_form to fill in report.formula and/or dimensionAnalysis (which reference question codes)."New value: +"Report configuration, merged by sub-key into form.report: passing overallAnalysis fields (title/formula/levels/summaryTemplate/suggestionsTemplate/hideOverallScore) replaces overallAnalysis; passing dimensionAnalysis replaces the dimension list (codes are kept by code or by name, omitted title / radar settings are preserved; an empty dimensions array clears it; a dimension still referenced by a question's dimensionScores or by report.formula cannot be removed); in the outcome_quiz scene passing outcomes replaces the outcome list (matched by code, existing images kept; cannot be emptied, and removing an outcome still referenced by question votes is rejected); unspecified parts are kept. Common usage: either set custom question codes in create_form and pass report.formula / dimensionAnalysis in the same call, or call create_form first to get the auto-generated field codes, then update_form to fill in report.formula and/or dimensionAnalysis (which reference question codes)." - changed
Input schema / properties / report / properties / dimensionAnalysis / descriptionPrevious value: -"Multi-dimension analysis (radar chart + per-dimension breakdown). Each dimension gets a server-generated code returned in structuredContent. In the knowledge_quiz scene set fieldCodes per dimension; in the scored_quiz scene set a formula. Dimensions reference question codes: if you set custom question codes you can configure dimensions in the same create_form call; otherwise create the questions first, then get_form to read the auto-generated codes."New value: +"Multi-dimension analysis (radar chart + per-dimension breakdown). Each dimension has a stable code (pass dimensions[].code or let the server generate one; returned in structuredContent). In the knowledge_quiz scene set fieldCodes per dimension. In the scored_quiz scene every dimension needs a formula over question codes (e.g. `{{q1}} + {{q2}}`); a question may override its score for one dimension via choices[i].dimensionScores, otherwise the formula uses its plain choice score. If you set custom question codes you can configure everything in one create_form call; otherwise create the questions first, then get_form to read the auto-generated codes." - added
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / codeAdded value: +{ + "description": "Optional stable identifier for the dimension (same rules as question codes: starts with a letter or underscore, letters/digits/underscores only). Set it when questions reference the dimension via choices[i].dimensionScores in the same create_form call. When updating, pass the existing code to keep it; if omitted, a dimension with the same name keeps its current code, otherwise one is generated.", + "maxLength": 64, + "type": "string" +} - changed
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / fieldCodes / descriptionPrevious value: -"Required in the knowledge_quiz scene: the question codes this dimension covers (dimension score = sum of these field scores). Each code must exist in the form. Ignored in the scored_quiz scene."New value: +"Required in the knowledge_quiz scene: the question codes this dimension covers (dimension score = sum of these field scores). Each code must exist in the form. Ignored in the scored_quiz scene, where the formula decides which questions count." - changed
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / formula / descriptionPrevious value: -"Required in the scored_quiz scene: the dimension score formula. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` when you set custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Supported operators: + - * / ( ). Ignored in the knowledge_quiz scene."New value: +"Required in the scored_quiz scene: the dimension score formula, usually the sum of the questions in this dimension. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` when you set custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Inside a dimension formula `{{q}}` is the question's score for THIS dimension: its choices[i].dimensionScores override when set, otherwise the plain choice score. A dimension formula cannot reference other dimensions (only report.formula can). Supported operators: + - * / ( ). Ignored in the knowledge_quiz scene." - changed
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / standardScore / descriptionPrevious value: -"Standard score (the radar-chart standard line; in the scored_quiz scene it also acts as the dimension full mark). Default 0."New value: +"Standard score (the radar-chart standard line; in the scored_quiz scene it also acts as the dimension full mark). When omitted in the scored_quiz scene it defaults to the attainable maximum: the formula evaluated with every referenced question at its highest score for this dimension (choices[i].dimensionScores override, else the choice score); 0 when that cannot be estimated, e.g. the formula uses NumberField / date questions. knowledge_quiz defaults to 0." - changed
Input schema / properties / report / properties / formula / descriptionPrevious value: -"Total-score formula for the scored_quiz scene, and the ONLY source of the overall score there — summing question scores is the knowledge_quiz rule, so a scored_quiz without this formula scores null and no level ever matches. Required whenever levels are set. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` for custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Supported operators: + - * / ( ); every referenced code must exist in the current form. Setting dimension formulas does NOT cover this — the overall formula is separate."New value: +"Total-score formula for the scored_quiz scene, and the ONLY source of the overall score there — summing question scores is the knowledge_quiz rule, so a scored_quiz without this formula scores null and no level ever matches. Required whenever levels are set. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` for custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. It may also reference dimension codes the same way (e.g. `{{dim_d}} * 2 + {{dim_i}}`): dimensions are computed first, so the overall score can be a weighted sum of dimension scores; a dimension referenced here cannot be removed later. Supported operators: + - * / ( ); every referenced code must exist in the current form (questions and dimensions). Setting dimension formulas does NOT cover this — the overall formula is separate." - changed
Input schema / properties / report / properties / levels / items / properties / cta / properties / newWindow / descriptionPrevious value: -"Open the link in a new window, default false"New value: +"Deprecated and ignored: the CTA link always opens in a new window." - changed
Input schema / properties / report / properties / outcomes / items / properties / cta / properties / newWindow / descriptionPrevious value: -"Open the link in a new window, default false"New value: +"Deprecated and ignored: the CTA link always opens in a new window."
- Changed
update_question3 fields changed- added
Input schema / properties / choices / items / properties / children / items / properties / children / items / properties / dimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.", + "type": "object" +} - added
Input schema / properties / choices / items / properties / children / items / properties / dimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.", + "type": "object" +} - added
Input schema / properties / choices / items / properties / dimensionScoresAdded value: +{ + "additionalProperties": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.", + "type": "object" +}
2 tool updates
- Changed
create_form1 field changed- changed
Input schema / properties / report / properties / hideOverallScore / descriptionPrevious value: -"Hide the overall score on the result page (the score ring / number / percentile), keeping the level name, level description and summary. Scored scenes only (ignored for outcome). Default false."New value: +"Hide scores on the result page: the overall score (score ring / number / percentile) AND every dimension score (score / max score / progress bar / score rate) are hidden together, keeping level names, level descriptions, the level ladder, dimension levels and the summary. Note the summary template still renders its score variable if you left one in. Scored scenes only (ignored for outcome). Default false."
- Changed
update_form1 field changed- changed
Input schema / properties / report / properties / hideOverallScore / descriptionPrevious value: -"Hide the overall score on the result page (the score ring / number / percentile), keeping the level name, level description and summary. Scored scenes only (ignored for outcome). Default false."New value: +"Hide scores on the result page: the overall score (score ring / number / percentile) AND every dimension score (score / max score / progress bar / score rate) are hidden together, keeping level names, level descriptions, the level ladder, dimension levels and the summary. Note the summary template still renders its score variable if you left one in. Scored scenes only (ignored for outcome). Default false."
1 tool update
- Changed
update_form_settings1 field changed- changed
Input schema / properties / timeLimit / descriptionPrevious value: -"Answer-time countdown"New value: +"Answer-time countdown. Only knowledge quizzes (knowledge_quiz / random_knowledge_quiz) can turn this on — a countdown makes sense when unanswered means wrong, but rushing a scorecard or a personality quiz just produces careless answers."
1 tool update
- Changed
update_form_translation3 fields changed- added
Input schema / properties / fields / items / properties / explainAdded value: +{ + "description": "Knowledge quiz: translated answer explanation shown in the answer review.", + "type": "string" +} - added
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / levels / items / properties / ctaAdded value: +{ + "additionalProperties": true, + "description": "Only the CTA button text is translatable; the link and its settings come from the source.", + "properties": { + "text": { + "description": "Translated CTA button text.", + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / report / properties / overallAnalysis / properties / levels / items / properties / ctaAdded value: +{ + "additionalProperties": true, + "description": "Only the CTA button text is translatable; the link and its settings come from the source.", + "properties": { + "text": { + "description": "Translated CTA button text.", + "type": "string" + } + }, + "type": "object" +}
1 tool update
- Changed
invite_member1 field changed- changed
Input schema / properties / role / descriptionPrevious value: -"Role to grant. Defaults to \"member\". \"admin\" can only be granted by the team owner."New value: +"Role to grant. Defaults to \"member\": \"viewer\" is read-only, \"admin\" manages the whole team. Cannot be \"owner\"."
5 tool updates
- Changed
add_question5 fields changed- changed
Input schema / descriptionPrevious value: -"FIELD APPLICABILITY — `type` is the only field the schema always requires; `type` (plus the form scene) decides which of the remaining fields apply, and one that does not apply is either rejected with an explanatory error or ignored, so never pass it. Breaker (page break) takes nothing but `type`. Every question type takes `name` (required) plus the optional `code` / `description` / `explain` / `required`. Type-specific fields: SingleCheck / MultiCheck / DropDown / Ordering / Cascade need `choices` (Cascade nests via choices[i].children; DropDown also takes `multiple`; Ordering also takes `shuffle`); TrueFalse has a fixed pair of options and takes `trueLabel` / `falseLabel` instead of `choices`; DateField / TimeField take `precision`; NumberField takes `min` / `max` / `unit` / `decimalPlaces`; Rate takes `steps` / `words`. Scene rules for scoring: quiz — `correctAnswer` plus `score` > 0 are REQUIRED on SingleCheck / MultiCheck / DropDown / Ordering, optional on FillBlank (add `aiMatch` to have AI grade it instead of exact string match) and NumberField (omit both and the question is just a data-collection field), and rejected on DateField / TimeField; scored_quiz — score each option via choices[i].score; `correctAnswer` / `score` are rejected on NumberField and Rate (the submitted value is the score) and on FillBlank (free text is collected only, never scored); outcome — nothing is scored: `correctAnswer` / `score` / `aiMatch` are all rejected, every choice needs `outcomes` (TrueFalse votes via `trueOutcomes` / `falseOutcomes`). Type availability per scene: Ordering is knowledge_quiz-only; FillBlank works in knowledge_quiz (optionally scored) and in scored_quiz (data-collection only — its answer never feeds a score or a report formula); Cascade, Rate, DateField and TimeField are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker."New value: +"FIELD APPLICABILITY — `type` is the only field the schema always requires; `type` (plus the form scene) decides which of the remaining fields apply, and one that does not apply is either rejected with an explanatory error or ignored, so never pass it. Breaker (page break) takes nothing but `type`. Display blocks collect no answer, are never scored and are allowed in every scene: Statement takes `content` (the rich text IS the block) and Swiper takes `items` (an image carousel); both also accept an optional `name`, a label used by the web editor only, and neither takes any question field. Every question type takes `name` (required) plus the optional `code` / `description` / `explain` / `required`. Type-specific fields: SingleCheck / MultiCheck / DropDown / Ordering / Cascade need `choices` (Cascade nests via choices[i].children; DropDown also takes `multiple`; Ordering also takes `shuffle`); TrueFalse has a fixed pair of options and takes `trueLabel` / `falseLabel` instead of `choices`; DateField / TimeField take `precision`; NumberField takes `min` / `max` / `unit` / `decimalPlaces`; Rate takes `steps` / `words`. Scene rules for scoring: quiz — `correctAnswer` plus `score` > 0 are REQUIRED on SingleCheck / MultiCheck / DropDown / Ordering, optional on FillBlank (add `aiMatch` to have AI grade it instead of exact string match) and NumberField (omit both and the question is just a data-collection field), and rejected on DateField / TimeField; scored_quiz — score each option via choices[i].score; `correctAnswer` / `score` are rejected on NumberField and Rate (the submitted value is the score) and on FillBlank (free text is collected only, never scored); outcome — nothing is scored: `correctAnswer` / `score` / `aiMatch` are all rejected, every choice needs `outcomes` (TrueFalse votes via `trueOutcomes` / `falseOutcomes`). Type availability per scene: Ordering is knowledge_quiz-only; FillBlank works in knowledge_quiz (optionally scored) and in scored_quiz (data-collection only — its answer never feeds a score or a report formula); Cascade, Rate, DateField and TimeField are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker." - added
Input schema / properties / contentAdded value: +{ + "description": "Statement only, and required there: the text respondents read — an intro, a section lead-in, instructions, a disclaimer. The block renders this and nothing else. Same rich-text rules as `description` (headings / lists / links / <img src> / math formulas). This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one.", + "maxLength": 5000, + "type": "string" +} - added
Input schema / properties / itemsAdded value: +{ + "description": "Swiper only, and required there: the carousel slides in display order, 1-10 of them. Upload the images with prepare_image_upload / finalize_image_upload first and pass the returned media IDs. Rejected for every other type.", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Optional slide note. Web editor only, same as title.", + "maxLength": 1000, + "type": "string" + }, + "image": { + "description": "The slide image: a media ID returned by finalize_image_upload, or the media URL of an image already in this team library. Required — the answer page renders the images and nothing else.", + "type": "string" + }, + "title": { + "description": "Optional slide label. Shown in the web editor only (the answer page renders the image), and translatable per language.", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "image" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / type / descriptionPrevious value: -"Question type; Breaker means a page break, no name/choices etc. needed"New value: +"Question type; Breaker means a page break, no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer" - changed
Input schema / properties / type / enumPrevious value: -[ - "SingleCheck", - "MultiCheck", - "TrueFalse", - "FillBlank", - "DateField", - "TimeField", - "NumberField", - "Rate", - "DropDown", - "Cascade", - "Ordering", - "Breaker" -]New value: +[ + "SingleCheck", + "MultiCheck", + "TrueFalse", + "FillBlank", + "DateField", + "TimeField", + "NumberField", + "Rate", + "DropDown", + "Cascade", + "Ordering", + "Breaker", + "Statement", + "Swiper" +]
- Changed
create_form6 fields changed- changed
Input schema / properties / questions / descriptionPrevious value: -"Optional. A list of questions/page breaks to create at once, written into form.fields in order. Question types: SingleCheck/MultiCheck/TrueFalse; FillBlank (free text — scored in quiz via correctAnswer, an unscored data-collection field in scored_quiz); DropDown (single or multiple via `multiple`, use it instead of SingleCheck/MultiCheck when there are more than 20 choices); Cascade (hierarchical choices via children, scored_quiz only); Ordering (quiz only, correctAnswer = all choices in the correct order); DateField/TimeField as unscored data-collection fields (scored_quiz only); NumberField (quiz: optional numeric correctAnswer + score; scored_quiz: the submitted number feeds report formulas); Rate (scored_quiz only, the 1..steps rating value is the question score unless per-star scores are set in the web app). Insert a page break with { type: \"Breaker\" }, which the AI can interleave between questions to paginate. At most 100 items."New value: +"Optional. A list of questions/page breaks to create at once, written into form.fields in order. Question types: SingleCheck/MultiCheck/TrueFalse; FillBlank (free text — scored in quiz via correctAnswer, an unscored data-collection field in scored_quiz); DropDown (single or multiple via `multiple`, use it instead of SingleCheck/MultiCheck when there are more than 20 choices); Cascade (hierarchical choices via children, scored_quiz only); Ordering (quiz only, correctAnswer = all choices in the correct order); DateField/TimeField as unscored data-collection fields (scored_quiz only); NumberField (quiz: optional numeric correctAnswer + score; scored_quiz: the submitted number feeds report formulas); Rate (scored_quiz only, the 1..steps rating value is the question score unless per-star scores are set in the web app). Insert a page break with { type: \"Breaker\" }, which the AI can interleave between questions to paginate. Display blocks collect no answer: { type: \"Statement\", content } is a rich-text passage (intro / section lead-in / disclaimer) and { type: \"Swiper\", items } an image carousel. At most 100 items." - changed
Input schema / properties / questions / items / descriptionPrevious value: -"One question, or a page break. FIELD APPLICABILITY — `type` is the only field the schema always requires; `type` (plus the form scene) decides which of the remaining fields apply, and one that does not apply is either rejected with an explanatory error or ignored, so never pass it. Breaker (page break) takes nothing but `type`. Every question type takes `name` (required) plus the optional `code` / `description` / `explain` / `required`. Type-specific fields: SingleCheck / MultiCheck / DropDown / Ordering / Cascade need `choices` (Cascade nests via choices[i].children; DropDown also takes `multiple`; Ordering also takes `shuffle`); TrueFalse has a fixed pair of options and takes `trueLabel` / `falseLabel` instead of `choices`; DateField / TimeField take `precision`; NumberField takes `min` / `max` / `unit` / `decimalPlaces`; Rate takes `steps` / `words`. Scene rules for scoring: quiz — `correctAnswer` plus `score` > 0 are REQUIRED on SingleCheck / MultiCheck / DropDown / Ordering, optional on FillBlank (add `aiMatch` to have AI grade it instead of exact string match) and NumberField (omit both and the question is just a data-collection field), and rejected on DateField / TimeField; scored_quiz — score each option via choices[i].score; `correctAnswer` / `score` are rejected on NumberField and Rate (the submitted value is the score) and on FillBlank (free text is collected only, never scored); outcome — nothing is scored: `correctAnswer` / `score` / `aiMatch` are all rejected, every choice needs `outcomes` (TrueFalse votes via `trueOutcomes` / `falseOutcomes`). Type availability per scene: Ordering is knowledge_quiz-only; FillBlank works in knowledge_quiz (optionally scored) and in scored_quiz (data-collection only — its answer never feeds a score or a report formula); Cascade, Rate, DateField and TimeField are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker."New value: +"One question, a page break, or a display block (Statement / Swiper). FIELD APPLICABILITY — `type` is the only field the schema always requires; `type` (plus the form scene) decides which of the remaining fields apply, and one that does not apply is either rejected with an explanatory error or ignored, so never pass it. Breaker (page break) takes nothing but `type`. Display blocks collect no answer, are never scored and are allowed in every scene: Statement takes `content` (the rich text IS the block) and Swiper takes `items` (an image carousel); both also accept an optional `name`, a label used by the web editor only, and neither takes any question field. Every question type takes `name` (required) plus the optional `code` / `description` / `explain` / `required`. Type-specific fields: SingleCheck / MultiCheck / DropDown / Ordering / Cascade need `choices` (Cascade nests via choices[i].children; DropDown also takes `multiple`; Ordering also takes `shuffle`); TrueFalse has a fixed pair of options and takes `trueLabel` / `falseLabel` instead of `choices`; DateField / TimeField take `precision`; NumberField takes `min` / `max` / `unit` / `decimalPlaces`; Rate takes `steps` / `words`. Scene rules for scoring: quiz — `correctAnswer` plus `score` > 0 are REQUIRED on SingleCheck / MultiCheck / DropDown / Ordering, optional on FillBlank (add `aiMatch` to have AI grade it instead of exact string match) and NumberField (omit both and the question is just a data-collection field), and rejected on DateField / TimeField; scored_quiz — score each option via choices[i].score; `correctAnswer` / `score` are rejected on NumberField and Rate (the submitted value is the score) and on FillBlank (free text is collected only, never scored); outcome — nothing is scored: `correctAnswer` / `score` / `aiMatch` are all rejected, every choice needs `outcomes` (TrueFalse votes via `trueOutcomes` / `falseOutcomes`). Type availability per scene: Ordering is knowledge_quiz-only; FillBlank works in knowledge_quiz (optionally scored) and in scored_quiz (data-collection only — its answer never feeds a score or a report formula); Cascade, Rate, DateField and TimeField are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker." - added
Input schema / properties / questions / items / properties / contentAdded value: +{ + "description": "Statement only, and required there: the text respondents read — an intro, a section lead-in, instructions, a disclaimer. The block renders this and nothing else. Same rich-text rules as `description` (headings / lists / links / <img src> / math formulas). This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one.", + "maxLength": 5000, + "type": "string" +} - added
Input schema / properties / questions / items / properties / itemsAdded value: +{ + "description": "Swiper only, and required there: the carousel slides in display order, 1-10 of them. Upload the images with prepare_image_upload / finalize_image_upload first and pass the returned media IDs. Rejected for every other type.", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Optional slide note. Web editor only, same as title.", + "maxLength": 1000, + "type": "string" + }, + "image": { + "description": "The slide image: a media ID returned by finalize_image_upload, or the media URL of an image already in this team library. Required — the answer page renders the images and nothing else.", + "type": "string" + }, + "title": { + "description": "Optional slide label. Shown in the web editor only (the answer page renders the image), and translatable per language.", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "image" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / questions / items / properties / type / descriptionPrevious value: -"Question type; Breaker means a page break (the frontend pushes subsequent questions to the next page), no name/choices etc. needed"New value: +"Question type; Breaker means a page break (the frontend pushes subsequent questions to the next page), no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer" - changed
Input schema / properties / questions / items / properties / type / enumPrevious value: -[ - "SingleCheck", - "MultiCheck", - "TrueFalse", - "FillBlank", - "DateField", - "TimeField", - "NumberField", - "Rate", - "DropDown", - "Cascade", - "Ordering", - "Breaker" -]New value: +[ + "SingleCheck", + "MultiCheck", + "TrueFalse", + "FillBlank", + "DateField", + "TimeField", + "NumberField", + "Rate", + "DropDown", + "Cascade", + "Ordering", + "Breaker", + "Statement", + "Swiper" +]
- Changed
insert_question5 fields changed- changed
Input schema / descriptionPrevious value: -"FIELD APPLICABILITY — `type` is the only field the schema always requires; `type` (plus the form scene) decides which of the remaining fields apply, and one that does not apply is either rejected with an explanatory error or ignored, so never pass it. Breaker (page break) takes nothing but `type`. Every question type takes `name` (required) plus the optional `code` / `description` / `explain` / `required`. Type-specific fields: SingleCheck / MultiCheck / DropDown / Ordering / Cascade need `choices` (Cascade nests via choices[i].children; DropDown also takes `multiple`; Ordering also takes `shuffle`); TrueFalse has a fixed pair of options and takes `trueLabel` / `falseLabel` instead of `choices`; DateField / TimeField take `precision`; NumberField takes `min` / `max` / `unit` / `decimalPlaces`; Rate takes `steps` / `words`. Scene rules for scoring: quiz — `correctAnswer` plus `score` > 0 are REQUIRED on SingleCheck / MultiCheck / DropDown / Ordering, optional on FillBlank (add `aiMatch` to have AI grade it instead of exact string match) and NumberField (omit both and the question is just a data-collection field), and rejected on DateField / TimeField; scored_quiz — score each option via choices[i].score; `correctAnswer` / `score` are rejected on NumberField and Rate (the submitted value is the score) and on FillBlank (free text is collected only, never scored); outcome — nothing is scored: `correctAnswer` / `score` / `aiMatch` are all rejected, every choice needs `outcomes` (TrueFalse votes via `trueOutcomes` / `falseOutcomes`). Type availability per scene: Ordering is knowledge_quiz-only; FillBlank works in knowledge_quiz (optionally scored) and in scored_quiz (data-collection only — its answer never feeds a score or a report formula); Cascade, Rate, DateField and TimeField are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker."New value: +"FIELD APPLICABILITY — `type` is the only field the schema always requires; `type` (plus the form scene) decides which of the remaining fields apply, and one that does not apply is either rejected with an explanatory error or ignored, so never pass it. Breaker (page break) takes nothing but `type`. Display blocks collect no answer, are never scored and are allowed in every scene: Statement takes `content` (the rich text IS the block) and Swiper takes `items` (an image carousel); both also accept an optional `name`, a label used by the web editor only, and neither takes any question field. Every question type takes `name` (required) plus the optional `code` / `description` / `explain` / `required`. Type-specific fields: SingleCheck / MultiCheck / DropDown / Ordering / Cascade need `choices` (Cascade nests via choices[i].children; DropDown also takes `multiple`; Ordering also takes `shuffle`); TrueFalse has a fixed pair of options and takes `trueLabel` / `falseLabel` instead of `choices`; DateField / TimeField take `precision`; NumberField takes `min` / `max` / `unit` / `decimalPlaces`; Rate takes `steps` / `words`. Scene rules for scoring: quiz — `correctAnswer` plus `score` > 0 are REQUIRED on SingleCheck / MultiCheck / DropDown / Ordering, optional on FillBlank (add `aiMatch` to have AI grade it instead of exact string match) and NumberField (omit both and the question is just a data-collection field), and rejected on DateField / TimeField; scored_quiz — score each option via choices[i].score; `correctAnswer` / `score` are rejected on NumberField and Rate (the submitted value is the score) and on FillBlank (free text is collected only, never scored); outcome — nothing is scored: `correctAnswer` / `score` / `aiMatch` are all rejected, every choice needs `outcomes` (TrueFalse votes via `trueOutcomes` / `falseOutcomes`). Type availability per scene: Ordering is knowledge_quiz-only; FillBlank works in knowledge_quiz (optionally scored) and in scored_quiz (data-collection only — its answer never feeds a score or a report formula); Cascade, Rate, DateField and TimeField are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker." - added
Input schema / properties / contentAdded value: +{ + "description": "Statement only, and required there: the text respondents read — an intro, a section lead-in, instructions, a disclaimer. The block renders this and nothing else. Same rich-text rules as `description` (headings / lists / links / <img src> / math formulas). This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one.", + "maxLength": 5000, + "type": "string" +} - added
Input schema / properties / itemsAdded value: +{ + "description": "Swiper only, and required there: the carousel slides in display order, 1-10 of them. Upload the images with prepare_image_upload / finalize_image_upload first and pass the returned media IDs. Rejected for every other type.", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Optional slide note. Web editor only, same as title.", + "maxLength": 1000, + "type": "string" + }, + "image": { + "description": "The slide image: a media ID returned by finalize_image_upload, or the media URL of an image already in this team library. Required — the answer page renders the images and nothing else.", + "type": "string" + }, + "title": { + "description": "Optional slide label. Shown in the web editor only (the answer page renders the image), and translatable per language.", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "image" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / type / descriptionPrevious value: -"Question type; Breaker means a page break, no name/choices etc. needed"New value: +"Question type; Breaker means a page break, no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer" - changed
Input schema / properties / type / enumPrevious value: -[ - "SingleCheck", - "MultiCheck", - "TrueFalse", - "FillBlank", - "DateField", - "TimeField", - "NumberField", - "Rate", - "DropDown", - "Cascade", - "Ordering", - "Breaker" -]New value: +[ + "SingleCheck", + "MultiCheck", + "TrueFalse", + "FillBlank", + "DateField", + "TimeField", + "NumberField", + "Rate", + "DropDown", + "Cascade", + "Ordering", + "Breaker", + "Statement", + "Swiper" +]
- Changed
move_question1 field changed- changed
Input schema / properties / code / descriptionPrevious value: -"The field code to move (a question or a Breaker)"New value: +"The field code to move (a question, a Breaker or a display block)"
- Changed
update_question2 fields changed- added
Input schema / properties / contentAdded value: +{ + "description": "Statement block only: the new body text, which is the whole block. Same rich-text rules as description. It cannot be emptied — delete_question the block if you no longer want it. This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one.", + "maxLength": 5000, + "type": "string" +} - added
Input schema / properties / itemsAdded value: +{ + "description": "Swiper block only: replace ALL slides with this list (1-10). Slides get fresh ids, so any translated slide titles / notes for this block have to be rewritten afterwards.", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Optional slide note. Web editor only, same as title.", + "maxLength": 1000, + "type": "string" + }, + "image": { + "description": "The slide image: a media ID returned by finalize_image_upload, or the media URL of an image already in this team library. Required — the answer page renders the images and nothing else.", + "type": "string" + }, + "title": { + "description": "Optional slide label. Shown in the web editor only (the answer page renders the image), and translatable per language.", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "image" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" +}
48 tool updates
- First observed
add_lead_comment - First observed
add_question - First observed
assign_leads - First observed
create_form - First observed
create_form_from_template - First observed
create_form_translation - First observed
delete_form - First observed
delete_form_translation - First observed
delete_question - First observed
duplicate_form - First observed
finalize_image_upload - First observed
get_active_tenant - First observed
get_booking_availability - First observed
get_examinee - First observed
get_form - First observed
get_form_funnel - First observed
get_form_share_info - First observed
get_form_stats - First observed
get_form_translation - First observed
get_lead - First observed
get_record - First observed
insert_question - First observed
invite_member - First observed
list_bookings - First observed
list_examinees - First observed
list_form_translations - First observed
list_forms - First observed
list_lead_settings - First observed
list_leads - First observed
list_my_tenants - First observed
list_records - First observed
list_templates - First observed
move_question - First observed
prepare_image_upload - First observed
reschedule_booking - First observed
restore_form - First observed
review_booking - First observed
set_dimension_analysis - First observed
set_lead_tags - First observed
switch_active_tenant - First observed
update_booking_status - First observed
update_examinee - First observed
update_form - First observed
update_form_settings - First observed
update_form_translation - First observed
update_lead - First observed
update_question - First observed
update_tenant_slug
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables detection and analysis of pre-public product launches through web search, content extraction, AI-powered scoring, and automated alerting. Provides comprehensive tools for surfacing stealth startup signals before they trend publicly.MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT- AlicenseNot gradedqualityCmaintenanceEnables AI chat clients to perform market research and competitive intelligence by gathering company overviews, competitor lists, product portfolios, pricing snapshots, and recent news via live Tavily search.MIT
- AlicenseAqualityAmaintenanceDetects hiring intent signals by scanning job boards for specific companies. Returns structured role data for outbound sales targeting.11961MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Most tools map to a distinct resource and action, and the descriptions actively disambiguate similar operations (e.g., get_form vs get_form_share_info vs get_form_stats). The main potential confusion is between list_records and list_leads and between get_record and get_lead, since both describe leads from slightly different angles.
All tool names follow a consistent snake_case verb_noun convention, with resources like form, question, lead, booking, examinee, translation, and tenant parallel across actions. The few non-CRUD verbs like prepare_/finalize_, duplicate_, and reschedule_ still fit the same uniform pattern.
48 tools is well beyond the 3–15 ideal and even past the 25+ threshold, making the tool surface heavy for an agent to navigate. The broad platform scope explains some of the size, but the count still risks overwhelming context and increasing misselection.
The server covers form lifecycle, question editing, translations, CRM leads, examinees, records, bookings, team/tenant operations, image uploads, templates, and analytics extremely well. Minor gaps remain—such as no lead/record deletion, no member removal or role updates, and limited booking-settings management—but most workflows can be completed with the existing tools.