RooQuiz
RooQuiz MCP server lets you build, publish, and analyze quizzes, and capture and manage leads, directly from an MCP client.
Create knowledge, scored, and outcome quizzes from scratch or from templates; edit questions, scoring formulas, dimension analysis, themes, and report settings.
Manage forms: list, view, update, duplicate, delete/restore, add/insert/move/delete questions, and configure translations into multiple languages.
Capture and manage leads: list/search leads, update follow-up status, assign to team members, set color tags, and add internal comments.
Work with respondents/examinees: view masked PII, look up full details, and update editable profile/custom data.
Analyze quiz performance: submission statistics, conversion funnels, per-channel performance, drop-off points, and per-question answer distributions.
Handle bookings: list bookings, check availability, approve/decline requests, reschedule, and update completion/no-show/cancellation status.
Manage team context: list and switch active teams, invite members, and change the team slug.
Upload images to the media library for quiz covers and landing pages via a two-step presigned URL flow.
Get share links, embed snippets, custom-domain status, and delivery settings for launching quizzes.
RooQuiz MCP Server
Remote MCP server for RooQuiz — a lightweight assessment platform for lead capture and viral sharing. Build quizzes with AI-assisted authoring, capture leads from results pages, and analyze funnel conversion — straight from Claude, ChatGPT, Cursor, or any MCP client.
Endpoint:
https://payload.rooquiz.com/api/mcp(Streamable HTTP)Auth: OAuth 2.1 — authorization code + PKCE with dynamic client registration. Sign in with your RooQuiz account when your client prompts you; no API key needed.
Registry name:
com.rooquiz/rooquiz-mcp
Connect
One-click: VS Code · VS Code Insiders · Cursor
Claude Code
claude mcp add --transport http rooquiz https://payload.rooquiz.com/api/mcpclaude.ai / ChatGPT — add a custom connector and paste the endpoint URL.
Cursor (.cursor/mcp.json)
{
"mcpServers": {
"rooquiz": {
"url": "https://payload.rooquiz.com/api/mcp"
}
}
}VS Code / GitHub Copilot (.vscode/mcp.json)
{
"servers": {
"rooquiz": {
"type": "http",
"url": "https://payload.rooquiz.com/api/mcp"
}
}
}Related MCP server: Quiz Generator AI MCP
Example prompts
Once connected, talk to it in plain language. Each of these exercises a different part of the server:
Build from a template
Show me the coaching templates, create a scored quiz from the readiness one, then add two questions about budget.
Exercises list_templates → create_form_from_template → add_question.
Work the leads
List the leads my Wheel of Life quiz captured this week, tag everyone who scored under 40 as follow-up, and assign them to me.
Exercises list_leads → set_lead_tags → assign_leads.
Diagnose the funnel
Which of my quizzes has the worst completion rate, and where exactly do people drop off?
Exercises list_forms → get_form_stats → get_form_funnel.
Go multilingual
Translate my promotion-readiness quiz into Spanish and German, keeping the question codes.
Exercises list_form_translations → create_form_translation.
Respondent names, email addresses and phone numbers come back masked (j***g@example.com),
so address a respondent by id rather than pasting a masked value back in.
What you can do
Quizzes — create knowledge quizzes, scored quizzes, and "which X are you" outcome quizzes; edit questions, scoring formulas, and dimension analysis; start from templates
Translations — one source form, mirrored translations in any language
Leads — list, tag, assign, and comment on leads captured from quiz results pages
Respondents & records — look up respondents, submissions, stats, and funnel analytics
Bookings — review and reschedule bookings made through quiz results pages
Team — switch active team, invite members, manage question banks and categories
All tools act within the team your session is bound to.
stdio bridge
Hosts without native HTTP transport (Claude Desktop, older MCP clients) and registry
crawlers that build a container can go through the bridge in bin/rooquiz-mcp.mjs
— dependency-free, Node 18+. Everything above is a better path if your client speaks HTTP.
node bin/rooquiz-mcp.mjs # or: docker build -t rooquiz-mcp . && docker run -i --rm rooquiz-mcpEnv | Default | Purpose |
| (unset) | Bearer token — required for every hosted tool |
Every method needs a token, initialize included: without one the server answers 401 with
a WWW-Authenticate header pointing at the resource metadata. Clients with native HTTP
transport get this for free through OAuth; the bridge has nowhere to run a browser flow, so
give it a personal access token.
With no usable token the bridge still completes a handshake and answers tools/list, reading
both from bin/introspection.json — a snapshot of what the hosted
server returns. That is there for registry crawlers, which build this container with no
credentials and judge the server by whether it introspects. Calling a hosted tool still goes
upstream and still 401s. Once a working token is set nothing is served locally: every
message is forwarded, so a stale file can never shadow live data. Refresh it after changing
tools:
ROOQUIZ_TOKEN=rqp_live_xxx node scripts/snapshot-tools.mjsPreview mode — no token, no account
A bridge with no usable token is not useless. It also serves four tools that need no credentials at all, because they target RooQuiz's public preview endpoint:
Tool | What it builds |
| Right/wrong quiz — correct answers earn points and the taker gets a graded score |
| Scored questionnaire — every option adds points toward a total that buckets into a level |
| Personality / type test — options vote for result types and the most-voted type wins |
| The full authoring guide for one of the three: field schema, scoring rules, themes, examples |
Ask in plain language — "make me a 5-question personality quiz about coffee and give me a
link" — and you get back something like https://quizster.app/b/7k3m9q2p, openable and
shareable straight away. Previews self-destruct after about an hour and anonymous creation is
capped at roughly 10 per hour per IP; sign in and use create_form to keep an assessment.
These tools are the rooquiz-skills SKILL.md
files vendored into bin/skills.json — the same instructions that repo
ships as a Claude Code plugin, served here over MCP instead. That repo is their source of
truth; re-vendor after editing one:
ROOQUIZ_SKILLS_DIR=../rooquiz-skills node scripts/sync-skills.mjsThey disappear once a working token is set: with an account, create_form builds a permanent
form rather than a link that expires.
Support
Questions or issues: support@rooquiz.com
This repository carries the server.json manifest published to the official
MCP Registry, plus the MIT-licensed stdio bridge. The hosted server implementation itself is
closed source.
Available Tools
52 toolsadd_lead_commentA
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?
With annotations offering no safety profile (all hints false), the description carries the full burden of behavioral disclosure. It does this thoroughly: it warns that the operation is not idempotent, explains that a timeout may still have succeeded, and advises checking before retrying to avoid duplicates. It also discloses the visibility constraint and the character limit, which are behavioral traits the schema and annotations do not 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?
The description is compact and front-loaded: purpose first, then constraints, then the retry warning. Every sentence carries essential information, and the non-idempotency warning is placed last where it can be recalled when handling errors. 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 small write-only tool with a defined output schema, the description is complete: it states what the note is, who sees it, the size limit, the optional context parameter, how to verify existing notes, and how to safely handle timeouts. No critical call-time behavior is left undisclosed.
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 meaningful semantics beyond the schema by clarifying that leadId refers to a lead of the current team and that recordId provides optional submission context. It also restates the 2000-character cap, reinforcing the schema's maxLength constraint.
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 action and resource: 'Write an internal follow-up note on a lead.' It immediately distinguishes the tool from siblings by specifying visibility (team members only, never the respondent) and by naming how to read existing notes via get_lead, which separates it from read operations.
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 for when this tool is appropriate: adding an internal note with team-only visibility, optional record context, and a max length. It explicitly points to get_lead(includeComments: true) as the way to read existing notes, but does not explicitly name exclusions or alternatives beyond that reading path, so it stops short of a full when-not-to-use guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_questionA
Append an item to the end of a form. type is a question type or Breaker (page break — only formId + type are needed, other fields are ignored). 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). 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 | |
| unit | No | NumberField only: display unit suffix shown after the input, e.g. "kg" / "$" / "min". Rejected for other question types. | |
| 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. | |
| 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. |
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?
The description goes well beyond the all-false annotations by disclosing that the call is not idempotent and that retrying after a timeout can create duplicates. It also specifies that irrelevant fields are either rejected with an explanatory error or ignored, and details scene/type restrictions such as 'Rejected for DateField / TimeField / Rate' and 'scored_quiz only'.
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 packed with necessary information for a 24-parameter tool, and it fronts the core purpose before enumerating types. The non-idempotency warning is placed at the end, which is slightly buried but still present; 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?
Between the tool description, the exhaustive schema-level field-applicability text, and the output schema, an agent has everything needed to call this correctly: type/scene rules, scoring semantics, field rejection behavior, and the retry caveat. Nothing critical 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 already carries detailed semantics (e.g., `multiple` shape, `choice` nesting, `aiMatch` grading). The tool description adds a high-level summary and a few cross-cutting notes (e.g., 'prefer DropDown past 20 choices'), but most parameter detail is redundant with the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Append an item to the end of a form', naming the action, resource, and position precisely. The subsequent breakdown of question types reinforces the scope, and the 'to the end' wording implicitly distinguishes it from the sibling insert_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 clearly implies the tool is for appending to the end of a form, but it never explicitly contrasts it with alternatives such as insert_question for positional insertions or update_question for modifications. The extensive type/scene guidance is about parameter selection rather than tool selection, so an agent gets no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assign_leadsA
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 (readOnlyHint=false, destructiveHint=false), the description discloses side effects: Each change is recorded on the lead's timeline, and the assignee gets one aggregated notification for the whole batch. It also explains unassign behavior and the active non-viewer member requirement, with no contradiction of 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 four compact sentences with no filler; purpose, batching, assignee rules, and side effects each get exactly one sentence. It is front-loaded with the core action before constraints.
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 mutation with an output schema, the description covers what, when, how, constraints, and side effects. There is no missing information an agent needs to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it frames leadIds as a batch that must be passed in one call and adds assignee validity constraints and the me/null convention. This materially improves an agent's ability to set both parameters correctly.
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 pair, Assign one or more leads of the current team to a member, or clear the assignee, which also covers the unassign case. This clearly distinguishes assign_leads from siblings like update_lead, 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 explicit batching guidance: Pass every lead id in a single call (up to 50) — do not loop one call per lead. It also references the sibling tool for valid assignees (see list_lead_settings.assignableMembers) and specifies the me vs omit/null semantics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_formA
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). 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. 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?
Beyond the readOnlyHint/destructiveHint/openWorldHint annotations, the description discloses non-obvious behaviors: the operation is not idempotent, it creates only the primary language, and the returned structuredContent.fields carries question codes that should be read before constructing formulas. These are valuable traits not available in 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?
Six sentences, each earning its place: purpose, usage pattern, scene constraint, response/flow, language scope, and idempotency warning. The order is logical and there is 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?
For a 9-parameter tool with nested objects, the description covers the critical non-schema facts: when to pass questions/report together, how to handle generated codes, scene-specific requirements, language scope, and retry safety. Since an output schema exists, return values are already covered structurally.
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%, giving a baseline of 3. The description adds useful cross-parameter workflow: report.outcomes is required with trueOutcomes/falseOutcomes in the outcome_quiz scene, and report.formula/dimensionAnalysis depend on server-generated question codes. However, the example 'q_a + q_b' omits the required `{{ }}` wrappers that the schema explicitly mandates, making it slightly unreliable.
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 'Create a form in the team this token is bound to', a specific verb+resource+scope statement. It further distinguishes from siblings by explaining that questions and report configuration are created in one call, and by pointing to create_form_translation for other languages.
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 states when to use this tool ('Pass the questions array and report configuration in one call instead of following up with per-question calls') and names alternatives: create_form_translation for additional languages, and update_form / set_dimension_analysis for post-create report configuration. It also provides a clear retry-after-timeout guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_form_from_templateA
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?
Beyond the annotations (mutation allowed, not read-only), the description proactively discloses the non-idempotent behavior: '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.' It also details exactly what is cloned (structure, scoring/report config, visual settings, all language versions), which is materially useful context not captured by annotations or 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?
All four sentences earn their place: purpose, scoping/cloning detail, guidance on alternatives, and a critical non-idempotency warning. The main verb and object are front-loaded, and there is no redundant fluff.
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 tool with an output schema, the description covers everything needed: what it creates, where to get template IDs, what is cloned, how to override the title, how to adjust afterward, when to prefer it, and the retry caveat. With an output schema present, return values need no further explanation.
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 value by telling the agent to 'find template ids with list_templates' — a concrete source for the templateId parameter — and by clarifying the title override behavior, even though the schema already mentions the default. This extra guidance lifts it to 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?
The description opens with a specific action and resource: 'Create a new form in the current team from a public template.' It distinguishes itself from siblings by explicitly referencing create_form as the alternative to build from scratch and by mentioning subsequent adjustability via update_form/update_question, so an agent can tell this tool apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use guidance: 'prefer it over building from scratch with create_form' when a suitable template exists. It also points to list_templates for finding template IDs and notes post-creation adjustment with update_form/update_question, making both the selection and follow-up path explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_form_translationA
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?
Annotations are minimal (readOnly=false, destructive=false), so the description carries behavioral context. It discloses the cloning behavior, that the return value is the draft to edit, the language constraint, and the at-most-one-per-language rule. 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, each earning its place: the core action, the workflow and next step, and the constraints. The most important information is front-loaded, and there is no padding or repetition.
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 creation workflow, the return behavior, the uniqueness constraint, and points to the relevant sibling tool. With an output schema and fully documented parameters, this is nearly complete; the only minor gap is explicit error behavior for duplicate or same-primary-language attempts.
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 both parameters at 100% coverage, including the language constraint. The description restates the language constraint without adding new parameter-level detail, so it neither adds nor detracts beyond the 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 clearly states the action ('Add a language version (translation) to a form') and the resource (a form translation). It also distinguishes itself from siblings like update_form_translation and delete_form_translation by describing the creation-specific clone-and-return behavior.
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 concrete workflow: create, edit the draft, then save with update_form_translation, and it points to list_form_translations for the one-per-language constraint. It does not explicitly state 'use update_form_translation if a translation already exists,' but the workflow and uniqueness constraint imply this context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_formADestructive
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 / team owner 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?
Annotations already convey destructive intent, but the description adds substantial behavioral context: the soft-delete behavior, hiding from list_forms, 5-day retention and auto-purge, reversibility via restore_form, owner/team-owner authorization, and preservation of submission records. This goes well beyond the structured annotation data.
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 dense, purposeful sentences, each contributing essential information: the action and scope, lifecycle and recovery behavior, and permission requirements plus submission handling. No filler or redundant repetition of schema content.
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 this tool's complexity: it covers scope, effects, recovery, retention, permissions, and data preservation. With an output schema present, return values need not be described, and the annotation set already covers read/destructiveness.
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 fully described in the schema itself. The description doesn't add extra parameter-level detail, but none is needed given the simple one-parameter interface.
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 and resource: 'Move a form into the trash (soft delete)'. It clearly distinguishes itself from siblings by explicitly contrasting with list_forms and restore_form, and by describing the soft-delete semantics.
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 context for when to use the tool: when you want to soft-delete a form. It names restore_form as the way to undo, specifies the 5-day recoverable window, and gives an explicit permission constraint ('Only the form owner / team owner can delete'), which acts as a when-not condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_form_translationADestructive
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?
Beyond the destructiveHint=true annotation, the description discloses important non-obvious consequences: submission records are NOT deleted, reports for historical records fall back to source text, and the primary language is not removable through this operation. This is precisely the behavioral context an agent needs before invoking a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: the first states the action, the second explains data-retention implications, and the third states the primary-language exclusion. The essential scoping is front-loaded, with no redundancy or extraneous detail.
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 operation with an output schema and annotations already present, the description covers all the necessary context: what is deleted, what is preserved, fallback behavior for reports, and a hard constraint on the primary language. No critical operational information 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 both formId and language are already documented in the schema. The description's phrase 'language version (translation)' reinforces the meaning of the language parameter and clarifies that formId refers to the source form, but it does not add substantial parameter-level detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact verb and resource: 'Delete one language version (translation) of a form.' It clearly distinguishes this from delete_form by specifying the object is a translation/language version, and it adds the critical constraint that the primary language cannot be deleted.
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 makes the tool's scope clear: deleting a language version is the intended use, and deleting the primary language is explicitly excluded. It does not explicitly name an alternative tool like delete_form for that case, so it stops short of perfectly explicit routing, but the usage context is otherwise unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_questionADestructive
Delete a single question or a page break (Breaker) from a form by code. 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 the tool destructive, so the description doesn't need to restate that. It adds valuable behavior beyond the annotation by stating that deleting the last element is permitted and that a form can end up as an empty shell. No contradiction with annotations exists.
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 with no filler. The main purpose is front-loaded, and the important boundary behavior about deleting the last item is separated cleanly. 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 two-parameter destructive tool with an output schema and destructiveHint annotation, the description provides all essential calling context: what gets deleted, how it is identified, and the notable edge case. There are no major gaps that would prevent 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 input schema already documents both parameters at 100% coverage with clear descriptions. The description adds extra meaning by revealing that 'code' may refer to either a question or a page break (Breaker), which broadens the interpretation of the schema's 'question' term.
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 ('Delete'), a precise resource ('a single question or a page break (Breaker) from a form'), and the identifier used ('by code'). This distinguishes it from sibling tools like delete_form, which deletes the entire form. There is no ambiguity about what this 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?
The description provides clear context: it is for removing an individual question/breaker from a form, not the whole form. It also clarifies an important edge case—deleting the last item is allowed—so an agent knows not to avoid calling it for fear of invalidating a form. However, it does not explicitly mention alternatives like delete_form or update_question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_formA
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 well beyond annotations by detailing side effects: it creates a brand-new form with fresh share links, does not copy submissions/integrations/ban state, and is explicitly non-idempotent with timeout-ambiguity warnings. This is exactly the kind of behavioral context an agent needs beyond readOnly/destructive hints.
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 structured effectively: main action and scope first, then exclusions, use case, and a critical non-idempotency warning. Every sentence carries meaningful information 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?
Given the tool's complexity—mutating, with timeout ambiguity and precise copy/exclusion semantics—the description covers everything needed to call it correctly. It explains what happens, what does not happen, when to use it, and how to handle retries. An output schema exists, so return-value documentation is not required here.
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 both parameters already have clear descriptions in the schema. The description adds general context about ownership and fresh links but no extra parameter-level semantics, so the 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 clearly states the verb 'duplicate' with a specific resource ('a form in the current team') and enumerates exactly what is cloned and what is not copied, such as submission records and sharing. This active scoping differentiates it from related form tools like create_form or create_form_from_template without needing to open 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 provides clear context: 'Useful for cloning a proven quiz and tweaking it.' It also gives guidance on retry behavior after a timeout. It does not explicitly name alternatives or state when not to use this tool, but the intended use case is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finalize_image_uploadA
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 discloses the side effect of recording the image in the team media library and the verification step, which goes beyond the annotations and schema. Annotations only say readOnlyHint=false, so the description usefully clarifies that this is a mutating finalization step, not merely a metadata update.
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 no wasted words. The prerequisite and step ordering are front-loaded, the action and outcome are stated, and the follow-up usage is a single targeted sentence.
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 an output schema present, the description need not spell out the return shape; it still mentions media id + public URL. Combined with the explicit prepare_image_upload prerequisite and update_form consumer guidance, an agent has everything needed 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?
Schema description coverage is 100%, and each parameter already carries accurate context: key is the object key from prepare_image_upload, filename must match the prepare call, mimeType is the prepare-time MIME type, and alt is optional. The description reinforces the flow but adds no new parameter-level 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 names a clear action ('call this AFTER you have PUT the file'), a specific resource (the uploaded object / team media library), and a concrete outcome (verifies, records, returns a media id + public URL). It clearly distinguishes itself from prepare_image_upload by framing it as 'Step 2 of 2'.
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 explicitly sequenced: it must be called after the PUT to the uploadUrl from prepare_image_upload, and the description gives a follow-up path via update_form for covers. It does not explicitly state when not to call it, but the protocol is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_active_tenantARead-only
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 mark this read-only and non-destructive, so the safety bar is met. The description adds meaningful behavior beyond annotations: all write tools default to this tenant, and the examineeSignupDisabled flag has operational consequences for login-gated quizzes. This is exactly the kind of context 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 core purpose is front-loaded in the first sentence, followed by the tenant-default behavior and then the flag explanation. Every sentence adds distinct value, and the practical troubleshooting tip is phrased efficiently.
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 no parameters, an output schema, and read-only annotations, the remaining burden is explaining what the output means and when to care. The description does that thoroughly, including the exact login scenarios affected by examineeSignupDisabled.
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 takes zero parameters, so the baseline is 4. There is nothing for the description to clarify, and the schema already confirms an empty input. No deduction is warranted.
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 clear verb and resource: 'Return the team (tenant) this token is currently operating against.' It also names the secondary returned signal, examineeSignupDisabled. It doesn't explicitly name or contrast a sibling like switch_active_tenant, so it doesn't fully earn the sibling-differentiation point, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete use case: check this tool before diagnosing why nobody can submit, and explains how the signup-disabled flag affects login-gated quizzes. It doesn't mention alternatives or exclusions, but for a read-only getter with no parameters, this is useful contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_booking_availabilityARead-only
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?
Annotations already signal read-only and non-destructive, and the description adds meaningful behavior beyond that: the enabled:false return case, server-side range clamping, and the special exclusion of a booking's own slot when rescheduling. These are exactly the non-obvious behavioral details 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?
Four dense sentences with no filler, front-loaded with the primary action and followed by edge cases and usage guidance. Every sentence earns its place and adds information an agent cannot reliably infer from schema or annotations alone.
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 availability tool with an output schema, annotations, and related siblings, the description covers the core behavior, failure mode (enabled:false), range limiting, rescheduling prerequisite, and bookingId semantics. Nothing material 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, but the description adds genuine value for bookingId by explaining its rescheduling purpose and the 'own slot is not counted as taken' behavior. It also clarifies that date ranges may be clamped server-side, going beyond the schema's basic field 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?
States a specific verb 'Read' and resource 'the current team's bookable time slots in a date range', and explains how the slots are computed ('weekly booking rules minus what is already taken'). This clearly distinguishes it from booking-management siblings like list_bookings or update_booking_status.
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 instructs to call this before reschedule_booking, explains why ('a start time outside the available slots is rejected'), and tells when to pass bookingId. This gives an agent a clear decision rule for when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_examineeARead-only
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?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description does not need to restate safety. It adds useful behavioral context beyond annotations: 'Sensitive auth fields are never returned' and that customData is included. This helps an agent understand the response boundary.
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 with no filler. The core behavior and key parameter are front-loaded, and the sensitive-field caveat is placed as a concise follow-up. 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?
Given an output schema exists and the tool has only one parameter, the description is complete. It states scope (current team), the ID source, included data (customData), and an important exclusion (sensitive auth fields). No critical information needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents examineeId as the business ID shown in list_examinees. The description repeats this example and adds the alias 'respondent,' but it does not meaningfully extend the parameter semantics 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 uses a specific verb ('View the full detail of one examinee'), names the resource ('examinee / respondent'), and specifies the lookup key ('examineeId'). It clearly distinguishes this from list_examinees and update_examinee by indicating it returns the full detail of a single examinee, including customData.
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: it is for viewing one examinee by business ID, scoped to the current team, and references list_examinees as the source of the ID. It does not explicitly state when not to use it or mention alternatives, but the single-resource vs. list distinction is implied strongly enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_formARead-only
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 declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: it identifies where outcome codes live (report.outcomeAnalysis.outcomes) and clarifies the meaning of language fields in the response.
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 carry substantial, non-redundant information. The main purpose is front-loaded, and the follow-up sentences add only high-value context about outcome analysis and translation languages.
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 single-form retrieval tool with one required parameter and an output schema, the description is complete: it states scope, what is returned, and two edge-context behaviors. Nothing essential for the 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?
Schema description coverage is 100%, so the schema already documents all three parameters well. The description mentions fields[] and report configuration, which loosely map to includeFields and includeReport, but does not add meaningful parameter-level detail 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 opens with a specific verb and resource: 'View one form of the current team in full,' and clarifies what is included (questions list fields[] and report configuration). This clearly distinguishes it from siblings like list_forms and get_form_translation.
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 it to view a single form in detail, including raw question data and report config. It does not explicitly name alternatives or exclusions, but the scope is unambiguous enough to guide selection among the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_form_funnelARead-only
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 declare readOnlyHint=true and destructiveHint=false. The description adds useful context beyond that: the scope ('in the current team'), the telemetry source ('form_sessions'), and the exact stage/breakdown details. 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?
The description is dense but not bloated. It front-loads the verb and resource, uses a colon to organize the breakdown list, and ends with a practical usage sentence. Every segment contributes information, though the enumeration is 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 an output schema present, the description only needs to convey scope, timing, and intended use, which it does thoroughly. It covers the team scope, the look-back window, the breakdown dimensions, and the drop-off analysis use case. 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?
Schema description coverage is 100%, so both formId and days are already documented with defaults and bounds. The description only echoes 'form' and 'last N days' without adding new parameter semantics, so the 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 opens with a specific verb and resource: 'Read the conversion funnel for a form...' and enumerates the exact breakdowns available (overall stages, per-channel, UTM combos, drop-offs). This clearly differentiates it from sibling tools like get_form_stats or list_records.
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 states a clear use case: 'Use this to find where respondents drop and improve conversion.' It does not explicitly name alternatives or when-not-to-use scenarios, but the funnel-specific context makes the appropriate usage apparent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_form_statsARead-only
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?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description starts with 'Read', which is consistent. It adds meaningful behavioral context by specifying team scoping, the time window, and the full breadth of returned statistics, giving the agent a good sense of what an invocation will produce. It does not cover performance or rate limits, but the annotations and output schema lower the burden.
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 element earns its place: the opening verb/resource/scope, the detailed list of returned statistics, and the closing use case. It is front-loaded with the core action and uses an em-dash list to keep the information structured and scannable.
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 moderate complexity, the 100% schema coverage, the presence of an output schema, and annotations covering safety, the description is complete. It explains what the tool does, what data it operates on, the team scope, the time-window parameter, and the intended usage. Nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: formId and days both have descriptions in the input schema. The description reinforces the meaning of days ('last N days') and adds the 'current team' scope, but it does not add parameter-level detail beyond the schema, so the 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 opens with a specific verb and resource: 'Read submission statistics for a form in the current team over the last N days.' It then enumerates the exact categories of statistics returned, making it easy to distinguish from the form CRUD siblings and from get_form_funnel even without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit intended use: 'Use this to gauge how a quiz is performing and to suggest improvements.' It does not mention alternatives or exclusions, but the clear use case and the read-only scoping in the first sentence provide enough context for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_form_translationARead-only
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?
Beyond the readOnlyHint annotation, the description discloses concrete behavior: it returns an error when the language version does not exist yet, includes mirrored fields[] and report in the result, and assumes a specific editing workflow. This is meaningful behavioral context that is not present in the 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?
Three sentences, each earning its place: the first states what the tool does, the second gives workflow guidance, and the third covers the error case and prerequisite. Information is front-loaded and there is no redundancy or fluff.
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 (two parameters) and has a full output schema, so return-value details need not be repeated. The description covers the success case, error case, prerequisite, and how this tool fits into the broader translation workflow, making it complete for an agent to invoke 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 both formId and language are already fully described, including the language enum. The description does not add parameter-level details beyond what the schema provides, so the high-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 clearly states the operation: 'Read the full content of one language version (translation) of a form.' It also specifies what is included ('mirrored fields[] and report') and distinguishes this read tool from related siblings like update_form_translation and create_form_translation.
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 tells the agent when to use this tool ('Use this to fetch the current draft before translating') and names the follow-up tool ('save with update_form_translation'). It also gives an important exclusion condition: if the language version doesn't exist, create it 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-only
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?
Annotations already signal read-only and non-destructive behavior, and the description adds task-relevant context such as current-team scoping, optional inclusions, and the leadId/examineeId addressing rule. It does not cover error cases or defaults, but the annotation safety profile lowers the burden.
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 with a front-loaded purpose, a colon-delimited payload list, and a closing ID rule. It is information-dense without filler; only the somewhat run-on structure prevents a 5.
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 annotations, an output schema, and full schema parameter coverage, the description is contextually adequate: it states what is returned, which flags affect breadth, and the team/ID scoping. It does not state exact when-to-use alternatives, but that is a minor gap for a single-item getter.
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's optional-inclusions wording maps loosely to the boolean flags but adds no parameter details 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?
Description names a specific verb ('View'), a resource ('one lead of the current team'), a key ('leadId'), and enumerates what is included. This clearly distinguishes get_lead from list_leads and get_examinee without needing to open the schema.
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 context: use this for a single lead scoped to the current team, and it supplies an explicit identifier constraint ('never by a masked email'). It does not explicitly name sibling alternatives such as list_leads for multi-lead views, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recordARead-only
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?
Beyond the readOnlyHint and destructiveHint annotations, it discloses meaningful behavior: the returned report is frozen, answers are returned as written, and email addresses or phone numbers are masked. It also clarifies team scope and that the full report structure is included.
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 efficiently enumerates the significant output components and a special masking behavior. Every sentence carries useful information without filler or unnecessary repetition.
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 tool with rich annotations and an output schema, the description supplies all necessary context: what the record contains, how to identify it, current-team scope, and the masking caveat. Nothing important 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 the description essentially restates the schema's parameter explanation: recordId is the id from list_records. The description adds no new details about the parameter's format, constraints, or behavior 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 opens with a precise verb and resource: 'View the full detail of one submission record (lead)...' and explicitly scopes it by record id, distinguishing it from list_records and other sibling tools like get_lead. It clearly states what the returned detail includes.
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 it: when you need full detail for one record identified by the id from list_records. It does not explicitly state when not to use it or name alternatives, but the scoping and id reference give solid context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_questionA
Insert an item (question or page break) at a specific position. type can be a question type or Breaker. 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 | |
| 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 | |
| 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. | |
| 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. |
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?
The annotations are all false/neutral (readOnlyHint=false, destructiveHint=false), so the description carries the burden and delivers: it discloses that the call is not idempotent, that a timeout may still mean success, that blind retries can duplicate items, and prescribes a check-then-retry strategy. This is exactly the kind of non-obvious behavioral trait an agent needs. It stops short of a 5 only because it doesn't touch on post-success effects or reversibility.
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, zero filler. The core purpose is front-loaded, followed by the positioning mechanics, the sibling route for the end case, and the idempotency warning. Every sentence carries load and the most critical operational caveat (retry behavior) is placed last where the risk context has been built.
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 complex (26 params, nested choices/aiMatch) but the schema is exceptionally rich — every parameter documented and a long FIELD APPLICABILITY note covers per-type/per-scene rules — so the description need not restate parameters. It supplies exactly the missing operational layer: positioning semantics, the get_form reference mechanism, end-case routing, and retry policy. An output schema exists, so return values need no explanation. A 5 would require something additional the agent still needs that isn't covered.
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 schema already documents every parameter thoroughly. The description adds genuine value on top for the positional parameters: after/before values come from get_form's field.code, and 'before the first field's code' is the front-insertion trick — detail the schema's terse 'Insert after this code; choose either after or before' does not convey.
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+scope: 'Insert an item (question or page break) at a specific position.' It immediately distinguishes itself from the sibling add_question by scoping to positional insertion (front/middle) versus appending, so an agent can tell them apart without reading either schema.
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 names the alternative and the selecting condition: 'To insert at the end, use add_question.' It also gives the mechanical recipe — reference existing field codes from get_form's field.code via after/before, and use before on the first field's code for front insertion. No inference is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invite_memberA
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" (only the owner may grant 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". "admin" can only be granted by the team 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?
Beyond the annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false), the description reveals the real-world side effect (sending an email), the authentication/role requirements, and all notable rejection cases such as already-member, pending invite, and member limit. This gives an agent a complete behavioral model without needing to invoke 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?
The description is dense but every sentence earns its place: purpose, side effect, permissions, role constraints, failure modes, and team-targeting context are all covered in about four sentences. The core action is front-loaded, and there is no filler or repetition that would dilute an agent's attention.
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 side effects, authorization constraints, and multiple failure paths, the description covers all the contextual information an agent needs: how the active tenant is determined, how to switch it, what roles are available, and exactly when the call will fail. The output schema covers the return shape, so the description need not expand further.
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 covers the role enum and the default, but the description adds meaning by clarifying that 'viewer' is read-only, that no one can be invited as owner, and that the invite fails for already-member or already-pending emails. This goes beyond the raw schema definitions and informs role choices.
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: 'Invite someone to the active team (tenant) by email.' It also states the side effect (sends an invitation email) and return value (the join link), leaving no ambiguity about what the tool does or how it differs from other team-management 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 explicitly says when the call is permitted (team owner or admin only) and rejected for other roles, and it gives concrete routing guidance: operate on the currently targeted team first, using list_my_tenants / switch_active_tenant to change teams. It also names the failure conditions that would make the call invalid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bookingsARead-only
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 convey readOnlyHint and non-destructive intent, and the description adds meaningful context: bookings are scoped to the current team, attendee names/emails come back masked, and statuses carry workflow semantics (pending = approval queue). 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?
Four sentences, each carrying distinct useful information: scope/order, item fields, filter capabilities, typical use, and masking behavior. The description is well front-loaded 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?
For a read-only list operation with an output schema and safety annotations, the description adequately covers entity type, included fields, filtering, ordering, identification, and privacy masking. Pagination and sort details are left to the schema, which is acceptable.
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 describes all 9 optional parameters with 100% coverage, so the description need not repeat per-parameter detail. It adds only a high-level filter summary and a bookingId reference for downstream use, which doesn't deepen parameter understanding 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?
Clearly states the verb 'List' and the resource '1:1 bookings of the current team', with a clarifying parenthetical about discovery calls/consultations and the default order. This differentiates it from sibling tools like list_leads and list_records without needing to open 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?
Provides a concrete typical use case ('status "pending" lists the approval queue waiting on someone') and summarizes filtering options, giving an agent a clear context for invocation. It does not explicitly name alternative tools for mutating bookings, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_examineesARead-only
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?
Annotations already declare readOnlyHint=true and destructiveHint=false, which cover the safety profile. The description adds significant behavior beyond the annotations: 'newest first' ordering, sensitive auth fields never returned, and the examineeId being returned unmasked for use in other tools. This is valuable context that an agent needs to interpret results correctly.
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 earning its place: purpose and scope, data exclusion behavior, and routing to related tools. The key outcome 'newest first' is front-loaded, and there is no fluff or repetition of schema content.
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 list tool with an output schema already describing the response shape, the description completes the picture: it defines the resource, the team scope, ordering, sensitive-field redaction, and how the returned ID feeds into sibling tools. Nothing an agent needs to call or interpret 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 description coverage is 100%, with each parameter (limit, search, status) already documented in the input schema. The description does not add parameter-level details such as formats or defaults — it focuses on result behavior. Baseline 3 is appropriate since the schema carries the parameter semantics.
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 verb 'List' and the resource 'examinees', and even clarifies synonyms ('respondents'). It distinguishes itself from get_examinee by indicating that this returns a list while get_examinee returns full detail, making sibling differentiation 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 explicitly states when to use an alternative: 'Use get_examinee for one examinee's full detail including customData.' It also scopes usage to the current team and notes the returned examineeId as the input for get_examinee/update_examinee, giving clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_formsARead-only
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 mark this as read-only and non-destructive; the description adds genuinely useful behaviors: reverse-chronological order by creation and omission of question content. No contradiction with annotations was found.
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, front-loaded sentence conveys the core action, scope, ordering, and content limitation without filler or redundancy. Every word 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 read-only list tool with an output schema and fully documented optional filters, the description is adequate: it covers scope, ordering, and content omission. Minor details like whether deleted forms are included are not critical 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 input schema fully describes all three optional parameters (limit, scene, titleContains), so schema description coverage is 100%. The description adds no additional parameter-specific meaning, 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?
States a specific verb ('List'), resource ('forms'), and scope ('current team'), and explicitly notes it excludes question content and routes to get_form for details. This clearly distinguishes it from sibling get_form and makes its scope 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?
Explicitly points to get_form as the alternative when form details are needed, which gives a clear when-to-use signal. It does not mention other related siblings like list_templates, so differentiation from all alternatives is not fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_form_translationsARead-only
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 mark this read-only and non-destructive; the description adds what specific data is returned (language, isActive, public share link, timestamps) and what is excluded. No side effects or surprising behavior are omitted.
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; the action and return value are front-loaded, and the primary-language caveat is placed as a short final note. 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 one-parameter read-only list tool with an output schema and full annotations, the description covers scope, return contents, and the key caveat. No additional information is needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already documents formId as 'The source form UUID' with 100% coverage. The description only restates that these are translations of a form, adding no extra format or constraint semantics.
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 verb 'List', resource 'existing language versions (translations) of a form', and explicitly distinguishes itself from get_form by noting the primary language is not included. This differentiates it from sibling translation CRUD tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly sets the boundary that the primary language lives on get_form.language, so an agent knows not to expect it here. It does not, however, mention when to prefer get_form_translation for a single translation, so routing guidance is partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_leadsARead-only
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 declare readOnlyHint=true and destructiveHint=false, and the description does not contradict this. It adds valuable behavioral context: 'Newest activity first by default', 'Filter by status / assignee / tags / created-at range / keyword / whether they have an upcoming booking', and critical notes about server-side matching with masked emails and the half-open pagination/filtering behavior for hasUpcomingBooking. These details go beyond the schema and annotations, ensuring the agent knows exactly how filtering and data masking behave.
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 well-structured: it opens with the primary function, then describes typical return contents and default sorting, followed by filtering options and important usage caveats. It is moderately concise, with every sentence adding value (e.g., the note about never guessing codes and the leadId/examineeId distinction). Some redundancy exists (filter list partially repeats schema), but overall it is efficient and 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 the tool has 10 parameters and an output schema exists, the description does not need to explain return values. It covers the key operational aspects: scope, default sort, filtering options, and essential preconditions (calling list_lead_settings). It also discloses the hasUpcomingBooking filtering nuance. Minor gaps include no mention of pagination behavior beyond the schema (though page/limit are self-explanatory in the schema) and no explicit note on performance/limits, but these are adequately addressed by the schema and annotations.
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 description coverage is 100%, so the baseline is 3. While the description reinforces some param semantics (e.g., the need to use codes from list_lead_settings for status and tagCodes, and that keyword matches the real email server-side despite masking), it does not add significant meaning beyond what the schema already provides. The schema descriptions themselves are detailed, and the tool description offers only marginal additional parameter insight.
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 tool lists CRM leads for the current team, describes the fields returned (follow-up status, assignee, colour tags, submission count, next booking), and specifies default ordering. This differentiates it from siblings like list_records and get_lead, which have different purposes. The verb 'list' is specific and the resource is defined without ambiguity.
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 actionable guidance: call list_lead_settings to obtain valid status/tag codes and never guess, reference leads by leadId and respondents by examineeId. It also clarifies the scope ('of the current team' and 'across all forms'). While it does not explicitly mention alternative tools or when not to use this tool, the context is clear enough for an agent to decide when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_lead_settingsARead-only
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 readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: the read is scoped to the current team, and the values returned are not universally valid but team-specific, which directly affects downstream writes.
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 with no filler. The first sentence states exactly what is read and the second gives actionable usage guidance. It is well front-loaded and 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?
Given that an output schema exists, the return format is already documented. The description provides the missing context an agent needs: when to call the tool, why team-specific values matter, and which sibling tools depend on its results. Nothing important is left unstated.
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 zero parameters, so the schema already fully defines inputs. The description adds no parameter-specific semantics because none are needed; it instead clarifies that the tool requires no inputs and simply reads current settings. This matches the baseline for parameterless tools.
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 verb ('Read'), a precise resource ('the current team's lead configuration'), and enumerates exactly what is returned: follow-up status codes with label, colour, and display order, the colour tag library, and assignable members. This clearly separates it from sibling write tools like update_lead, set_lead_tags, and assign_leads.
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 instructs the agent to call this tool before update_lead, set_lead_tags, and assign_leads, and explains why: status codes, tag codes, and member ids are team-specific and the write tools reject unknown values. This gives both a positive trigger and a concrete exclusion boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_tenantsARead-only
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 declare readOnlyHint=true and destructiveHint=false, so the description doesn't need to restate safety. It adds useful context beyond annotations by explaining that 'isActive marks the team this token currently operates against,' which clarifies the output semantics.
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 short sentences fully cover the tool's purpose and the key output field semantics. There is no filler or unnecessary detail.
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 zero-parameter read-only list tool with an output schema available, the description is complete. It states what is returned, the user scope, and the meaning of isActive, which is all an agent needs to invoke 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?
The input schema has zero parameters, so there is nothing for the description to explain about parameters. The baseline of 4 applies because no parameter documentation is needed.
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: 'List all teams (tenants) the current user belongs to' names the exact verb and resource. It also distinguishes itself from siblings like get_active_tenant and switch_active_tenant by clarifying it returns all tenant memberships, not just the current one.
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 makes the use case clear: call when you need the full set of tenants for the current user. However, it does not explicitly contrast with get_active_tenant or switch_active_tenant, so an agent must infer when this tool is preferable to those alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recordsARead-only
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?
Even though readOnlyHint=true and destructiveHint=false are already annotated, the description adds useful behavioral context: records are returned newest first, email/phone values inside answers are masked, and respondents must be referenced by examineeId rather than masked email. These are non-obvious behaviors not present in 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?
Four purposeful sentences, front-loaded with the verb and resource, with no filler or repetition. Each sentence adds value: scope/ordering, item composition, filters, masking warning, and routing to get_record.
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 input schema covers pagination and filtering, the output schema covers the item shape, and the description adds scope, ordering, masking, and an explicit alternative for full-record retrieval. Nothing needed 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?
Schema description coverage is 100%, so the baseline is 3, and the description only paraphrases the existing filter parameters ('form, report status, and submitted-at range') without adding new syntax or format details. The schema already carries the parameter 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 pair ('List submission records (leads)'), defines scope ('current team'), ordering ('newest first'), and names the included fields, including compact report results, UTM metadata, and examinee info. It also explicitly contrasts itself with get_record for full detail, distinguishing it from the closest sibling.
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 for when to use this tool: when listing or filtering submission records, and explicitly directs the agent to get_record when one record's full detail is needed. However, it does not explicitly distinguish itself from the sibling list_leads, leaving a possible ambiguity without an exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesARead-only
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 signal readOnlyHint=true and destructiveHint=false, so the description adds useful behavioral context: only active templates are returned, the library is public, and results are sorted by usage count. This goes beyond the schema and aligns with 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?
Two tight sentences with no filler: the first front-loads the resource, fields, and sort order; the second gives a concrete downstream action. Every phrase 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?
With annotations covering safety and an output schema present, the description provides the essential scoping (active/public/most-used) and the intended workflow. An agent has everything needed 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?
Schema coverage is 100%, and all five parameters already have descriptions in the input schema. The description does not add parameter-level detail, but it does clarify the return context and sort behavior, which is helpful though not required.
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 and resource: 'List active templates in the public template library,' and enumerates the returned fields and sort order. This clearly distinguishes the tool from siblings like list_forms because it targets the public template library rather than user-created 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?
Explicitly says when to use the tool: 'Use this to find a template, then call create_form_from_template with its id to create a form from it.' It gives the workflow but does not explicitly state when not to use it or name an alternative listing tool, though the intent is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_questionA
Move an existing question or page break 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 or a Breaker) | |
| 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 indicate a mutation (readOnlyHint=false) but do not detail side effects. The description adds useful context on the after/before mechanics and the front/end positioning, going slightly beyond the schema. However, it does not disclose what happens if both after and before are provided, if the referenced code does not exist, or whether the operation is reversible—gaps that the description could address given minimal annotation coverage.
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, with the core purpose front-loaded and no redundant phrasing. Every sentence contributes: the first states the action and object, the second explains the after/before options and how to achieve front/end placement. It is concise and well-structured.
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 moderate complexity (4 params, output schema present) and the existence of siblings, the description covers the essential usage scenarios. It explains the after/before logic and front/end moves. It does not mention error handling or prerequisites, but these are not critical for an agent to invoke the tool correctly. The output schema reduces the need to describe return values.
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 by explaining how to use after/before for front/end positioning, which is not in the schema. It also clarifies that 'code' refers to a question or a Breaker (page break), adding semantic meaning beyond the schema's generic 'field code'.
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 verb and resource: 'Move an existing question or page break to a specific position by code.' It also specifies the mechanism (after/before) and distinguishes this from sibling tools like insert_question or update_question by focusing on repositioning existing elements rather than adding or editing content.
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 instructions on when to use this tool and how to use its parameters: 'Choose either after or before, referencing another field's code.' It also explains how to move to the front and end. While it doesn't explicitly name alternatives or state when not to use it, the context makes it clear this is for reordering, and the front/end tips add practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_image_uploadARead-only
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 provide readOnlyHint=true and destructiveHint=false, but the description adds critical behavioral context: it returns a short-lived presigned URL, rejects uploads >5MB, only accepts four MIME types, and that the authoritative check happens in finalize_image_upload. This goes well beyond annotations and clarifies the two-step mechanism.
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?
Long but every sentence earns its place. The workflow is numbered and front-loaded with purpose. Examples (sips, magick, curl) are concrete and useful, not fluff. Structure is logical: what it does, what it doesn't do, steps, constraints.
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?
Comprehensive for a complex two-step upload with output schema. Covers all parameters, constraints, workflow, sibling linkage, and error conditions (size rejection). No missing information an agent needs to call it correctly. Output schema presumably documents the returned URL and key.
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 baseline is 3. The description enriches fileSize ('of the file you will actually upload, after any compression', checked against 5MB cap and quota up front) and clarifies filename purpose ('for admin display / download'). It adds meaningful details beyond the schema without redundancy.
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 'Step 1 of 2 for adding an image ... to the current team media library' with explicit resource (image upload), verb (prepare), and context. It distinguishes itself from finalize_image_upload and lists accepted types. No ambiguity.
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 a numbered workflow (steps 1-6) including exact conditions: compress if >5MB, accepted MIME types, explicit statement that this tool does NOT receive bytes, and names the sibling finalize_image_upload. Tells when not to use (e.g., non-image files, over 5MB after compression). Fully covers when and how.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_guideARead-onlyIdempotent
Authoring guide for one RooQuiz preview assessment type: the full field schema, question types, scoring rules, themes, common mistakes and a worked example. Read the guide for the type you want before calling preview_quiz, preview_scorecard, preview_outcome.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | quiz = right/wrong graded test; scorecard = every option adds points toward a level; outcome = personality/type test with no right answers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description's 'Read the guide' framing reinforces the read-only nature and enumerates the guide's contents, but it does not add behavioral traits beyond what annotations provide—no auth needs, side effects, or response-shape caveats.
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 with zero waste. The first sentence front-loads what the tool provides, and the second delivers the actionable usage instruction. Every sentence earns its place and no redundant phrases appear.
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, read-only documentation tool with no output schema, the description is nearly complete: it lists the returned content and states when to call it. A minor gap is that it never explicitly states the response is the guide text itself, though the content enumeration strongly implies it.
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%: the single enum parameter `type` already explains each value (quiz, scorecard, outcome) with concrete meaning. The description adds only the implicit mapping that the chosen type selects which guide to read, which is consistent but not a substantive addition beyond the schema's own explanations.
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 purpose: an authoring guide containing field schema, question types, scoring rules, themes, common mistakes, and a worked example for a RooQuiz preview type. It also distinguishes itself from siblings by explicitly naming preview_quiz, preview_scorecard, and preview_outcome, so an agent can tell it apart 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 an explicit usage directive: 'Read the guide for the type you want before calling preview_quiz, preview_scorecard, preview_outcome.' This names the exact alternatives and the condition under which this tool should be invoked, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_outcomeA
Create a shareable RooQuiz preview personality / outcome test — options vote for result types and the most-voted type is the result — and get a link to open in the browser. No account, login, or API key required. Use this when someone wants to build, try out, or share a personality quiz, a "which X are you" / type / archetype test, or any quiz where there are no right answers and the taker is sorted into one of several result types. For a right/wrong graded quiz, use the preview-quiz skill; for a scored questionnaire that totals points into a level, use the preview-scorecard skill.
This tool takes the finished assessment JSON and nothing else. Unless its field schema, scoring rules and worked example are already in context, call preview_guide with type "outcome" first.
| Name | Required | Description | Default |
|---|---|---|---|
| form | Yes | The complete assessment JSON, shaped as documented by preview_guide (type "outcome"). "scene" is forced to "outcome_quiz" for you. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Browser link to the preview — hand it over verbatim. |
| expiresAt | No | ISO timestamp; the link 404s afterwards. |
| publicToken | Yes | Identifier the link is built from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/write and destructive hints, and the description adds meaningful behavioral context beyond them: no account/login/API key required, produces a browser link, takes only the finished assessment JSON, and forces 'scene' to 'outcome_quiz'. It does not discuss persistence or side effects, but the annotations plus these details give a solid behavioral picture.
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 and then delivers usage guidance, alternatives, prerequisites, and parameter constraints in a compact sequence. Every sentence contributes new information; there is no filler or repetition of the input schema.
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 one parameter, a rich output schema, and clear sibling definitions, the description covers all needed decision points: what the tool does, when to use it, when not to, authentication requirements, schema prerequisites, and a self-remediating instruction to call preview_guide if context is missing. Nothing essential is left unaddressed.
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 there is only one parameter, form, which already describes the expected JSON shape. The description adds value by stating that the tool takes 'the finished assessment JSON and nothing else,' clarifying that no additional credentials or options are needed, and by pointing to preview_guide as the source of 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 shareable RooQuiz preview personality / outcome test' and immediately explains the voting mechanism. It also distinguishes itself from siblings by naming preview-quiz and preview-scorecard as different quiz types, so an agent can choose correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool ('Use this when someone wants to build, try out, or share a personality quiz...') and gives alternatives with contrasting conditions: right/wrong graded quizzes go to preview-quiz, scored questionnaires go to preview-scorecard. It also provides a clear prerequisite: call preview_guide with type 'outcome' first unless the schema is already in context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_quizA
Create a shareable RooQuiz preview quiz — a right/wrong assessment where correct answers earn points and the taker gets a score — and get a link to open in the browser. No account, login, or API key required. Use this when someone wants to build, try out, or share a graded quiz, test, trivia, or exam with correct answers and a final score. For a scored questionnaire where every option adds points, use the preview-scorecard skill; for a personality/type test with no right answers, use the preview-outcome skill.
This tool takes the finished assessment JSON and nothing else. Unless its field schema, scoring rules and worked example are already in context, call preview_guide with type "quiz" first.
| Name | Required | Description | Default |
|---|---|---|---|
| form | Yes | The complete assessment JSON, shaped as documented by preview_guide (type "quiz"). "scene" is forced to "knowledge_quiz" for you. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Browser link to the preview — hand it over verbatim. |
| expiresAt | No | ISO timestamp; the link 404s afterwards. |
| publicToken | Yes | Identifier the link is built from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag readOnly=false, destructive=false, and the description adds context beyond them: no account/login/API key required, the tool consumes a finished JSON and nothing else, and the output is a browser-openable share link. It does not detail side effects beyond creation, but the preview/try-out framing plus existing annotations cover the safety profile.
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 tight paragraphs: the first front-loads purpose and sibling disambiguation, the second covers the input contract and prerequisite. Minor redundancy between the appositive description of a graded quiz and the later 'graded quiz... with correct answers and a final score' phrase keeps it just short of flawless.
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 an output schema present and a single nested object parameter, the description covers everything needed: purpose, use cases, alternatives, prerequisite, auth requirements, and input shape pointer. No material gap remains for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single 'form' object, and the schema itself documents the shape source (preview_guide) and the forced 'scene' value. The description reinforces this with 'takes the finished assessment JSON and nothing else,' which clarifies that the parameter must be the complete, ready-to-use artifact.
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 outcome — 'Create a shareable RooQuiz preview quiz... and get a link to open in the browser' — with the grading model spelled out (right/wrong, points, score). It also names the sibling skills it is not (preview-scorecard, preview-outcome), so an agent can reliably tell the three preview tools apart.
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 criteria ('when someone wants to build, try out, or share a graded quiz, test, trivia, or exam'), names the two alternatives with their distinguishing conditions, and states the prerequisite to call preview_guide with type 'quiz' when the schema isn't already in context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_scorecardA
Create a shareable RooQuiz preview scorecard — a scored questionnaire where each option adds points toward a total that buckets into levels — and get a link to open in the browser. No account, login, or API key required. Use this when someone wants to build, try out, or share a self-assessment, health/habit score, readiness or maturity check, satisfaction survey, or any rated questionnaire that turns answers into a total score and a level (no "correct" answer). For a right/wrong graded quiz, use the preview-quiz skill; for a personality/type test with no scores, use the preview-outcome skill.
This tool takes the finished assessment JSON and nothing else. Unless its field schema, scoring rules and worked example are already in context, call preview_guide with type "scorecard" first.
| Name | Required | Description | Default |
|---|---|---|---|
| form | Yes | The complete assessment JSON, shaped as documented by preview_guide (type "scorecard"). "scene" is forced to "scored_quiz" for you. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Browser link to the preview — hand it over verbatim. |
| expiresAt | No | ISO timestamp; the link 404s afterwards. |
| publicToken | Yes | Identifier the link is built from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false, destructiveHint=false), the description discloses that no account/login/API key is required, that the tool forces 'scene' to 'scored_quiz', that it returns a shareable browser link, and that it accepts only finished assessment JSON. These are useful behavioral facts not expressed in the structured fields; only minor details like validation-error behavior are omitted.
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, purpose front-loaded before usage, alternatives, and precondition. Every sentence carries distinct information: the definition, the no-auth constraint, the routing rules, and the preview_guide dependency. The length is fully justified by the three-way sibling routing complexity; 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 that an output schema exists, return-value documentation is unnecessary. The description covers the entire decision surface: selection criteria, exclusions naming both alternatives, input sourcing via preview_guide, and auth requirements. An agent can correctly select and prepare an invocation from this text alone.
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% — the form parameter is already documented with its shape, the reference to preview_guide for the structure, and the forced 'scene' value. The description adds modest reinforcement ('takes the finished assessment JSON and nothing else') but no substantive new parameter semantics, 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?
Opens with a specific verb+resource ('Create a shareable RooQuiz preview scorecard') and immediately defines the concept ('each option adds points toward a total that buckets into levels'). It also states what it is not — no 'correct' answer — which distinguishes it from the graded-quiz sibling without requiring schema inspection.
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 'Use this when' and enumerates concrete scenarios (self-assessment, health/habit score, readiness/maturity check, satisfaction survey). It then routes to alternatives with precise conditions: 'For a right/wrong graded quiz, use the preview-quiz skill; for a personality/type test with no scores, use the preview-outcome skill.' It also states a precondition to call preview_guide if the schema is not already in context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reschedule_bookingA
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?
Goes well beyond the annotations by disclosing concrete side effects: the attendee is emailed, the 24h reminder is re-armed, and the booking.rescheduled integration event fires. It also exposes failure modes such as a taken slot or another active booking, adding meaningful 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?
The description is compact and well-structured: one sentence each for the core purpose, prerequisite workflow, side effects, and failure conditions. No filler or redundant restatement of the tool name or schema.
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?
Covers the key elements an agent needs: what the tool does, who may use it, how to obtain a valid parameter, what side effects occur, and when it will fail. Since an output schema exists, omitting the return shape is acceptable.
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 describes both parameters well, so the baseline is a 3. The description adds value by specifying the proper workflow dependency: call get_booking_availability with this bookingId first and select startAt from its slots, which clarifies how the two parameters relate.
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 action and object: 'Move a confirmed booking of the current team to a different time, as the organiser.' It also adds role and state constraints ('confirmed', 'scheduled', 'organiser') that make it clearly distinct from sibling tools like review_booking or update_booking_status.
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 instructs the agent to first call get_booking_availability with the bookingId and pick a startAt from its slots, and states the rejection conditions. It does not explicitly name alternative tools to prefer instead, but the prerequisite workflow and operational constraints are clearly conveyed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_formA
Restore a form from the trash in the current team (undo delete_form). Only the form owner / team owner 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, the description discloses important behavioral traits: permission requirements and an error condition when the form is not in the trash. It also makes the inverse relationship to delete_form explicit, which helps the agent predict 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 a single efficient sentence with no filler. It front-loads the primary action and scope, then packs in the permission and error conditions without bloating the text.
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 mutation tool with an output schema and annotations, this description is complete. It covers purpose, scope, preconditions, permissions, and a failure case, giving an agent enough information 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?
The schema already provides 100% coverage for the single formId parameter, so the description does not need to add much. It reinforces the semantic link to the trash but does not add detail beyond the schema's 'form UUID' description.
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 action ('Restore a form from the trash') with the resource scope ('in the current team') and explicitly frames it as 'undo delete_form'. This clearly differentiates it from sibling tools like delete_form, update_form, and duplicate_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?
It provides clear conditions for use: the form must be in the trash, within the current team, and only the form owner or team owner can perform the restore. It does not explicitly enumerate alternatives, but the 'undo delete_form' linkage gives enough context for an agent to decide when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_bookingA
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?
Beyond annotations (readOnlyHint=false, destructiveHint=false), the description discloses the key side effects: confirming the meeting, sending the confirmation with the meeting address, sending a decline note, optionally using meeting link/instructions with team-level fallback, and permission restrictions. This is exactly the behavioral context an agent needs for a mutating, externally-visible action.
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-structured, with the core action front-loaded and every clause carrying operational meaning. It avoids filler and packs preconditions, side effects, parameter exceptions, fallback behavior, and authorization into a compact block.
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 state-changing booking review tool, it covers preconditions, decision outcomes, email notifications, parameter-specific behavior, fallback semantics, and authorization. With an output schema present, return-value documentation is not required, and nothing critical to selecting or invoking the tool 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 baseline is 3. The description adds useful cross-parameter meaning by tying decision=approve to address release and meetingLink/meetingInstructions, and decision=decline to declineReason, while clarifying fallback behavior. This adds value but mostly reinforces what the parameter descriptions already state.
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 pair ('Approve or decline a pending booking request') and immediately explains the resulting state transition and external effects. It is clearly distinct from list_bookings and reschedule_booking, though it does not explicitly contrast itself with the sibling update_booking_status for non-pending status changes.
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 applicability conditions: only pending bookings can be reviewed, past meeting times can only be declined, and only team owners/admins or lead owners can perform the review. It does not explicitly say when to prefer update_booking_status or list the exclusions for confirmed/cancelled bookings, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_dimension_analysisA
Set the multi-dimension analysis (form.report.dimensionAnalysis) of a form, replacing it as a whole without touching overallAnalysis. In the knowledge_quiz scene each dimension needs fieldCodes (question codes); in the scored_quiz scene each needs a formula. Pass an empty dimensions array to clear the multi-dimension analysis. Call get_form first to read the question 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?
The annotations only indicate a mutating operation, so the description carries the behavioral burden. It clearly discloses that the whole dimensionAnalysis is replaced, that overallAnalysis is preserved, that an empty array clears the configuration, and that the tool is unsupported for random_knowledge_quiz forms. This goes well 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?
The description is compact and front-loaded, with every sentence carrying useful information: replacement semantics, scene requirements, clearing behavior, prerequisite action, and an unsupported case. There is no filler or repetition of 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?
For a tool with nested parameters and scene-dependent requirements, the description is complete enough to invoke correctly. It covers replacement semantics, clearing, unsupported form types, and the get_form prerequisite, while the output schema and rich parameter descriptions handle the remaining detail.
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, but the description adds cross-parameter meaning by tying fieldCodes to knowledge_quiz and formula to scored_quiz, and by recommending get_form as a prerequisite. This helps the agent reason about scene-dependent parameters more efficiently than reading each schema field alone.
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 ('Set') with an exact resource ('multi-dimension analysis (form.report.dimensionAnalysis)') and states the replacement semantics. It also distinguishes itself by explicitly saying it replaces the analysis as a whole while not touching overallAnalysis, which separates it from other form-update 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 usage context: call get_form first to read question codes, pass an empty dimensions array to clear, and avoid random_knowledge_quiz forms. It does not explicitly name a sibling alternative tool for the unsupported case, but it still provides strong when-to-use and prerequisite guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_lead_tagsA
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 discloses key behavioral traits: the 'replace' mode overwrites the whole tag set (potentially destructive), 'remove' accepts stale codes, and changes are recorded on each lead's timeline. Annotations only declare readOnlyHint false and destructiveHint false, but the description adds meaningful context about side effects and what happens to existing tags, going beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but every sentence carries load-bearing information. It opens with the primary purpose, then the critical batching constraint, then mode semantics, then tag library reference, then behavioral note. It could be slightly more compact (e.g., merging some clauses), but it is well-structured and free of fluff.
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 (Has output schema: true) and a 100% schema description coverage, the description needs to cover only operational context, which it does comprehensively. It addresses batching limits, mode selection, tag validation rules, and side-effect logging. No essential information 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?
The schema already covers parameters with descriptions (leadIds max 50, tags from list_lead_settings.tags[].code, mode enum). The description adds substantial semantics beyond the schema: it explains the practical difference between modes, justifies batch usage, and notes that 'remove' accepts stale codes. This is high-value enrichment that helps the agent choose correct parameter values.
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 and resource: 'Set the colour tags on one or more leads.' It clearly indicates the tool's function and distinguishes it from related operations like update_lead or assign_leads by focusing on tag manipulation. The mention of 'current team' adds scope, while the instruction to pass all lead ids in a single call sets it apart from potential per-lead 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 provides explicit when-to-use guidance, including the prohibition against looping ('do not loop'), and explains the three modes ('replace', 'add', 'remove') with specific scenarios for each (e.g., 'replace' for editing a single lead, 'add'/'remove' for batches). It also directs users to the tag library via list_lead_settings.tags, making the usage contextfully complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_active_tenantA
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?
Annotations already mark the operation as non-read-only and non-destructive. The description adds meaningful behavioral detail: persistence across sessions and the membership requirement. This goes beyond what the annotations 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?
Two sentences, each earning its place: one states the action and scope, the other states persistence and the caller prerequisite. No filler or repetition.
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 tool with full schema coverage and an output schema, the description supplies the essential behavioral context: persistence, token scope, and membership requirement. Nothing critical 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 fully documents tenantId with its own description and a pointer to list_my_tenants. The main description does not add parameter-level meaning beyond 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 uses a specific verb ('Switch') and resource ('active team (tenant) for this token'), making the operation unmistakable. It is clearly distinct from siblings like get_active_tenant, which reads rather than changes state.
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 context: the switch persists across sessions and requires membership in the target team. It does not explicitly name alternatives or exclusions, but the behavioral context is sufficient for a tool with this scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_booking_statusA
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 side effects that annotations do not convey: cancellation notifies the attendee by email and fires booking.cancelled, while completed/no_show are internal and do not contact the attendee. It also flags partial applicability of statuses, which is meaningful behavioral context beyond the readOnly/destructive hints.
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 no filler: purpose, constraints, side effects, and sibling routing are all packed in efficiently. The most decision-relevant information (statuses, preconditions, and alternative) 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 two fully described parameters, an output schema, and annotations provided, the description covers the essential call semantics and side effects. There is no missing guidance an agent would need to invoke the tool safely and 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% and both parameters already have clear descriptions. The description still adds value by clarifying preconditions tied to status values (only scheduled bookings; completed/no_show need the meeting to have started) and the booking lifecycle meaning, so slightly above the 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 opens with a specific verb and resource ('Close out a confirmed booking of the current team') and enumerates the three supported outcomes (completed, no_show, cancelled). It also preempts ambiguity by pointing to review_booking for pending requests, so an agent can tell this apart from nearby 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 states the exact precondition ('Only works on a booking whose status is scheduled') and the additional temporal requirement for completed/no_show ('require the meeting to have already started'). It names the alternative tool and condition ('To handle a pending request use review_booking instead'), leaving no inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_examineeADestructive
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?
Beyond the annotations (destructiveHint=true), the description discloses the destructive behavior concretely: customData replaces the whole object, masked values are rejected, and re-sending read customData can wipe or corrupt phone fields. This tells the agent exactly why the operation is destructive and how to use it safely.
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, each carrying distinct information: the action and locating rule, the editable fields, the immutable fields, and the critical customData warning. It is front-loaded with the purpose and every sentence earns its place without 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 destructive mutation tool with an output schema and rich annotations, the description is complete: it explains the team context, how to reference the examinee, which fields are editable vs. immutable, and the exact risk with customData. An agent can select and invoke this tool correctly without additional lookup.
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's customData property already documents the replacement semantics, validation rules, and the masked-value hazard in detail. The description largely repeats that information, adding only a slightly more explicit warning about not re-sending read values. Thus it provides little extra 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 names a specific verb ('Update'), resource ('examinee', alias 'respondent'), and scope ('in the current team'), and states the locating key (examineeId from list_examinees). It clearly separates editable from immutable fields, so the agent knows exactly what this tool does.
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 context: the examinee is team-scoped and must be located via the business ID from list_examinees. It also conveys when-not by stating that email, tenant, and examineeId cannot be changed and warning against re-sending customData. It does not name a sibling alternative explicitly, but no sibling directly updates examinees, so the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_formA
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 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). | |
| 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?
Annotations carry almost nothing (readOnlyHint=false, openWorldHint=false, destructiveHint=false), so the description shoulders the behavioral burden — and it delivers richly. It discloses merge-by-sub-key semantics for report and openGraph, the outcome matching rule that preserves existing images, the rejection of removing an outcome still referenced by question votes, wholesale replacement of systemText ({} clears it), and the image-input convention of media id / URL / empty-string-to-clear. An agent needs these traits to call the tool correctly, and they go far 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 dense but front-loaded: purpose and field list first, then the subtle image semantics, merge behavior, language/scene constraints, and sibling routing. Every sentence earns its place given the tool's complexity. It loses a point for being one em-dash-heavy run-on paragraph with slash-separated lists, which is harder to parse at a glance than a lightly structured version.
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 11 parameters, nested objects, and an output schema present, the description targets exactly the parts an agent cannot infer from structured fields: partial-merge semantics, code-matched outcome updates, rejection of destructive removals, the language-version precondition, and the scene immutability. The exhaustive schema and output schema cover the remaining detail, so nothing required 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?
Schema coverage is 100%, so the baseline is 3, but the description adds synthesized cross-parameter meaning: the flagImg-vs-landingImage role distinction (quiz cover vs landing-page cover that 'sets the image only, does not toggle the landing page') and the unified rule that both image fields accept a media id from finalize_image_upload, a media URL, or "" to clear. The merge-vs-replace principle spanning report/openGraph/systemText is genuinely additive over the schema's per-field docs. Not a 5 because the schema already documents most field-level 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?
Opens with a specific verb and resource — 'Update a form of the current team' — and enumerates the exact mutable fields (title / description / isActive / flagImg / landingImage / theme / report / openGraph / language / systemText). It differentiates from siblings by routing questions to add_question/update_question/delete_question/move_question and dimensionAnalysis to set_dimension_analysis, and by declaring 'scene never' changeable. Not a tautology, not vague.
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-not guidance with named alternatives: 'Questions go through add_question / update_question / delete_question / move_question, dimensionAnalysis alone through set_dimension_analysis.' It also states the precondition for language changes ('only while the form has no language versions; scene never') and the merge behavior that determines how partial updates behave. The only implicit part is when to prefer create_form, which is self-evident from the verb contrast.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_form_settingsA
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 | |
| 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?
The description goes far beyond the annotations by explaining partial-update behavior ('Only the keys you pass are changed') and by disclosing real-world consequences, such as submissionAccess acting as the lead-capture gate, reportGateRequireCode trading completion rate against lead quality, and slug changes breaking the previous custom path while the token address keeps working. This is rich behavioral context that annotations 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 front-loaded with the core distinction and then presents a dense but purposeful enumeration of all editable fields with their behavioral implications. No filler or redundant phrasing is present; every sentence contributes to selecting and invoking the tool correctly.
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 10 parameters, nested objects, and an output schema, the description covers all editable fields, states the partial-update contract, names the sibling for content edits, and points to the read-side companion. The presence of an output schema reduces the need to document return values, and nothing required for correct invocation appears 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?
Although schema coverage is 100%, the description adds significant semantic framing by grouping parameters as delivery/lead-capture mechanics (e.g., 'the lead-capture gate', 'trading completion rate against lead quality', 'drives organic spread'). It clarifies the business purpose of each editable field, which is value beyond the raw schema 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 a specific verb and resource: 'Change how a form of the current team is delivered,' and immediately contrasts with 'what it says (use update_form for title / questions / report / theme).' This clearly distinguishes update_form_settings from its closest sibling, update_form, so an agent knows exactly which tool to pick.
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 says when to use this tool versus update_form, and it directs agents to get_form_share_info for reading current values. The description makes the boundary between content editing and delivery/settings editing explicit, leaving no ambiguity about which sibling to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_form_translationA
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 provide no behavioral guidance (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the description carries the burden. It discloses partial-update behavior, the independence of the per-version `isActive`, and a validation constraint ('must not introduce codes that do not exist on the source form'). It does not mention deeper consequences like error behavior or what happens with unknown systemText keys, but those are covered in the schema, so the description adds solid context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single four-sentence paragraph that front-loads the purpose and then states the key behaviors and constraints. Every sentence is useful and no filler is present. It could benefit from bulleted structure given the complexity, but it is appropriately compact relative to the large schema.
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 9 parameters, nested objects, and an output schema, the description covers the essential usage context: what to pass, the partial-update workflow, and the `isActive` semantics. It does not explicitly mention that this tool requires an existing translation (or how to route to `create_form_translation`), but the name and 'keep their current value' strongly imply it. Overall it is complete enough for an agent to invoke 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 schema fully documents each parameter, including nested match-key semantics. The description adds only a high-level cross-reference to `get_form_translation` and restates the code-match constraint already present in the schema. It does not meaningfully explain individual parameters beyond what the schema provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Save translated copy for one language version of a form.' It explicitly distinguishes the action from reading (`get_form_translation`) by referencing the shape to mirror, and 'fields you omit keep their current value' signals an update rather than a create. No ambiguity remains about what the tool does.
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: mirror the shape from `get_form_translation`, partial translation is allowed, and `isActive` can be toggled per language version. It does not explicitly name alternatives (e.g., 'use create_form_translation for new language versions') or state when not to use this tool, so it stops short of a 5. The intended workflow is nonetheless easy to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_leadA
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?
Annotations already indicate this is a mutating, non-destructive operation. The description adds useful behavioral context: the change 'is recorded on the lead's timeline' and status codes are team-defined. 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 short sentences place the main action first, the side effect second, and the critical precondition last. The only small flaw is mentioning 'tag codes' in a tool whose parameters contain no tag field, which is slightly extraneous.
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 definition covers the action, scope, valid status source, and a side effect, and an output schema exists to describe the return value. It lacks an explicit statement about overwriting the previous status, but the 'move to another status' wording sufficiently implies it.
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%, but the description still adds meaning by framing status as a team-defined follow-up status with an example and stressing that codes must come from list_lead_settings. This enriches the bare schema description of status.
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 and resource: 'Move one lead ... to another follow-up status', with an illustrative example. The scope 'of the current team' and focus on follow-up status clearly distinguish it from sibling lead tools like assign_leads or set_lead_tags.
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 instructs the agent to call list_lead_settings first to obtain valid status codes and warns 'never guess', which is a clear operational precondition. It does not explicitly name exclusions or alternatives, but it gives enough context to avoid incorrect status use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_questionA
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).
| 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. | |
| 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). | |
| 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?
Adds significant behavioral context beyond the annotations: choices replaces ALL existing choices, omitting aiMatch leaves grading mode untouched, pass-null removes bounds, certain scenes reject top-level score/correctAnswer/aiMatch, and TrueFalse outcome votes still require delete+recreate. No contradiction with readOnlyHint=false or destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a clear first sentence, and the length is justified by 18 parameters. However, the description is one dense semicolon-separated block that would benefit from bullet or section grouping, making scanning slightly harder than it should be.
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 rich schema, output schema, and annotations, the description covers the remaining operational constraints an agent needs: replacing choices while preserving identity via codes, scene-specific rejections, correctAnswer referencing the same-call choices replacement, and the delete+recreate escape hatch. Nothing material 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 real value by grouping changeable fields, flagging the NOT-changeable set that the schema cannot express, and summarizing type-specific constraints (e.g., precision per field type). Most parameter meaning still comes from the schema, but the description's high-level map and exclusions justify 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?
States a specific verb + resource: 'Update a single question of an existing form, located by code.' It enumerates changeable fields and explicitly names the alternative path (delete_question then add_question) for non-changeable attributes, clearly distinguishing this tool from add_question/insert_question/delete_question 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?
Explicitly says when NOT to use this tool: question type, Rate steps, DropDown multiple, and Ordering shuffle require delete_question plus add_question. It also gives scene-specific routing for scored_quiz/outcome_quiz (use choices[i].score or choices[i].outcomes) and directs date/time scoring configuration to the web app.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tenant_slugA
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?
Annotations only say the operation is not read-only, not open-world, and not destructive in the teardown sense. The description adds crucial hidden behavior: changing the slug moves EVERY public quiz link at once, old addresses stop resolving with possible cached-entry lag, and the slug cannot be cleared. This is exactly the behavioral context an agent needs beyond the annotation flags.
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 earns its place: what changes, the URL format, permission, constraints, side effects, and the safe-reading alternative. The critical long-term consequence is front-loaded before the cautions, and nothing is redundant with the schema.
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 mutation that affects public URLs, the description gives the permission model, uniqueness domain, character constraints, side effects on existing links, and a pointer to the read tool. An output schema exists, so return values need no explanation. An agent has everything required to decide when to call it and how to construct a valid slug.
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 meaningful constraints beyond the schema: allowed character set, length range, start/end requirements, global uniqueness, and the fact that the value cannot be cleared. These are essential for constructing a valid argument and are absent from the schema's terse property description.
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 verb and resource ('Change the team address of the current team'), defines the exact URL path segment it affects, and clearly distinguishes it from reading the slug (get_active_tenant) and from token addresses. The behavior is exact — an agent cannot confuse this with any sibling.
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 states the permission requirement, the uniqueness and format constraints, and warns when NOT to use it ('rare, deliberate rename — not routine tuning'). It also tells the agent to read the current value using get_active_tenant and notes token addresses continue working — giving clear when-to-use and when-to-avoid guidance.
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.
4 tool updates
v1.1.0- Added
preview_guide - Added
preview_outcome - Added
preview_quiz - Added
preview_scorecard
48 tool updates
v0.1.0- 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
TDQS
Scored across 52 tools
The toolset is organized by resource (forms, questions, translations, examinees, records, leads, bookings, tenants) and the descriptions are unusually precise, so most choices are clear. A few near-neighbor pairs remain (create_form / create_form_from_template / duplicate_form, update_form / update_form_settings, list_records / list_leads / list_examinees), but the documentation draws those boundaries well.
Almost every tool follows a lowercase snake_case verb_noun pattern, with clear CRUD families for forms, questions, translations, records, leads, and bookings. Minor inconsistencies such as add_question vs insert_question, set_dimension_analysis next to update_form, and update_tenant_slug beside switch_active_tenant keep it from a perfect score.
At 52 tools, this crosses the 50+ threshold for an extreme tool surface and is far beyond the 3-15 sweet spot; the sheer volume will consume context and make reliable tool selection harder. The scope is genuinely broad, but a single MCP server this large is a mismatch and should be split into quiz-builder, analytics/CRM, and booking/team servers.
The core quiz lifecycle is thoroughly covered: form CRUD plus restore/duplicate, question editing, translations, media upload, delivery settings, analytics, submission records, leads, and bookings. Minor gaps exist - no media list/delete, no member removal, no examinee delete - but agents can work around them.
Maintenance
Related MCP Connectors
Create and manage quizzes, leads, and respondents on RooQuiz, a lead-capture assessment platform.
Create forms, surveys, quizzes & polls — publish shareable links and analyze responses.
Build, publish and analyze quizzes, polls, forms and personality tests. Riddle account required.
Build, publish and read scored forms and quizzes where the score picks the next screen.
Related MCP Servers
- AlicenseAqualityDmaintenanceGenerate styled QR codes, manage dynamic short links with click analytics, and publish micro-landing pages via AI agents.1935 npm1MIT
- AlicenseNot gradedqualityBmaintenanceQuiz Generator AI - MCP server providing AI-powered tools and automation by MEOK AI Labs6 npm92 PyPIMIT
- FlicenseNot gradedqualityDmaintenanceA quiz distribution and grading server for educators. Create exams, generate student links + QR codes, grade submissions, and track student performance — all from Claude.-
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to build and operate production-ready forms, quizzes, surveys, and workflows, including creation, publishing, submission management, and integration with webhooks and analytics.MIT