PickFu
Server Details
Ask real people anything: get human feedback on ideas, images, names, and copy.
- Status
- Healthy
- Uptime
- 86.0% over 22 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 46 tools
Most tools have a single clear resource+action target, and the descriptions actively disambiguate near-pairs (discover_targeting vs list_available_targeting, get_playbook vs list_playbooks vs get_synthetic_playbook, list_templates vs list_mockup_templates). However there are several competing survey-creation paths (save_survey, build_poll_url, mini_poll, duplicate_survey, template-based save_survey) and three 'search/find surveys' routes (list_surveys, semantic_search_surveys, get_playbook), which an agent could misselect.
The dominant pattern is a consistent verb_noun snake_case scheme (list_surveys, get_survey, save_project, delete_survey, publish_survey, rate_response), which holds across the vast majority of the 46 tools. Minor deviations: mini_poll, mcp_feedback and help_center_search are noun-first, and 'poll' vs 'survey' terminology is mixed (build_poll_url, mini_poll vs save_survey).
46 tools is well above the practical ceiling for an agent toolset and forces the model to sift through surveys, synthetic research, playbooks, templates, mockups, media, targeting, tags and projects on every turn. The domain is genuinely broad, but several clusters (three playbook tools, two feedback/templates families, three image-handling tools) could be consolidated into 20-25 tools without losing capability.
The survey lifecycle is essentially fully covered: create/update, preview, publish, stop, delete/archive, duplicate, respondents, responses, follow-ups, pinning, rating, exports, reports, targeting discovery and synthetic research. Gaps are minor — tags and projects have create/read but no delete/update counterparts, and there is no response-level update or comment tool.
Available Tools
46 toolsadd_respondentsADestructiveIdempotentInspect
Adds more respondents to a completed PickFu survey. respondentsAmount is the new TOTAL count (not the number to add) and must be one of PickFu's allowed package sizes — not an arbitrary number; the API returns the valid options if rejected. Preview is the default and makes no purchase. Confirm the preview, then send preview:false, previewToken and the returned operationId to execute. Reuse that exact command after uncertain delivery. Personal execution is unavailable; team execution retains its existing rollout gate. Survey must be panel-sourced and completed.
| Name | Required | Description | Default |
|---|---|---|---|
| preview | No | If true (default), returns cost estimate without charging. Set false to execute. | |
| surveyId | Yes | The survey GUID to extend | |
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. | |
| operationId | No | Stable operation id. Omit to prepare without spending; supply it on the confirmed execution and reuse it after uncertain responses. | |
| previewToken | No | Consent token returned by preview; required for execution. | |
| respondentsAmount | Yes | New TOTAL respondent count (not additional), must exceed the current count. Must be an allowed PickFu package size, not an arbitrary number — if rejected, the API returns the valid options. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | No | |
| data | No | |
| status | No | |
| success | No | |
| surveyId | No | |
| shortfall | No | |
| sampleSize | No | |
| eligibility | No | |
| operationId | No | |
| previewToken | No | |
| creditBalance | No | |
| currentSampleSize | No | |
| executionAvailable | No | |
| additionalRespondents | No | |
| executionUnavailableReason | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a destructive, idempotent, non-read-only operation, but the description adds the details that matter: the call has a real monetary cost that only occurs on confirmed execution, it is a two-phase preview/consent flow, and idempotency is achieved by reusing operationId after uncertain responses. The execution-gate notes (personal unavailable, team rollout gate) are behavioral context found nowhere in the structured fields.
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 purpose and the required preview-then-execute flow are front-loaded, and nearly every sentence carries operational weight. There is mild duplication of the schema's respondentsAmount and previewToken wording, but no filler sentences.
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, spend-incurring, idempotency-sensitive mutation, the description covers the cost gate, the consent token flow, the idempotent retry pattern, and the eligibility constraints. An output schema exists, so return-value explanation is correctly omitted, and nothing an agent needs to invoke this safely 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 the key clarification that respondentsAmount is a new TOTAL rather than an increment is already documented in the schema property. The description restates that plus the allowed-package-size rejection behavior, so it mainly reinforces rather than adds new parameter meaning; baseline 3 applies when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Adds more respondents to a completed PickFu survey" gives a specific verb (adds), resource (respondents), and target scope (completed, panel-sourced surveys), which separates it cleanly from siblings like duplicate_survey, publish_survey, or stop_survey. The agent knows exactly what domain action this performs 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 spells out the operating procedure: preview is the default and spends nothing, confirm the preview, then send preview:false with previewToken and operationId to execute, and reuse the identical command after an uncertain delivery. It also names exclusions (personal execution unavailable, team execution gated, survey must be panel-sourced and completed), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_poll_urlARead-onlyIdempotentInspect
Generates a URL that creates a new PickFu survey with the specified parameters when opened. Supports demographic targeting, reporting segments, and various option formats (text, media URLs, ASINs, mockups). For a hypothetical/custom mockup without an image, call generate_image first and pass its returned image_url as mockup.image. For a survey with image options, pass previewImages: true to also get an inline preview of every image, labeled by question/option — show those to the user so they can confirm the correct assets are attached (and catch mistakes like two options sharing the same image) before launching. Pass questions as a FLAT array of { type, prompt, options } objects — do not double-nest it. Each option uses exactly ONE content type (value OR mediaUrl OR asin OR imageSet OR mockup). Example: { questions: [{ type: "head_to_head", prompt: "Which do you prefer?", options: [{ value: "A" }, { value: "B" }] }], targeting: ["amznpr"] }.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | ISO-2 country code. Defaults to US. | |
| questions | Yes | Array of questions for the survey | |
| reporting | No | Reporting segment permalinks (e.g. ['gender', 'age-range']) | |
| targeting | No | Demographic targeting permalinks (e.g. ['male', 'amznpr']) | |
| sampleSize | No | Audience size to order, as a string. Valid values depend on question type: standard surveys support "15", "30", "50", "75", "100", "200", "300", "500"; screen_recording surveys also support the smaller sizes "5", "10", "20", "25" and have a maximum of "75". Arbitrary in-between amounts are not real sizes and are rejected. | |
| previewImages | No | Set to true to also return each image option as an inline image preview (labeled by question/option) alongside the URL, so the user can visually confirm the right assets are attached — and spot two options sharing the same image — before launching. Off by default because the previews are heavy; turn it on for image surveys before handing the user the link. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/no-destructive, and the description is consistent with them by framing the output as a URL that acts only when opened. Beyond that it discloses non-obvious behavior: previews are heavy and off by default, external hosts can be rejected requiring upload_media re-hosting, and duplicate-question waste is priced per question.
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 the core action, then workflow guidance, then structural warnings and an example — each sentence carries information. It is on the long side and the mockup/generate_image advice is repeated in the schema, but nothing is 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 6-parameter tool with nested questions/options, an output schema, and rich annotations, the description covers the prerequisites (generate_image, upload_media), the pre-launch preview workflow, and the structural pitfalls an agent would otherwise get wrong. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaningfully reinforces cross-field constraints ('FLAT array', 'exactly ONE content type', 'do not double-nest') and supplies a concrete example payload mapping questions/targeting to the schema. It stops short of explaining country/reporting/sampleSize semantics beyond what the schema already states.
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 ('Generates a URL that creates a new PickFu survey') and clarifies the deferred semantics ('when opened'), which cleanly separates it from siblings like publish_survey and generate_image. An agent can tell immediately what this returns and what it does not do.
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 routes the agent to generate_image 'first' for hypothetical mockups, tells it when to set previewImages: true and to show those previews to the user before launching, and even flags the pitfall of two options sharing an image. This is when/when-not guidance plus named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_uploadARead-onlyIdempotentInspect
Check the status of a PickFu-hosted upload session minted by upload_media (no args). Returns {status: "pending"|"complete", files: [{media_url, filename, mime, bytes}]} in selection order. Call this after the user returns from the upload link so you can continue with the media-cdn.pickfu.com URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | The upload session token returned by upload_media when called with no arguments. |
Output Schema
| Name | Required | Description |
|---|---|---|
| files | No | |
| status | No |
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 safety is covered. The description adds the pending/complete state model and the 'in selection order' detail, which is meaningful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose and scoping, with no filler. The inline return-shape JSON is slightly redundant given an output schema exists, keeping it just below top marks.
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, rich annotations, and full parameter coverage, the description only needs to add workflow context — and it does, explaining the upload-then-check sequence and the media-cdn.pickfu.com URLs to continue with.
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 single token parameter is fully documented in the schema. The description's '(no args)' refers to upload_media, not this tool, and adds no syntax or format detail beyond the schema's token description. 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?
States a specific verb and resource ('Check the status of a PickFu-hosted upload session') and immediately ties it to the sibling that creates it (upload_media). An agent can distinguish it from upload_media without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Call this after the user returns from the upload link') and names the origin tool (upload_media), so the workflow position is clear. It lacks an explicit when-not statement, but the sequencing guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_tagBDestructiveInspect
Creates a new tag for organizing PickFu surveys. Tags are scoped to your organization/account.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Tag name (1-100 chars, must be unique within your organization) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=false, so the mutation/idempotency profile is covered structurally. The description adds useful organizational context (tags are scoped to your organization/account), but omits what happens on a duplicate name and whether the tag can later be removed.
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, purpose front-loaded, no filler or restatement of the title. Every sentence earns its place by adding either the operation or the scope.
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?
An output schema exists, so return values need no explanation, and the tool is simple with one fully-documented parameter. The only real gap is behavior on duplicate names and any permission requirements, which the description leaves 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 the single 'name' parameter is fully documented in the schema including length and uniqueness constraints. The description's scoping note ('organization/account') adds marginal meaning to the uniqueness rule but nothing the schema doesn't already imply.
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 ('Creates a new tag') plus the domain (PickFu surveys) and scoping model. It is easily distinguished from the sibling list_tags, though it never names that sibling explicitly to reinforce the create-vs-list distinction.
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?
There is no when-to-use or when-not-to-use guidance, no mention of prerequisites such as needing an existing survey or project, and no pointer to list_tags for checking whether a tag already exists. The agent must infer all routing from the verb alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_surveyADestructiveIdempotentInspect
Deletes or archives a PickFu survey. Draft surveys are soft-deleted; published surveys are archived (data preserved). Idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| surveyId | Yes | GUID of the survey to delete or archive | |
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is carried by structured data. The description does add genuine value by disclosing that drafts are soft-deleted while published surveys are archived with data preserved, but it restates idempotency and says nothing about permission requirements or error behavior for missing/foreign surveys.
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 with zero filler; the core action is front-loaded and the outcome differentiation follows immediately. Idempotency is the only mildly redundant clause given annotation coverage.
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?
An output schema exists, so return values need not be explained, and the draft-versus-published outcomes are the key behavioral fact an agent needs before invoking a destructive tool. Minor gaps are permissions and behavior when the survey does not exist or is not owned by the caller.
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%, including enum documentation for idNamespace, so the schema carries parameter semantics entirely. The description adds no additional meaning about surveyId format or when to supply idNamespace, making the baseline 3 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?
States a specific verb and resource ('Deletes or archives a PickFu survey') and immediately clarifies the two outcomes, so an agent knows exactly what the operation does. It does not explicitly contrast itself with siblings like stop_survey or publish_survey, which keeps it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb and the draft/published distinction, giving the agent context on when the destructive path applies. There is no explicit guidance on when to use this versus stop_survey or publish_survey, nor any stated prerequisite (e.g., ownership or permissions).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_targetingARead-onlyIdempotentInspect
Finds ranked audience targeting matches from a country and free-text description. Use alongside list_available_targeting when the user describes an audience in words; fall back to list_available_targeting to browse the full catalog whenever the matches look wrong, the response carries low_confidence, or the query is not in English (trait labels are English-only in every country). The response includes ranked matches with scores, reasoning, and pricing, plus recommended audiences when available; present the JSON as returned and pass chosen permalink values to save_survey.targeting. time_expectation is null in this version.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Free-text description of the audience. | |
| countryCode | Yes | ISO-2 country code the survey will run in (e.g. 'US', 'GB', 'CA'). Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | Yes | |
| query | Yes | |
| matches | Yes | |
| warnings | Yes | |
| country_code | Yes | |
| low_confidence | Yes | |
| saved_audiences | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description adds substantially beyond that: the response shape (ranked matches with scores, reasoning, pricing, plus recommended audiences), the existence of a low_confidence signal, the English-only limitation on trait labels across all countries, and the note that time_expectation is null in this version. Those are exactly the behavioral traits 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?
Core purpose and the sibling alternative are front-loaded, and the fallback conditions follow in a compact list. The final sentence about time_expectation is slightly abrupt and the sentence covering response contents plus save_survey.targeting chaining is dense, but no sentence is 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 3-parameter discovery tool, the description covers input intent, failure modes, output composition, and the downstream handoff ('pass chosen permalink values to save_survey.targeting'). Even though an output schema exists, the description's explanation of low_confidence and recommended audiences adds the interpretive context needed to act on results.
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 67%; query and countryCode are documented in the schema, while limit only has type/default/range bounds. The description compensates partly by framing query as a free-text audience description and by disclosing that trait labels are English-only, which constrains what language the query should be written in. It does not explain the limit parameter or ranking cutoff behavior, so it adds meaningful but not complete semantic value.
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: 'Finds ranked audience targeting matches from a country and free-text description.' It explicitly positions itself against the sibling list_available_targeting, so an agent can distinguish browsing the catalog from querying it without inspecting 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?
It states the primary use case ('when the user describes an audience in words') and three concrete fallback conditions for switching to list_available_targeting: wrong-looking matches, a low_confidence flag in the response, or a non-English query. This is explicit when-to-use and when-to-switch guidance rather than implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_surveyADestructiveInspect
Duplicate an owned survey as a new unpaid draft. Preserves questions, media, own-audience settings and owned projects/tags. Overrides replace the copied associations. Mini copies retain their daily allowance restrictions. Returns the draft and its results URL. If media copying fails, repair the returned draftId with save_survey; repeating duplication creates another draft.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| tagIds | No | Replace copied tags. An empty array clears them. | |
| surveyId | Yes | ||
| externalId | No | ||
| projectIds | No | Replace copied projects. An empty array clears them. | |
| sampleSize | No | ||
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | No | |
| data | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true; the description goes beyond them by spelling out the consequence of non-idempotency, the draft being unpaid, Mini allowance restrictions carrying over, and a concrete recovery path. It does not clarify whether the source survey is ever affected or what permissions are required, which would matter for a destructive-flagged 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?
Front-loaded with the core action and result, then escalating to edge cases in roughly priority order; sentences are dense but each carries information. It is near the upper limit of length for a single-operation tool but avoids 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?
An output schema exists, so the description need not document return shape, and the preservation/failure notes cover the main behavioral questions for a duplication tool. Residual gap is the unexplained sampleSize and externalId parameters, which an agent cannot infer from anywhere.
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 43%, and the description adds meaning mainly for tagIds/projectIds via "Overrides replace the copied associations." The other parameters — sampleSize, externalId, name — are neither described in the schema nor explained here, so the coverage gap is only partly compensated.
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 ("Duplicate an owned survey") plus the exact output object ("a new unpaid draft"), which cleanly separates it from save_survey, create-style siblings, and get_survey. The preservation list further pins down what the copy contains.
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 clear routing for the failure case ("repair the returned draftId with save_survey") and an explicit anti-retry rule ("repeating duplication creates another draft"). It also scopes usage implicitly to owned surveys, but never states what to do for non-owned/template sources or points to get_template/list_templates as the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_survey_resultsARead-onlyIdempotentInspect
Returns download URLs for a completed survey's results in CSV, PDF, and PNG formats. Requires authentication and read scope; the caller must be able to view the survey. Use the format argument to limit which formats are returned, and the language argument (ISO 639-1 code) to filter PDF/PNG entries by language. CSV URLs include a short-lived signed token that lets MCP clients follow the link without supplying their own auth header. URLs are returned as resource_link content blocks the client can download or render directly.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Limit returned formats. 'all' returns whichever are available. | all |
| language | No | ISO 639-1 language code to filter PDF/PNG entries by language (case-insensitive). Omit to include all languages. | |
| surveyId | Yes | Survey GUID (or URL containing the GUID) | |
| csvVersion | No | v2 | |
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| exports | Yes | |
| surveyId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior, so the bar is lower, yet the description still adds substantive context: scope and permission requirements, the short-lived signed token embedded in CSV URLs so clients can follow links without their own auth header, and the fact that results arrive as resource_link content blocks. These are exactly the operational details an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct information, with the core purpose front-loaded and the operational caveat (signed token) placed after the usage instructions. No filler or repetition of the tool name.
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, return values need only light treatment, and the description still usefully characterizes them as downloadable resource_link blocks. Auth, permissions, filtering, and link-following behavior are all covered; the omission of `csvVersion` and `idNamespace` semantics is the remaining shortfall for a 5-parameter tool with three enums.
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 80%, so the baseline is 3, and the description mostly restates what the schema already says about `format` (limiting returned formats) and `language` (ISO 639-1 filtering of PDF/PNG entries). It adds nothing about `csvVersion` or the genuinely ambiguous `idNamespace` collision-disambiguation parameter, both of which would have benefited from explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Returns download URLs for a completed survey's results in CSV, PDF, and PNG formats.' That is far more precise than the name alone and is clearly distinct in kind from data-returning siblings like get_survey_responses. It stops short of naming the sibling it replaces, so an agent must infer that this tool yields links rather than response payloads.
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 prerequisites for use clearly (authentication, `read` scope, caller must be able to view the survey) and explains how to narrow output via `format` and `language`. It offers no explicit when-not or 'use X instead' guidance relative to get_survey_responses or generate_report, which is the only real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_imagesARead-onlyIdempotentInspect
Fetch and return images from URLs so you can view and describe them. HTTPS only; JPEG/PNG/GIF/WebP up to 5 MB each (SVG unsupported). Allowed hosts: PickFu CDN (pickfu.com, cloudinary.com, *.cloudfront.net, s3.amazonaws.com) and Amazon product images (m.media-amazon.com, *.ssl-images-amazon.com, images-amazon.com). For local image files, call upload_media with no arguments to mint a PickFu upload link, present it to the user, then check_upload for media-cdn.pickfu.com URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | Image URLs to fetch (1-20). Allowed hosts: PickFu CDN and Amazon product images (m.media-amazon.com). |
Output Schema
| Name | Required | Description |
|---|---|---|
| images | Yes | |
| failedUrls | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe/read-only/idempotent profile, but the description adds critical operational constraints not present anywhere else: HTTPS-only, size cap (5 MB), accepted formats (JPEG/PNG/GIF/WebP, no SVG), and an explicit host allowlist.
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 the core action, then constraints, then the alternative workflow. Every sentence earns its place, though the closing local-file workflow sentence is somewhat dense and could be tightened.
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?
An output schema exists, so return values need not be explained. Given a single-param, read-only tool, the description covers purpose, constraints, and the fallback path completely.
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 urls parameter is already documented (type, 1-20 bounds, format). The description expands the allowlist far beyond the schema's abbreviated version (cloudinary, cloudfront, s3, Amazon subdomains), adding genuine meaning, though item-level count is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fetch and return) and resource (images from URLs) plus the agent-facing purpose (view and describe them). It is immediately distinguishable from siblings like generate_image and upload_media, which are named where relevant.
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 it (URLs from the allowed host allowlist) and when not (local image files), routing the agent through the exact alternative workflow: upload_media (no args) -> present link -> check_upload. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_imageADestructiveIdempotentInspect
Generate an image for PickFu research — either create a product image for a hypothetical/custom mockup or prepare creative variants of an existing product image, thumbnail, ad, or app-store asset for respondent testing and to put in front of respondents. For a mockup without an existing product image, call this tool first, then use only a completed image URL as mockup.image in save_survey or build_poll_url. Describe the image in the prompt, and optionally provide up to 3 existing reference images to adapt. For local files, call upload_media with no arguments to mint a PickFu upload link, then check_upload for media-cdn.pickfu.com URLs. Uses Nano Banana Pro. Without requestId, omit operationId to prepare without generating or spending; after confirmation repeat the parameters with the returned operationId to generate the completed image_url. Reuse that operation ID and the same parameters after uncertain responses. With the first-party runtime's requestId, starts asynchronous generation directly, before external preparation/confirmation, and returns imageGeneration with message/request IDs, status, optional run ID and terminal result. Pending is not a completed image: acknowledge it and finish the turn; first-party chat will continue automatically to finish the user's request. Do not ask the user to check back, poll, or regenerate. Use get_image_generation_status for a one-shot inspection of asynchronous requests when needed. Limitation: every generation repaints the whole scene, and uploaded brand assets (logos, wordmarks) are redrawn approximately, not reproduced pixel-for-pixel. Never claim a generated image matches an uploaded logo exactly; do not iterate on logo fidelity more than twice — offer to generate the scene with a blank area for the logo and let the user paste the real file in, or hand off for manual compositing, instead.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | Describe the image to generate for research. For a hypothetical/custom mockup, describe the product, presentation, lighting, and composition; pass the returned image_url as mockup.image in save_survey or build_poll_url. When reference images are provided, explain how to adapt the existing asset. | |
| requestId | No | First-party agent tool-call ID supplied by the runtime. Starts asynchronous generation in the verified conversation; correlation only, not authorization. Omit for external preparation and confirmed execution. | |
| aspectRatio | No | Aspect ratio of the generated image. Defaults to 1:1. | |
| operationId | No | Stable operation id. Omit to prepare without spending; supply it on the confirmed execution and reuse it after uncertain responses. | |
| referenceImageUrls | No | Optional existing assets to use as references (max 3) when preparing a research variant. Omit this for a new hypothetical/custom product image. URLs must be HTTPS on allowed image hosts, such as PickFu CDN or Amazon product image hosts. For local files, call upload_media with no arguments, present the upload_url, then check_upload for media-cdn.pickfu.com URLs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| prompt | No | |
| status | No | |
| image_url | No | |
| model_used | No | |
| operationId | No | |
| aspect_ratio | No | |
| imageGeneration | No | |
| reference_image_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantial context beyond them: preparation does not spend, generation requires confirming with the returned operationId, reuse the same operationId after uncertain responses, and the async requestId path returns imageGeneration with status and terminal result. The logo-fidelity limitation and 'pending is not a completed image' guidance are exactly the kind of behavioral disclosure an agent needs. Minor gap: it never explains why destructiveHint=true applies.
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 purpose and the mockup-first instruction are front-loaded, which is good, but the middle is a dense run-on chain covering two execution modes, cross-tool upload steps, and status polling. Every topic is relevant, yet the operationId/requestId block could be split or tightened so an agent can parse the two paths at a glance.
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 five parameters, dual sync/async modes, and an output schema, the description covers the full lifecycle: preparation, confirmation, idempotent retry, async continuation, and the post-generation handoff to save_survey/build_poll_url. An output schema exists, so return values need not be enumerated, and the one async return shape it does mention is warranted by the unusual continuation behavior.
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 descriptions already spell out operationId (omit to prepare without spending), requestId (runtime-supplied, correlation only), and referenceImageUrls (max 3, HTTPS allowed hosts). The description largely restates these rather than adding new semantics, 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?
Opens with a specific verb+resource ('Generate an image for PickFu research') and immediately splits the two supported intents: new hypothetical/custom product mockup vs. creative variants of an existing asset. This clearly distinguishes it from siblings like extract_images, upload_media, and list_mockup_templates.
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?
Explicit sequencing rules: call first for a mockup with no existing image, then pass only a completed image_url to save_survey or build_poll_url. It also routes local files through upload_media (no args) then check_upload, and names get_image_generation_status as the alternative for one-shot async inspection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_reportADestructiveInspect
Generate a PickFu report from a server template: the same report the app's Generate report button makes. Use template poll-summary with surveyId for one survey, or project-summary with projectId for every poll in a project. Offer it once a survey has finished collecting, or once every poll in a project has finished, and ask the user before calling, because it starts a long model run. Returns id, url and status straight away; a new report is PENDING and fills in at url over a few minutes. If the user already has this report, generating or ready, it returns that one instead of starting another, so status may be READY. IMPORTANT: always present url as a clickable link. The report is private to the user until they share it from the report page. Never retry automatically; after a timeout, check Reports before trying again. A survey that is still collecting, or a project with a poll still collecting, is refused.
| Name | Required | Description | Default |
|---|---|---|---|
| surveyId | No | The survey's srv_ ID. Required for poll-summary; omit for project-summary. | |
| template | Yes | poll-summary reports on one survey (pass surveyId). project-summary reports on every poll in a project together (pass projectId). | |
| projectId | No | The project ID, as list_projects or get_project returns it. Required for project-summary; omit for poll-summary. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | Yes | |
| status | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (readOnlyHint=false, destructiveHint=true, openWorldHint=true, idempotentHint=false) but the description supplies the operational behavior those hints cannot: cost ('a long model run'), async lifecycle (returns id/url/status immediately, PENDING filling in over minutes), dedupe behavior (returns an existing PENDING/READY report rather than starting another), privacy ('private to the user until they share it'), and a retry policy ('Never retry automatically; after a timeout, check Reports'). Note the dedupe sentence is in mild tension with idempotentHint=false, but it reads as a same-report short-circuit rather than a claim of idempotency, so it is not a contradiction.
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 the purpose, then preconditions, then lifecycle, then the two imperative rules, which is the right order for an agent. It is long but nearly every sentence carries an operational constraint (consent, async status, no auto-retry, refused-when-collecting). The only waste is the partial restatement of the template/ID mapping already fully covered in 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?
An output schema exists, yet the description still usefully explains the status semantics (PENDING vs READY, filling in at url over minutes) that a schema shape alone would not convey. Combined with the consent requirement, refusal condition, privacy note, and retry guidance, an agent has everything needed to call this destructive, long-running 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 documents its role, the srv_ pattern, and the omit-when-using-the-other rule, so baseline is 3. The description restates the template-to-ID pairing ('use template poll-summary with surveyId ... or project-summary with projectId') and adds that project-summary covers 'every poll in a project,' but adds no format or syntax 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?
States a specific verb and resource ('Generate a PickFu report from a server template') and pins the output to a familiar referent: 'the same report the app's Generate report button makes.' It immediately distinguishes the two operating modes (poll-summary/surveyId vs project-summary/projectId), so an agent can tell it apart from siblings like export_survey_results or list_available_reporting without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions for use ('once a survey has finished collecting, or once every poll in a project has finished'), a required consent step ('ask the user before calling, because it starts a long model run'), and states the negative case ('A survey that is still collecting ... is refused'). It also names the concrete alternative path when the user already has the report, leaving nothing to inference about when to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_collection_linkARead-onlyIdempotentInspect
Get the respondent collection link for an own-audience survey. Requires editor/write access. Returns pending with no URL until publication is ready, or ready with the link to share with respondents. This is separate from the results URL.
| Name | Required | Description | Default |
|---|---|---|---|
| surveyId | Yes | ||
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| object | Yes | |
| status | Yes | |
| surveyId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, so the description is not required to carry safety. It still adds genuinely useful non-schema context: the editor/write authorization requirement and the state-dependent return ("pending" with no URL versus "ready" with the link). The return detail overlaps somewhat with the existing output schema, keeping it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each carrying distinct information, with the core purpose and the results-URL disambiguation both front-loaded. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with a full annotation set and an output schema, the description covers authorization, state semantics, and the main sibling confusion. The remaining gap is identifier guidance for surveyId, which is left entirely to a thin schema entry.
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?
Neither parameter is addressed in the description. The schema documents idNamespace thoroughly, but surveyId has only a type and minLength, and coverage sits at 50%, so the description should have explained what identifier is expected and when a namespace is needed. The mention of "own-audience survey" only indirectly constrains surveyId.
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 ("Get the respondent collection link"), scopes it to own-audience surveys, and explicitly distinguishes the output from the results URL. An agent can tell this apart from sibling retrieval tools like get_survey or build_poll_url 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?
Gives clear context for use — you need the shareable link for respondents on an own-audience survey, and you need editor/write access. It also rules out the nearby confusion with the results URL. It stops short of naming a sibling alternative or saying what to do for non-own-audience surveys.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_followup_answersARead-onlyIdempotentInspect
Retrieves the answers respondents provided to follow-up questions sent on a PickFu survey. Each item ties back to the original response by responseId, so you can correlate follow-ups with the source answer from get_survey_responses. Use responseId to filter to follow-ups for a single original response. Items where refunded=true indicate the follow-up was not delivered (e.g. the respondent declined or the request expired) and the credit was refunded.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default 1). | |
| limit | No | Follow-up answers per page (1-100, default 25). | |
| cursor | No | Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page. | |
| surveyId | Yes | The survey GUID (the `id` field returned by get_survey or list_surveys). | |
| responseId | No | Filter follow-up answers to a single original response by its GUID. Use the `id` field of an individual response from get_survey_responses. | |
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| hasMore | No | |
| nextCursor | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior, so the safety profile is covered. The description adds genuinely non-obvious domain behavior: refunded=true means the follow-up was never delivered (respondent declined or request expired) and credit was returned, which prevents an agent from misreading empty answers as real 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 sentences, front-loaded with the primary purpose, then the correlation key, then the filtering hint, then the refund caveat. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With full schema coverage and an output schema handling return structure, the description only needs to convey purpose, correlation semantics, and the refunded caveat, all of which it does. Nothing required 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 page, limit, cursor, surveyId, responseId and idNamespace are already documented. The description's note about responseId correlating to the source answer largely restates the schema's own wording, so it adds little 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?
States a specific verb and resource ('Retrieves the answers respondents provided to follow-up questions sent on a PickFu survey') and immediately distinguishes itself from the sibling get_survey_responses by explaining that items tie back via responseId. An agent can tell what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use: it is the follow-up companion to get_survey_responses, and 'Use responseId to filter to follow-ups for a single original response' tells the agent how to narrow scope. It stops short of explicit when-not-to-use guidance or naming alternatives for the unfiltered case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_image_generation_statusARead-onlyIdempotentInspect
Inspect an existing image generation once, without starting another image. Supply runId for its queued/running/succeeded/failed/unavailable status and completed output or safe error. Omit runId to list image handles and retained results in the verified agent conversation; use nextCursor as cursor for older requests (up to 20 per page). Only use completed image URLs, and present a completed URL as a clickable link. Unavailable is not failed. Do not poll or regenerate. In first-party chat, acknowledge pending images and finish the turn; already-requested work will continue automatically, without asking the user to check back.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | List only: page size, defaults to 20. | |
| runId | No | Inspect this existing run once. Omit to list image requests in the authenticated agent conversation. | |
| cursor | No | List only: nextCursor from the preceding page, for older image requests. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| runId | No | |
| output | No | |
| status | No | |
| nextCursor | No | |
| generations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely new behavioral facts: the inspection happens exactly once, pending work continues automatically server-side, and "Unavailable is not failed" disambiguates a status value. It also states an output-handling rule (only use completed URLs, render as a clickable link), which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core purpose and mode split before the rules, and every sentence carries an instruction. It is dense to the point of being a checklist, which slightly hurts scannability but not correctness.
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?
An output schema exists, so return values need not be described; the description instead covers the status vocabulary (queued/running/succeeded/failed/unavailable), pagination, and the agent's turn-ending behavior. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real meaning on top: runId refers to an already-existing run (not a new one), and cursor should be the nextCursor from the prior page with a 20-per-page cap. limit is left to the schema, which is acceptable given full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource ("Inspect an existing image generation") and explicitly negates the sibling action ("without starting another image"), which cleanly separates it from generate_image. It also splits the two modes of operation, inspecting one run vs listing handles, so an agent knows exactly what surface it is calling.
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 fully routed: "Supply runId" for a specific run, "Omit runId" to list conversation results, plus explicit exclusions "Do not poll or regenerate." It even prescribes the agent behavior in first-party chat (acknowledge pending images, finish the turn, don't ask the user to check back).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_playbookARead-onlyIdempotentInspect
Returns the full structured playbook for a given slug: its goal plus steps_markdown — a markdown guide whose steps contain pre-filled survey-creation URLs for the user to open (these links are user-facing, not inputs for save_survey).
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Playbook slug from list_playbooks response |
Output Schema
| Name | Required | Description |
|---|---|---|
| goal | No | |
| name | No | |
| slug | No | |
| duration | No | |
| industry | No | |
| poll_count | No | |
| description | No | |
| steps_markdown | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context the annotations cannot convey: what the returned markdown contains and that its embedded survey-creation links are for the user to open, not for the agent to consume as arguments.
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 sentence with no filler, front-loaded on the return value, with the caveat tucked into a parenthetical where it reads naturally. The nested clauses make it slightly dense but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a one-parameter read tool with an output schema, so the description needn't explain return values or error behavior. It covers purpose, the single input, the shape of the result, and the one non-obvious caveat about the embedded links.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage the baseline is 3, and the description adds nothing about the slug beyond what the schema already states ("Playbook slug from list_playbooks response"). A note on slug format or how to recover from a bad slug would have pushed this higher.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ("Returns the full structured playbook for a given slug") and even enumerates the payload shape (goal plus steps_markdown). It is clearly distinguishable from list_playbooks, though it never names get_synthetic_playbook, the closest sibling and a plausible source of confusion.
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?
There is no explicit statement of when to call this versus list_playbooks or get_synthetic_playbook. The one piece of routing guidance present is negative and useful: the URLs inside steps_markdown are user-facing and must not be fed into save_survey, which steers the agent away from a specific downstream mistake.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectBRead-onlyIdempotentInspect
Gets a PickFu project by its unique ID. Returns project details including name, description, goal, survey count, and lightweight survey summaries.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The project GUID | |
| limit | No | ||
| cursor | No | ||
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, closed-world and non-destructive behavior, so the safety profile is covered. The description adds modest value by noting that embedded survey data is "lightweight summaries" (pointing an agent to get_survey for full detail), but says nothing about pagination, missing-project behavior, or limits.
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 the identification mechanism front-loaded and no filler. The enumeration of returned fields slightly overlaps what the output schema already provides, but the wording stays efficient.
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-by-ID tool with an output schema and safety annotations, the core is covered. The significant gap is the unaddressed pagination surface (limit/cursor) and the absence of any disambiguation guidance against sibling retrieval tools.
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 only 50%: id and idNamespace are documented, while limit and cursor carry no schema description. The description does not mention pagination at all, so it fails to compensate for the undocumented parameters, and "lightweight survey summaries" only hints at the limit/cursor behavior without explaining it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Gets a PickFu project by its unique ID" names a specific verb and resource, and the ID-based lookup implicitly separates it from list_projects. It stops short of explicitly differentiating itself from get_survey or list_projects, so it is clear but not sibling-routing.
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?
"By its unique ID" implies single-item retrieval rather than enumeration, which is enough to infer it is not the listing tool. However, there is no explicit statement about when to prefer this over list_projects or get_survey, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_surveyARead-onlyIdempotentInspect
Retrieves a PickFu survey by ID, including metadata, questions, options, AI summaries, and responses. When a survey is too large to return whole, each question keeps its results and AI summaries, its responses are replaced by responseCount, and responsesNote says how to read them with get_survey_responses. The optional language selects stored translations; if the requested language is unavailable, the API returns the available languages instead of silently returning untranslated content. Each question includes a results summary with the final outcome — per-option vote counts, percentages, and ranking (winner first), matching the numbers on the results page; for ranked questions these reflect the human panel's final instant-runoff (IRV) round, not first-choice share. Compare with get_synthetic_feedback_results only after aligning the question, option identities, and audience; label each source and metric separately. Do not pool human and synthetic samples or treat their percentages as equivalent. results is null for open_ended, click_test, likert, five_second_test, and screen_recording, or before any responses arrive; emoji_rating/star_rating return an averageScore instead of per-option votes. For surveys with many responses, use get_survey_responses for pagination. For a poll that is still collecting responses, the response may include a pace object: publishedAt, elapsedMinutes, typical (minutes until polls like this are a quarter, half, three-quarters full and finished) and yourHistory (this account's median finish time for similar polls); either may be null when there is too little data.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Language code for stored translated content; the API returns an actionable error when that language is unavailable | |
| surveyId | Yes | Unique identifier of the survey | |
| questionId | No | Question ID to retrieve a specific question and its responses | |
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description still adds substantial behavioral detail beyond them: truncation behavior on large surveys, the responseCount/responsesNote substitution, language fallback returning available languages instead of untranslated content, `results` being null for six specific question types or before any responses exist, averageScore for rating questions, and the optional `pace` object with its nullability caveats. This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and type-by-type result behavior, and every sentence carries operative information rather than restating the name. It is dense and long, though; the synthetic-comparison warning and the pace-object paragraph could be tightened without losing signal.
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 has a shifting response shape, conditional nulls, and a truncation mode, and the description covers all of these plus the interaction with get_survey_responses. With an output schema present it still supplies enough interpretive context that an agent can call this correctly on the first attempt.
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 earns above that by explaining language semantics in more operational terms (stored translations, fallback behavior when the language is missing). It does not add anything for surveyId, questionId, or idNamespace, and its language-fallback phrasing ('returns the available languages') sits slightly awkwardly against the schema's 'actionable error' wording, keeping it out of 5 territory.
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 ('Retrieves a PickFu survey by ID') and enumerates exactly what comes back: metadata, questions, options, AI summaries, responses. It also distinguishes itself from sibling get_survey_responses by explaining that large surveys return per-question results plus a responseCount, so an agent can tell the two 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?
Gives concrete routing guidance: use get_survey_responses for pagination on surveys with many responses, and only compare against get_synthetic_feedback_results after aligning question/option identities and requiring separate labeling. What is missing is any guidance on when to use this versus list_surveys or export_survey_results, so the coverage of alternatives is partial rather than complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_survey_responsesARead-onlyIdempotentInspect
Retrieves responses for a PickFu survey, including explanations, chosen options, and respondent demographics. The optional language selects stored translated response explanations; if the requested language is unavailable, the API returns the available languages instead of silently returning untranslated content. Supports filtering by keyword (text) and respondent demographics (traits). Omit page to fetch up to 1000 responses within the output budget and a 30-second deadline. Use nextCursor as cursor with the same account, limit and filters to continue at the first unseen response. Legacy pages 1 through 20 remain available; do not combine page and cursor. Totals are not inferred from a partial result. Use get_survey for metadata and AI summaries. Do not page through responses to count or score them yourself (for example, how many respondents ranked each option 1st, 2nd and 3rd, or a weighted 3-2-1 score): a tally across many pages is slow and can outlast the request. get_survey results carry only the final outcome (for ranked questions, the final instant-runoff round, not per-position counts); for any other count on a completed survey, call export_survey_results and point the user to the CSV, which has one row per respondent and, for a ranked question, a Vote 1, Vote 2, ... column holding the option that respondent put in each position. A survey still collecting responses has no CSV yet; say the full tally will be in the CSV once it completes. Use list_available_targeting for trait permalink values. To flag a specific response as helpful or not_helpful, pass its id to rate_response. Each response includes a pinned field — use pin_response to pin or unpin responses.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default 1). Omit page (regardless of limit) to auto-fetch as many pages as fit in one result. | |
| text | No | Keyword to filter responses by explanation text (case-insensitive) | |
| limit | No | Responses per page (1-100, default 25). Ignored when page is omitted (auto-fetch mode). | |
| cursor | No | Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page. | |
| traits | No | Comma-separated trait value permalinks to filter by respondent demographics (e.g. 'male,age-25-34'). Use list_available_targeting to see available values. | |
| language | No | Language code for stored translated response explanations; the API returns an actionable error when that language is unavailable | |
| surveyId | Yes | The survey GUID | |
| questionId | No | Filter responses to a specific question by ID | |
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| note | No | |
| hasMore | No | |
| currency | No | |
| truncated | No | |
| nextCursor | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, yet the description still adds real behavior: omitting page auto-fetches up to 1000 responses within an output budget and a 30-second deadline, cursor continuation is scoped to the same account/limit/filters and starts at the first unseen response, page and cursor must not be combined, and totals are not inferred from a partial result. The language fallback (returns available languages rather than silently untranslated text) is a genuinely useful non-obvious trait. Slight penalty only because the auto-fetch/limit interplay is partly restated rather than fully resolved (e.g., what the caller should do when the 30-second deadline truncates a result).
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 purpose, then usage rules, then per-sibling routing — a sensible order with no filler sentences. The ranked-question passage (1st/2nd/3rd, weighted 3-2-1, instant-runoff round, Vote 1/Vote 2 columns) is long and restates the slowness rationale twice, costing a point on tightness.
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?
Nine parameters, one enum, and a rich pagination model, and the description covers the tricky parts: page vs cursor, auto-fetch bounds, language fallback, and where to go for anything this tool cannot answer. An output schema exists, so omitting return-value detail is appropriate, and nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description still adds meaning the schema does not, namely that omit-page auto-fetch is a single-result mode bounded by output budget and a 30-second deadline, that cursor reuse requires unchanged filters/limit, and the semantic distinction between stored translated explanations and fallback behavior. The ranking/tally guidance is behavioral rather than parameter-level, so it does not lift this further.
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 — retrieves PickFu survey responses — and immediately enumerates the payload (explanations, chosen options, respondent demographics), which an agent cannot get from the name alone. It also names the sibling that covers the adjacent job (get_survey for metadata and AI summaries), so the tool is distinguishable without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: get_survey for metadata/summaries, export_survey_results for counts/CSV, list_available_targeting for trait permalinks, rate_response and pin_response for per-response actions. It goes further with a negative rule — do not page through responses to count or score them — and explains why (slow, can outlast the request) plus the correct substitute per case, including the in-progress survey caveat where no CSV exists yet.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_synthetic_feedbackADestructiveInspect
Starts a synthetic-feedback research request against synthetic respondents, each built from a real PickFu panelist and grounded in that person's real survey history. You choose the mode with the required concept argument:
• concept: "single" — ONE product/concept evaluated in depth. REQUIRES question: the one open-ended question every sampled respondent answers about the concept, passed verbatim. description carries the concept brief/context, plus up to 10 exhibit images via imageUrls. Example: description explains a freeze-dried liver treat and its pack shots; question: "Would you buy this for your dog, and what would stop you?"
• concept: "multi" — 2+ variants compared head-to-head (2 options) or ranked (3+). Pass the variants as EITHER 2-10 option images in imageUrls OR 2-10 textOptions (claims, names, hero copy), never both, and include every variant the user wrote verbatim in description.
If the user attached or drag-dropped local images, call upload_media with no arguments, present the upload_url, then check_upload for ordered media-cdn.pickfu.com URLs and pass those here — AI chat clients cannot pass local image bytes into a tool call.
Also pass userInput: the user's raw, verbatim request that prompted this brief (their exact words/message), separate from the cleaned-up description you compose. It is recorded only for analytics on real user intent — never shown to the synthetic respondents — so include it whenever there is a real user message.
The server picks the best-fitting synthetic audience for the brief and returns it as panel/suggestedPanel alongside a guid, the question or options, and sampleSize. STOP after this call: present that plan to the user — especially the selected audience and the question/options — and wait for them to explicitly approve or adjust it. To use a different synthetic audience, call list_synthetic_audiences, then call get_synthetic_feedback again with the chosen slug as panel to create a new draft; present that new draft and obtain fresh approval before submitting. If the response is NO_MATCHING_PANEL, no request was created: tell the user why and give them the next step from the response. Offer list_synthetic_audiences and a re-run with the chosen panel only when the reason is no_matching_audience, audience_too_specific or unclear_brief, or when the response gives no reason. Never run two synthetic audiences to compare groups (audience_comparison). Only after explicit approval call submit_synthetic_feedback with the same guid (plus edited questions). Do not chain into submit_synthetic_feedback in the same turn without an intervening user approval.
| Name | Required | Description | Default |
|---|---|---|---|
| panel | No | Optional synthetic audience slug (the parameter keeps its older name, `panel`). Normally OMIT it — the server suggests the best-fitting synthetic audience from the live catalog and returns it as `suggestedPanel` for the user to confirm. Pass a slug from list_synthetic_audiences to skip the suggestion, or when re-running after a NO_MATCHING_PANEL response whose reason is no_matching_audience, audience_too_specific or unclear_brief, or that gives no reason. | |
| concept | Yes | How many concepts the brief tests — REQUIRED. Pass "single" when ONE product/concept is evaluated in depth: the panel answers your one open-ended `question` about it (the `question` argument is required). Pass "multi" when 2+ variants are compared: A/B claim tests ("which phrasing is stronger, A: '…' B: '…'"), alternate pack designs, naming options, hero-copy candidates — pass the variants as `textOptions` or as option images in `imageUrls`. If the brief mentions an "A:" and "B:" or asks "which X is better/stronger/more trusted", use "multi". When in doubt and only one concrete product is described, use "single". | |
| question | No | Single-concept (concept: "single") ONLY, and REQUIRED there: the ONE open-ended question every sampled synthetic respondent answers about the concept. Pass the user's question verbatim — it is stored and asked exactly as written. Do not pass it for comparisons. | |
| imageUrls | No | HTTPS image URLs. For concept: "multi" these are the OPTION images being compared (2-10, one per variant; mutually exclusive with textOptions). For concept: "single" they are exhibits of the one concept (0-10, optional). If the user attached or drag-dropped local images, call upload_media with no arguments, present the upload_url, then check_upload for ordered media-cdn.pickfu.com URLs and pass those here. AI chat clients cannot pass local image bytes into a tool call. | |
| userInput | No | The user's raw, verbatim request that prompted this brief — copy their actual words/message exactly as they wrote them, NOT your cleaned-up `description` or paraphrase. Recorded only for analytics on real user intent: it is never shown to the synthetic respondents and does not affect the research. Always include it whenever there is a real user message. | |
| sampleSize | No | How many synthetic respondents answer (default 30, cap 75 on every panel, general-audience panels included); the server lowers a larger value to the panel's respondent count. | |
| description | Yes | Text brief: what is being tested, key claims/features, and any context the panel needs. For multi-concept briefs, include EVERY variant the user wrote (A, B, C…) verbatim in this field — the server splits them out. For single-concept briefs this is the concept context; the question itself goes in `question`. | |
| textOptions | No | concept: "multi" only: 2-10 TEXT options to compare instead of option images (claims, product names, hero-copy candidates). Mutually exclusive with imageUrls — pass either 2+ option images or 2+ textOptions, never both. Synthetic respondents pick/rank among these texts: 2 → head-to-head, 3+ → ranked. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, destructive, open-world call, and the description fills in what that actually means: this only creates a draft, the server picks the audience, NO_MATCHING_PANEL creates nothing, and the request must be user-approved before submission. It also discloses that userInput is analytics-only and never shown to respondents, which no annotation conveys.
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 the core action, then bulleted by mode and by workflow step, which makes a long definition scannable. Some material repeats the schema's property descriptions (imageUrls upload flow, textOptions exclusivity), costing a little density but not clarity.
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 an 8-parameter, multi-mode, non-idempotent tool with no output schema, the description covers the response shape (panel/suggestedPanel, guid, options, sampleSize), the error path, and the mandatory approval gate. An agent has everything needed to invoke it correctly and stop at the right moment.
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 still adds earned meaning by pairing mode selection with worked examples ('which phrasing is stronger, A: … B: …') and by clarifying that description must carry every variant verbatim and verbatim question text. It largely mirrors the schema rather than extending it, so it stops short of 5.
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: 'Starts a synthetic-feedback research request against synthetic respondents.' It immediately distinguishes itself from submit_synthetic_feedback (only called after approval) and get_synthetic_feedback_results, so an agent can place it in the workflow without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit branching rules: single vs multi, which argument each mode requires, what to do when the user drops local images (upload_media then check_upload), and when to re-run with list_synthetic_audiences. It also names an anti-pattern ('Never run two synthetic audiences to compare groups') and forbids chaining into submit without an intervening approval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_synthetic_feedback_resultsARead-onlyIdempotentInspect
Fetches the results of a synthetic feedback request. Call this once with the guid — the call stays pending until status is COMPLETE (up to ~60 seconds; ~100 seconds in clients that stream live progress). Do not call it repeatedly. If it ever returns while still IN_PROGRESS, call again with the same guid to resume.
What a COMPLETE response carries depends on the research type. Comparison requests (head-to-head/ranked) return a summary with winner (the option the twins leaned toward, or null when the top options tied), options (each option's label and content), sampleReasons (short per-option quotes), and usually a narrative paragraph. Lead with the narrative: the themes behind the result, then which options fell in the stronger half and which in the weaker half. Without a narrative, give the direction from winner and sampleReasons. A null winner means the twins split evenly: say so, and do not pick a side. The summary carries no vote counts, percentages or mean ranks, on purpose: twins converge, so a synthetic margin overstates the real one. Never state, estimate or tally vote shares, vote counts, mean ranks or margins for a synthetic result, and never crown a winner with a margin. If the user needs the size of the gap, recommend a human survey. To set a synthetic result beside a human survey from get_survey, first align the question, option identities and audience, then compare direction only and label each source. Do not pool human and synthetic samples. Single-concept open-ended requests return a summary with the panel's themes and quotes for the one question asked.
By default (individualAnswers omitted or false) you get only that summary. AFTER presenting it, you MUST tell the user they can drill into the raw per-respondent answers. If they say yes, call this tool again with the same guid and individualAnswers: true — that returns results (per-respondent Q&A, keyed by short anonymous segment_name ids) in place of summary. For a comparison, each answer is one twin's pick and reason: quote the reasons, but do not count the picks into shares. Do not return both in a single call.
If the response has summary_status: "unavailable" (no summary field, no results field), the summary failed to generate for this run. Tell the user the summary is not available, then offer to fetch the per-respondent answers instead — if they say yes, call this tool again with the same guid and individualAnswers: true. Respondent ids quoted in an open-ended summary (respondent_id) match the segment_name strings in results, so quotes can be cross-referenced once the user asks for the drill-down.
If a response carries next_step, it overrides the resume rule above: the run is still in progress and this turn is nearly out of time. Tell the user it is still running, and do not call this tool again in the same turn.
| Name | Required | Description | Default |
|---|---|---|---|
| guid | Yes | The synthetic request guid returned by get_synthetic_feedback. | |
| individualAnswers | No | Set to true to fetch the raw per-persona Q&A results instead of the AI summary. Default false (returns the summary). After the user has seen the summary, call this tool again with the same guid and individualAnswers: true to drill into individual persona answers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare readOnly, idempotent and non-destructive, the description adds substantial behavior the annotations cannot convey: the call blocks up to ~60s (~100s with streaming progress), the return shape depends on research type, `summary_status: "unavailable"` is a possible failure state, and a `next_step` field overrides the resume rule. It also proactively forbids deriving vote shares, counts, mean ranks or margins because twins converge.
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?
It is front-loaded with the single most important constraint (call once, it stays pending) and organized by outcome case. There is some repetition — the prohibition on vote shares/margins is restated in two places, and the drill-down instruction is described twice — which adds bulk to an already long definition for a two-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining returns, and it does so for every branch: comparison summaries (winner/options/sampleReasons/narrative), open-ended summaries, individualAnswers results, and the unavailable state. It also covers the presentation obligations the agent owes the user, which is exactly what is missing from structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents both parameters, so the bar is met by default; the description still adds meaning beyond it by stating that individualAnswers: true returns `results` in place of `summary`, that the two cannot be combined in one call, and that `respondent_id` in an open-ended summary cross-references `segment_name` in results.
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 opening sentence gives a specific verb and resource ("fetches the results of a synthetic feedback request"), which cleanly separates it from the initiating sibling get_synthetic_feedback and from submit_synthetic_feedback. The polling semantics and the guid-based lookup further pin down exactly what kind of result retrieval this is.
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?
Explicit when-to-call rules are given (call once with the guid; do not call repeatedly; resume only if it returns while IN_PROGRESS), plus a named override for the next_step field. It also routes the agent to a second call mode (individualAnswers: true) with the exact precondition "AFTER presenting the summary", and explains how to relate results to get_survey output without pooling sources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_synthetic_playbookARead-onlyIdempotentInspect
Discover and retrieve synthetic-research playbooks — self-contained, step-by-step instructions that orchestrate the synthetic-feedback tools (get_synthetic_feedback, generate_image, extract_images, etc.) into a repeatable research workflow.
Two modes:
• Call with NO arguments to LIST the available playbooks. Each comes back with an id, a user-facing title, and a description. Present the titles and descriptions to the user and ask which one they want to run.
• Call again with playbookId set to a listed id to FETCH that playbook's full instructions. STOP after this call: show the playbook to the user and get their explicit confirmation before you begin executing any of its steps. Do not chain straight into running the playbook without that approval.
This is distinct from get_playbook/list_playbooks, which serve generic survey-sequence guides — use get_synthetic_playbook for the synthetic-research workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| playbookId | No | Omit to LIST the available synthetic research playbooks (each comes back with an `id`, `title`, and `description`). Pass an `id` returned by a prior list call to fetch that single playbook's full step-by-step instructions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so safety is covered; the description adds behavior beyond that, namely the two-mode contract, the shape of list results (id, title, description), and a hard stop-and-confirm gate before executing steps. That workflow guardrail is exactly the kind of agent-facing context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a definition, then bulleted modes, then a sibling differentiation sentence — easy to parse. It is somewhat long and repeats the mode semantics that the schema field already carries, which keeps it from 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?
Single optional parameter, no output schema needed because the description explains what a list call returns. Nothing an agent needs to call this correctly — including the confirmation gate — 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 the playbookId property already documents 'omit to LIST, pass an id to fetch,' which the description largely restates. The mode framing is useful, but no additional syntax, format, or validation meaning is layered on top of the schema, so 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?
States a specific verb+resource ('Discover and retrieve synthetic-research playbooks') and immediately defines what a playbook is ('self-contained, step-by-step instructions that orchestrate the synthetic-feedback tools'). It explicitly distinguishes itself from the confusingly similar siblings get_playbook/list_playbooks, so an agent can choose correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit two-mode usage: no arguments to LIST, playbookId set to FETCH. It names the alternative tools to avoid and prescribes a post-call protocol (stop, show the user, get explicit confirmation). This is about as complete as when-to-use guidance gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_templateARead-onlyIdempotentInspect
Get one PickFu template, a ready-made single-question poll with a fixed price per respondent, by the cmb_ id from list_templates. Returns the summary fields plus question text with any blanks to fill, full constraints (question types, option types and counts, sample sizes, countries and defaults), option slots, audience (preset, choosable and blocked traits), reporting traits, context help and an example link. To run it, call save_survey with template: { id, blanks, options } within these constraints. The url opens it in PickFu's poll builder instead; present it as a clickable link. Read-only; does not publish or spend credits.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Template id from list_templates, cmb_<slug>; preserve it exactly. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Template id, cmb_<slug>; pass it to get_template. |
| url | Yes | Opens the template in PickFu's poll builder, where the user can run it. |
| name | Yes | |
| access | Yes | mine when the template was made for you or your team. |
| context | Yes | |
| audience | Yes | |
| question | Yes | |
| reporting | Yes | |
| exampleUrl | Yes | |
| constraints | Yes | |
| description | Yes | |
| optionCount | Yes | |
| optionSlots | Yes | |
| questionTypes | Yes | Question types the template accepts, e.g. head_to_head, ranked. |
| pricePerResponse | Yes | Price per respondent in US dollars at the template's default country. |
| originalPricePerResponse | Yes | Price per respondent before the template discount. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the bar is lower, but the description reinforces with domain-specific assurance ('does not publish or spend credits') and enumerates the returned content (constraints, option slots, audience, reporting traits, example link). It does not discuss rate limits or error behavior, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and id source, then workflow, then behavior. It is dense but every clause is functional; the enumeration of return fields is somewhat redundant against the existing output schema, costing a point.
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 and an output schema present, the description still supplies the missing pieces: the downstream save_survey invocation pattern, the clickable-link alternative for the url, and the no-credits-spent guarantee. An agent has everything needed to call and use the result 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 there is a single parameter, so the schema carries the load (baseline 3). The description still adds meaning by stating where the id originates (list_templates, cmb_ prefix) and how it feeds into the downstream save_survey call, which is more than 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?
States a specific verb and resource ('Get one PickFu template') and pins down the identifier source ('by the cmb_ id from list_templates'), which cleanly separates it from the sibling list_templates. An agent can tell exactly what this retrieves 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?
Gives explicit when-to-use routing: fetch by cmb_ id from list_templates, then run it via save_survey with template: { id, blanks, options }. It also names the alternative path ('The url opens it in PickFu's poll builder instead; present it as a clickable link'), so the agent knows both consumption routes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
help_center_searchARead-onlyIdempotentInspect
Searches PickFu help articles plus PickFu examples, case studies and solutions pages. Each result is labeled [Help], [Example], [Case study] or [Solution]. Pass types: ["help"] for policy, pricing, billing and how-to questions, and for what's new questions, where dated product updates usually come back newest first; check their dates. Quote policy only from [Help] results and cite the URL. For customer proof, such as who uses PickFu for a use case, pass types: ["case_study", "example"]. If a mixed search returns no [Help] result, retry with types: ["help"]. Narrow types when the user asks for one kind.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (positive integer, default: 1) | |
| query | Yes | Search query for PickFu help articles, examples, case studies and solutions | |
| types | No | Result types to search (default: all four); use ["help"] to restrict results to help articles | |
| cursor | No | Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page. | |
| locale | No | Requested article locale | |
| perPage | No | Number of results per page (1-100, default: 20) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | No | |
| pages | No | |
| hasMore | No | |
| nextCursor | No | |
| totalCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered; the description adds real behavior beyond that. It discloses result labeling conventions, that dated product updates usually return newest-first (with an instruction to check dates), and a citation requirement to quote policy only from [Help] and cite the URL.
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 the core action and result labeling, then layered guidance on types and fallbacks. It is dense but nearly every clause carries actionable information; the closing 'Narrow types when the user asks for one kind' partially restates earlier type guidance and is the one soft 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?
For a search tool with an output schema (which carries nextCursor and result shape) and a fully documented input schema, the description covers what structured fields cannot: intent-to-type mapping, retry behavior, result labeling, and citation rules. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds genuine meaning by mapping specific 'types' enum values to user intents (policy/billing/how-to vs. customer proof), which the schema enum labels do not convey. It says nothing about page, cursor, perPage, or locale, so pagination and localization semantics rely entirely on 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?
States a specific verb (searches) and a precise resource set: PickFu help articles plus examples, case studies, and solutions pages. It also names the four result labels, which lets an agent distinguish it from sibling retrieval tools like semantic_search_answers or get_playbook without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is provided: types ['help'] for policy, pricing, billing, how-to and what's-new questions, and ['case_study','example'] for customer proof. It goes further with a fallback rule (if a mixed search returns no [Help] result, retry with ['help']) and a narrowing rule when the user asks for one kind.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_available_reportingARead-onlyIdempotentInspect
Returns available demographic reporting traits with their permalinks, optionally filtered by country.
| Name | Required | Description | Default |
|---|---|---|---|
| countryCode | No | ISO-2 country code to filter by (e.g., 'US', 'CA', 'GB') |
Output Schema
| Name | Required | Description |
|---|---|---|
| traits | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds the useful fact that each trait comes with its permalink, but says nothing about result size, ordering, or what an empty result means.
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?
One sentence, no filler, with the core resource stated first and the optional filter trailing. Nothing is repeated and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter read tool with an output schema and full annotation coverage, the description covers the essentials and correctly leaves return-value structure to the output schema. The only real omission is disambiguation from list_available_targeting.
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?
There is a single optional parameter with 100% schema coverage, including format examples ('US', 'CA', 'GB') and a 2-character constraint. The description only restates that the filter is optional by country, adding no meaning beyond the schema, which is the baseline for this coverage level.
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 gives a specific verb+resource ("returns available demographic reporting traits") plus the payload detail of permalinks. It does not, however, distinguish this from the nearby sibling list_available_targeting, which an agent could plausibly confuse with it.
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 phrase "optionally filtered by country" implies the main usage mode and the optionality of the filter, but there is no explicit when-to-use, when-not, or pointer to list_available_targeting as the alternative for targeting traits rather than reporting traits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_available_targetingARead-onlyIdempotentInspect
Browse country-scoped audience targeting traits and exact permalinks before selecting targeting. Optional query is a case-insensitive substring of the English trait name or permalink, not semantic discovery; use discover_targeting for natural-language matching when available. Returns traits plus pagination (total matching traits, total_pages, has_more, next_page). Default limit 20, maximum 50. Follow next_page with the same countryCode, query, and limit to recover all matches; omit query to browse the full catalog. No matches means broaden or remove query, not that the country has no targeting. Present exact returned labels and permalinks.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed) | |
| limit | No | Traits per page (default 20, maximum 50) | |
| query | No | Case-insensitive substring of an English trait name or permalink; omit to browse all traits | |
| countryCode | No | ISO-2 country code to filter by (e.g., 'US', 'CA', 'GB') |
Output Schema
| Name | Required | Description |
|---|---|---|
| traits | Yes | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/openWorldHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior: pagination invariants (same countryCode, query, limit to recover all matches) and the empty-result interpretation caveat. It stops short of describing ordering of returned traits, which is the only remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five dense sentences with no filler, and the scope/purpose is front-loaded ahead of caveats and pagination rules. It is slightly over-packed (semicolon-joined clauses in one sentence), which costs a point on readability, but every sentence carries actionable 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?
With an output schema present the description needn't explain return shape, yet it still flags the key fields (total, total_pages, has_more, next_page) and how to advance. All four optional params, the empty-result case, and the sibling handoff are covered — nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning the schema does not: query is explicitly substring-only and 'not semantic discovery', and limit defaults/maximums are restated as operational constraints. The pagination-consistency rule ties page/limit/query/countryCode together in a way the schema never does.
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 ('Browse country-scoped audience targeting traits and exact permalinks') and immediately scopes it against the sibling 'discover_targeting'. An agent can tell this apart from semantic discovery without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes natural-language matching to discover_targeting, tells the agent to omit query to browse the full catalog, to reuse the same countryCode/query/limit when following next_page, and that zero matches means broaden the query rather than that the country lacks targeting. Named alternatives plus when-not conditions are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mockup_templatesARead-onlyIdempotentInspect
List the mockup templates a text option can show instead of plain text, such as an iOS App Store product page, or amazon-search: an Amazon search results page with the user's product among real competitors, for click tests only. Each has lookupKey, name, category, questionTypes (the question types it goes on), displayField (the field the option's value fills, such as the app name), valuesSchema (JSON Schema for its values), sampleValues and importSources (stores that can fill it). Returns pagination (default 20, maximum 50); use page + 1 while pagination.hasMore is true. Call this before save_survey, then, on a question whose type is in the template's questionTypes, give every option { value, mockup: { template: lookupKey, values } }, with values matching valuesSchema, or { value, mockup: { template: lookupKey, import: { source, id } } } to fill it from a store listing when importSources lists the store. save_survey's description gives the amazon-search steps: competitors come from lookup_listing. Read-only; does not publish or spend credits.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| templates | Yes | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so safety is partly redundant, but the description adds that it 'does not spend credits' and discloses pagination behavior (default 20, maximum 50, advance page while pagination.hasMore is true) plus a full enumeration of returned fields. It does not describe ordering or filtering of the template list, which is the only real gap.
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?
Purpose is front-loaded in the first clause and the rest is load-bearing (returned fields, pagination, save_survey handoff). It is a dense, comma-chained paragraph mixing return documentation with invocation instructions, and the final 'Read-only; does not publish or spend credits' partly restates annotations, so it is efficient but not maximally 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?
For a two-parameter list tool with an output schema, this covers what the schema cannot: the meaning of each returned field, how templates connect to question types, and the exact shape options must take downstream. An agent could construct a valid save_survey payload from this description 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 description coverage is 0%, so the description must carry the load; it does so for pagination by stating the default (20), the maximum (50), and the iteration rule 'use page + 1 while pagination.hasMore is true'. That compensates well, though the description never explicitly names the 'limit' parameter, leaving the mapping from prose to the schema field implicit.
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 the mockup templates') and immediately disambiguates by explaining what a mockup template is: a rendering a text option can show instead of plain text, with concrete examples (iOS App Store product page, amazon-search). This clearly separates it from sibling list_templates/get_template and tells an agent exactly what domain object it returns.
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 prescribes the workflow: call this before save_survey, then for each option on a question whose type appears in the template's questionTypes supply { value, mockup: { template: lookupKey, values } }, or the import variant when importSources lists the store. It also scopes amazon-search to click tests only and redirects to save_survey's description for the competitor steps and lookup_listing for competitor data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_playbooksARead-onlyIdempotentInspect
Lists available PickFu playbooks -- step-by-step research guides for common use cases. Returns name, slug, description, industry, and survey count. Use get_playbook(slug) for the full guide.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1) | |
| limit | No | Results per page (1-50, default 20) | |
| cursor | No | Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page. | |
| industry | No | Filter by industry (e.g. 'ecommerce', 'saas', 'gaming') |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | No | |
| playbooks | Yes | |
| nextCursor | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered without the description. The description adds only a field list, which largely duplicates the output schema, and says nothing about ordering, pagination behavior, or result volume. Useful but not additive beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the verb and resource, then the drill-down pointer. Every clause carries information; nothing is repeated or padded.
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 full schema coverage, rich annotations, and an output schema, the description supplies everything an agent needs: what is listed, what fields come back, and where to go for detail. No gap remains that the description should fill.
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 page/limit ranges, cursor continuation semantics, and an industry example all documented in the schema itself. The description contributes no parameter meaning beyond that, which is the baseline case when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Lists available PickFu playbooks") and immediately defines what a playbook is ("step-by-step research guides for common use cases"), so an agent unfamiliar with the domain still understands the object. It also explicitly separates itself from the drill-down sibling by naming get_playbook(slug).
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 final sentence gives a clear routing rule: use this tool to browse, then call get_playbook(slug) for the full guide. That is an explicit alternative-with-condition. It does not, however, distinguish itself from get_synthetic_playbook, which appears in the sibling list and could plausibly be confused with this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsARead-onlyIdempotentInspect
Lists projects that organize PickFu surveys into groups. Supports pagination and filtering by bookmarked or archived status.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (starts at 1) | |
| limit | No | Projects per page (1-100) | |
| cursor | No | Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page. | |
| archived | No | Filter to archived projects only | |
| bookmarked | No | Filter to bookmarked projects only |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds that results are paginated and filterable, which is modest extra context, but says nothing about result ordering, default page size, or how paging interacts visually with cursor continuation (that detail lives only in the schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with the core purpose front-loaded and supporting capabilities second. Nothing is redundant or padded, though it could be slightly sharper by naming the sibling it is not.
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 5 optional parameters, full schema documentation, an output schema, and read-only annotations, the description covers the essential purpose plus the pagination/filtering model. Only the routing relative to get_project and list_surveys is left implicit, which is a small gap for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains page, limit, cursor, archived and bookmarked in detail. The description merely echoes that pagination and archived/bookmarked filtering exist, adding no semantics such as defaults or how unset boolean filters behave.
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 ('Lists projects') and clarifies what a project is by saying it organizes PickFu surveys into groups. It does not explicitly distinguish itself from the sibling get_project or list_surveys, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than prescribed: it names pagination and bookmarked/archived filtering as capabilities, which hints at when the tool is useful, but it never says when to use this instead of get_project or list_surveys, nor any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_surveysARead-onlyIdempotentInspect
Lists PickFu surveys with optional filtering, sorting, and pagination. By default this returns recent team/account-wide surveys — for users on a team, results may include surveys created by any team member, not just the authenticated user. Set mine: true to restrict results to surveys created by the authenticated user. Returns survey metadata including name, status, type, sample size, response count, creator name, tags, projects, and a url field linking to the full results page.
| Name | Required | Description | Default |
|---|---|---|---|
| dir | No | Sort direction | |
| mine | No | When true, restrict results to surveys created by the authenticated user. Default false returns team/account-wide surveys. | |
| page | No | Page number for pagination (default 1) | |
| tags | No | Comma-separated tag IDs to filter by | |
| text | No | Free-text search against survey names and questions (max 255 chars) | |
| type | No | Comma-separated question types (e.g. 'head-to-head,ranked') | |
| limit | No | Results per page (1-100, default 20) | |
| cursor | No | Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page. | |
| sortBy | No | Field to sort results by | |
| status | No | Comma-separated statuses: completed, in-progress, unpublished, archived | |
| audiences | No | Comma-separated audience IDs to filter by | |
| countries | No | Comma-separated ISO-2 country codes (e.g. 'US,CA') | |
| optionType | No | Comma-separated option types: text, image, video | |
| projectIds | No | Comma-separated project GUIDs or numeric IDs | |
| publishedAfter | No | ISO-8601 date/datetime. Only returns surveys published after this date. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| hasMore | No | |
| nextCursor | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds real behavioral context the annotations don't: results are team/account-wide by default and may include other members' surveys, which materially affects the caller's interpretation of results.
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 the core action, then scoping, then return shape; each sentence is legible. The final sentence enumerating returned fields is somewhat listy and partly redundant given an output schema exists.
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 15 optional parameters, full schema coverage, and an output schema, an agent has what it needs to call this correctly. The only soft spot is that the description spends a sentence on return fields the output schema already defines, while not addressing cursor/page interplay.
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?
Definitely not 5 - schema coverage is 100% so baseline is 3; the description restates the `mine` semantics that the schema already documents verbatim, adding no new parameter meaning. It does not cover cursor-vs-page interaction or the comma-separated list formats beyond what the schema says.
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 ('Lists PickFu surveys') plus the supported capabilities (filtering, sorting, pagination), which clearly separates it from get_survey or the semantic_search tools. It does not explicitly name a sibling alternative, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the default scoping behavior and how to narrow it with `mine: true`, which implies the browse-all-surveys use case. However, it never says when to prefer semantic_search_surveys or get_survey, and gives no exclusions beyond that implicit default.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_synthetic_audiencesARead-onlyIdempotentInspect
Lists the synthetic audiences available for synthetic feedback, one subcategory at a time. A synthetic audience is a group of synthetic respondents; call it a synthetic audience, never a panel, because PickFu's human respondents are called panels. Call it without arguments first: it returns the subcategory index, which gives each subcategory's audience count and the slug of its general audience. Then call it with subcategory set to one name from the index: it returns that subcategory's synthetic audiences, each with its display name, slug, and a one-line description of its people. Use it when the user wants to see or change which synthetic audience answers their research. get_synthetic_feedback already suggests one automatically, so call this when the user wants a different one, or after a NO_MATCHING_PANEL response whose reason is no_matching_audience, audience_too_specific or unclear_brief, or that gives no reason. Present the choices to the user, let them choose, then call get_synthetic_feedback with the chosen slug as panel to create a new draft. Present that draft and obtain fresh approval before submitting; never change the audience while submitting an existing draft. When presenting the index in Slack or another chat client, preserve one Markdown bullet per subcategory on its own line; never combine subcategories with · separators.
| Name | Required | Description | Default |
|---|---|---|---|
| subcategory | No | Optional subcategory name from the index, for example "Supplements". Omit it to get the index: every subcategory with its synthetic audience count. Pass it to list only the synthetic audiences of that subcategory, with their slugs and descriptions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, open-world, so the bar is lower; the description still adds the two-mode call semantics (no args returns an index, with `subcategory` returns that subcategory's audiences) and names the returned fields (counts, slug, display name, one-line description). It does not discuss error behavior beyond the NO_MATCHING_PANEL routing or any rate/latency characteristics.
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 purpose and the two call modes before the workflow detail, and most sentences carry actionable content. Some length is spent on downstream workflow coaching (present the draft, obtain fresh approval) that belongs to the submit/get tools rather than to this listing tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing exactly what each mode returns (subcategory index with counts and general-audience slug; per-audience name, slug, description). For a zero-required-parameter read tool with full annotation coverage, nothing an agent needs in order 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 coverage is 100% and the schema already gives the example and omit-vs-pass explanation, so baseline is 3. The description reinforces the constraint that the value must come from the index and states the different result shape for each mode, adding a bit beyond the structured field.
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 opening sentence states a specific verb and resource (lists synthetic audiences) and immediately scopes it to one subcategory at a time. It also disambiguates vocabulary against PickFu's 'panel' term, which prevents confusion with the sibling targeting/human-respondent 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?
Explicitly names the alternative (get_synthetic_feedback auto-suggests an audience) and the exact conditions for choosing this tool instead, including specific NO_MATCHING_PANEL reason codes. It also prescribes the post-call flow and an exclusion (never change audience while submitting an existing draft).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_synthetic_feedbackARead-onlyIdempotentInspect
Lists the calling user's prior synthetic feedback requests (newest first), returning each request's guid, brief description, status, and timestamps. Call this when the user references their earlier briefs / prior feedback or asks 'what have I run?', or to look up a guid before calling get_synthetic_feedback_results. Use the optional status filter to scope to DRAFT / IN_PROGRESS / COMPLETE; default limit is 50 (max 100).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of requests to return (1..100). Default 50. Results are newest first. | |
| status | No | Optional filter by status. DRAFT = research plan ready for approval. IN_PROGRESS = personas answering. COMPLETE = summary available. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered; the description adds scope ('calling user's' only), ordering, and the default/max limit values. It stops short of describing pagination behavior or what happens beyond the 50-result window, which is the one remaining behavioral gap.
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 tightly packed sentences: the first establishes purpose and return shape, the second routes usage and pins down parameter defaults. No filler, and the identification of what the tool returns 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 no output schema, the description correctly enumerates the returned fields. Combined with the annotation coverage and full schema descriptions, an agent has everything needed to decide to call it and how to interpret the response.
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 are fully documented, including the enum meanings for DRAFT / IN_PROGRESS / COMPLETE. The description restates the status values and the default/max limit but adds no syntax or edge-case detail beyond the schema, so 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?
States a specific verb and resource ('Lists the calling user's prior synthetic feedback requests'), specifies ordering (newest first) and the exact fields returned (guid, brief description, status, timestamps). This clearly separates it from get_synthetic_feedback and get_synthetic_feedback_results in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggers ('when the user references their earlier briefs / prior feedback or asks what have I run?') and names the downstream alternative it feeds (get_synthetic_feedback_results via guid lookup). The relationship between the two tools is spelled out rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsARead-onlyIdempotentInspect
Lists available tags for organizing PickFu surveys. Supports search filtering and pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (starts at 1) | |
| limit | No | Tags per page (1-100) | |
| query | No | Search query to filter tags by name | |
| cursor | No | Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this as read-only, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds only modest domain context ('organizing PickFu surveys') and restates search/pagination capabilities already documented in the schema, without additional behavioral details such as rate limits or result ordering.
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 short sentences, front-loads the core purpose, and contains no wasted wording. Every sentence contributes directly to understanding the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with a rich output schema, full parameter descriptions, and clear annotations, the description is largely complete. It could be slightly stronger with explicit usage guidance, but it covers the purpose and capabilities sufficiently.
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 all four parameters (page, limit, query, cursor) are fully described in the schema. The description's mention of search filtering and pagination adds no parameter semantics beyond what the schema already provides, 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 states a specific verb and resource: it 'Lists available tags for organizing PickFu surveys.' That clearly distinguishes it from mutation siblings like create_tag, but it does not explicitly name alternatives or contrast with them.
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 phrase 'Supports search filtering and pagination' gives implied usage context, but there is no explicit guidance on when to use this tool versus create_tag or other tag-related operations. It is minimum viable but lacks routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesARead-onlyIdempotentInspect
List PickFu templates: ready-made single-question polls, each with a fixed price per respondent. Templates are not playbooks, which are multi-poll research plans, and not mockup templates. Filter by query, access, country or optionType. Returns id, name, description, access, questionTypes, optionCount, pricePerResponse (US dollars) and url, with hasMore and nextCursor (default 20, maximum 50); pass nextCursor back as cursor, with the same filters and limit, while hasMore is true. pricePerResponse is the template price. get_template also returns originalPricePerResponse, set only on some templates; when set, it is the price without the template. Use get_template for one template's full constraints. To run one, call get_template for its blanks and limits, then save_survey with template: { id }. The url opens the template in PickFu's poll builder instead; present it as a clickable link and preserve ids exactly. Read-only; does not publish or spend credits.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). Prefer cursor. | |
| limit | No | ||
| query | No | Case-insensitive text matched against template names, descriptions and features. | |
| access | No | mine: templates made for you or your team. public: the rest. Default all. | |
| cursor | No | Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page. | |
| country | No | Only templates that can run in this country. | |
| optionType | No | Only templates that accept this kind of option. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | Yes | |
| templates | Yes | |
| nextCursor | Yes | Pass back as cursor, with the same filters and limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description still adds real context: 'Read-only; does not publish or spend credits', the meaning of pricePerResponse, the note that originalPricePerResponse is only set on some templates, and what the url actually does (opens PickFu's poll builder, not a run action). This is behavior beyond the structured fields, not repetition of 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?
Content is front-loaded with purpose and disambiguation before the pagination and pricing details, and nearly every sentence carries an operational fact. The pricing block (pricePerResponse / originalPricePerResponse) is the densest stretch and partly duplicates what get_template would reveal, making it slightly longer than strictly necessary.
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 filtered, paginated list tool this covers everything an agent needs: filtering, cursor protocol, default and max page size, the shape of each result, the follow-up chain to save_survey, and how to present the url. An output schema exists, yet the description still names the returned fields and correctly defers originalPricePerResponse to get_template.
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 high (86%) so the baseline would be 3, but the description adds value the schema lacks: it names the four filter concepts, supplies the limit default of 20 and maximum 50 (the schema's limit property carries no description), and explains the cursor contract ('pass nextCursor back as cursor, with the same filters and limit'). It stops short of restating the enum values or the access semantics, which the schema already covers.
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 ('List PickFu templates: ready-made single-question polls, each with a fixed price per respondent') and explicitly excludes the two easily confused siblings: playbooks ('not playbooks, which are multi-poll research plans') and 'not mockup templates'. An agent can distinguish this from list_playbooks and list_mockup_templates without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is given in both directions: 'Use get_template for one template's full constraints' and 'To run one, call get_template for its blanks and limits, then save_survey with template: { id }'. The pagination condition ('while hasMore is true') supplies a stopping rule rather than leaving it to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_listingADestructiveInspect
Read a product or app listing from its store by id or link: title, images (main image first), price and currency, rating, ratings count, description, and store-specific fields such as Amazon bullets. Each field carries the provider that filled it; a field the store did not return is absent. Use this when the user names a listing and you need what it shows, instead of fetching the web page, which misses details the store renders with JavaScript. Sources today: amazon (an ASIN or Amazon product link) and apple (an App Store link or app id). Omit source only when reference is a link whose host identifies the store; a bare id needs source. An Amazon listing's fields fill one result on the amazon-search mockup template (list_mockup_templates): title, image from images[0], price, rating, reviews from ratingsCount, prime as "yes" or "no", and boughtPastMonth from recentSales, as a values.competitors[] row or as the user's own product; save_survey's description gives the steps. It does not create a survey.
| Name | Required | Description | Default |
|---|---|---|---|
| region | No | Two-letter country or marketplace code, such as us, uk or de. Omit for the US store. A region in the link wins over this one. | |
| source | No | The store the listing is on: amazon or apple. Omit only when reference is a link whose host names the store. | |
| reference | Yes | The listing's id or link: an Amazon ASIN or product link, or an App Store link or app id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The listing's canonical id, such as the ASIN. |
| fields | Yes | Each field as { value, provider }. A field the store did not return is absent. Store-specific fields, such as Amazon bullets, sit beside the shared ones. |
| region | Yes | |
| source | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description frames the tool purely as a read ('Read a product or app listing', 'It does not create a survey'), while the annotations declare readOnlyHint=false and destructiveHint=true. Nothing in the text explains what could be destructive, whether the lookup consumes credits, or why it is non-idempotent, so the agent is left with a direct conflict between prose and structured hints. The annotation_contradiction flag applies.
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?
Purpose and the anti-pattern (web page fetch) are front-loaded, followed by source rules and then the downstream mockup-template mapping. The trailing sentences about list_mockup_templates/save_survey are dense but each carries actionable routing information rather than filler, and no sentence merely restates 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?
With an output schema present the description needn't document return shape, and it still explains the field-provenance model ('each field carries the provider that filled it; a field the store did not return is absent'). For an open-world, multi-source lookup the only missing pieces are failure behavior (unsupported store, not-found listings) and the cost/side-effect question raised by the 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?
Schema coverage is already 100%, so the baseline is 3, but the description adds real semantics beyond the schema: source must be omitted only when the link's host names the store while a bare id requires it, and a region embedded in the link overrides the explicit region parameter. Only the region default (US) is left purely to the schema, so the added value is genuine if not exhaustive.
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 opening sentence names a specific verb and resource ('Read a product or app listing from its store by id or link') and enumerates the returned fields: title, images, price/currency, rating, ratings count, description, store-specific fields. It also carves out a clear boundary against the obvious alternative ('instead of fetching the web page, which misses details the store renders with JavaScript') and lists the supported sources. An agent can distinguish it from siblings like extract_images or list_mockup_templates without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when the user names a listing and you need what it shows'), an explicit when-not (don't scrape the web page), and an explicit parameter dependency rule (omit source only when the reference is a link whose host identifies the store; a bare id needs source). It even routes downstream: an Amazon result fills one row on the amazon-search mockup template, with the exact field mapping and pointer to save_survey for the steps, plus a negative scope statement ('It does not create a survey').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_feedbackADestructiveInspect
Submit feedback, suggestions, or bug reports to the PickFu team. The report and authenticated user's identity are sent to PickFu's Linear workspace when configured, with Sentry used as a fallback. Do not include credentials, secrets, or unnecessary personal data. Use when encountering tool errors, confusing behavior, or when the user wants to suggest improvements.
| Name | Required | Description | Default |
|---|---|---|---|
| category | Yes | The type of feedback: 'error' for tool failures or exceptions, 'suggestion' for improvement ideas, 'issue' for unexpected behavior, 'question' for unclear documentation or usage | |
| severity | No | Severity level: 'critical' for complete failures, 'high' for major issues, 'medium' for moderate problems, 'low' for minor inconveniences | |
| toolName | No | Name of the PickFu MCP tool involved (e.g., 'save_survey', 'build_poll_url') | |
| description | Yes | Detailed description of the feedback | |
| errorMessage | No | The specific error message or text received | |
| actualBehavior | No | What actually happened | |
| expectedBehavior | No | What was expected to happen | |
| stepsToReproduce | No | Steps to reproduce the issue |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| status | Yes | |
| identifier | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the external destinations (PickFu's Linear workspace with Sentry as fallback) and that the authenticated user's identity is transmitted, which is meaningful openWorld context an agent would not otherwise know. It also gives a data-hygiene warning about credentials and personal data, though it says nothing about duplicate submissions or failure behavior when neither destination is configured.
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 tight sentences: purpose first, transmission/privacy second, usage triggers last. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter reporting tool with full schema coverage and an output schema, the description covers what the agent needs: what it does, where the data goes, what not to include, and when to call it. Return values are handled by the output schema, so no further detail is required.
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 enums for category and severity already documented in detail, so the schema carries parameter meaning. The description adds only the general instruction not to include secrets in the submitted text, which is marginally useful but not parameter-specific guidance.
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 ('Submit feedback, suggestions, or bug reports to the PickFu team') and scopes it to the PickFu team, which separates it from sibling tools that write data (save_survey, submit_synthetic_feedback). An agent can identify the operation and its target 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 final sentence gives concrete triggers: tool errors, confusing behavior, or a user request for improvements. It lacks explicit when-not guidance (e.g., don't use for product support requests, use help_center_search instead), which is a real gap given siblings like help_center_search exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mini_pollADestructiveInspect
Create, update, or publish the authenticated account's plan-included daily mini-poll. This tool is available only on eligible plans, and teammates on the same plan share one daily allowance. Mini-polls always have exactly one question, five respondents, no audience targeting or caller-selected reporting, and no screen recording. Use action=create to make a draft, then read the draft GUID from the response field id. Use that exact value in the surveyId input for action=update and, only after the user explicitly confirms launch, action=publish. Publishing consumes today's mini-poll allowance. Returns id, status, and a clickable url.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Draft name. create/update only. | |
| action | Yes | create makes a draft, update edits an existing draft, publish launches it. | |
| country | No | create/update only. | |
| surveyId | No | Draft GUID returned by create. Required for update and publish; omit for create. | |
| questions | No | Exactly one non-screen-recording question. Required for create, optional for update, not allowed for publish. | |
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. | |
| operationId | No | Omit to prepare publication without consuming allowance. Confirm using the returned operationId. | |
| surveyIntent | No | create/update only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| url | No | |
| action | No | |
| status | Yes | |
| success | No | |
| operationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotent, and the description adds the specific consequences: publishing burns today's allowance, allowance is shared across teammates on the plan, and eligibility is plan-gated. It also warns that update will reject a surveyId not taken verbatim from create's id field, which is exactly the failure mode an agent would otherwise hit.
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 hard constraints come first, then the create→update→publish sequence with the confirmation gate, then the return shape. Six short sentences, no filler, and the scoping facts are front-loaded where they matter most.
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, plan-gated three-action tool this covers what annotations and schema cannot: eligibility, allowance consumption, the mandatory user confirmation before publish, and the id handoff between actions. An output schema exists, so the brief mention of id/status/url is sufficient rather than required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage the schema already carries parameter meaning, and much of the description's parameter content (action, surveyId) restates it. The one genuine addition is the cross-parameter contract binding create's response id to surveyId for update/publish; parameters like operationId and idNamespace get no treatment in the 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 set (create/update/publish) against a specific resource (the account's plan-included daily mini-poll), and pins down scope limits — exactly one question, five respondents, no targeting, no reporting, no screen recording. That distinguishes it from siblings like save_survey or publish_survey without the agent having to open 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?
It gives explicit sequencing (create a draft, read the returned id, pass it as surveyId for update/publish) and a hard precondition: only publish after the user explicitly confirms launch. It also flags plan eligibility and the shared daily allowance. It stops short of naming an alternative tool for full multi-question surveys, so routing away from siblings is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pin_responseADestructiveIdempotentInspect
Pins or unpins a response on a completed PickFu survey. Pinned responses are marked as particularly useful or insightful for easy retrieval. Use get_survey_responses to see current pin states. Returns the updated response ID and pin state.
| Name | Required | Description | Default |
|---|---|---|---|
| pinned | Yes | true to pin the response, false to unpin it | |
| surveyId | Yes | The unique identifier (GUID) of the survey containing the response | |
| responseId | Yes | The unique identifier (GUID) of the response to pin or unpin | |
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=true and openWorldHint=false, so safety is largely covered. The description adds the meaning of a pin and the returned fields, but leaves the destructiveHint unexplained — nothing tells the agent what is 'destroyed' by unpinning or that the operation is safe to retry.
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 tight sentences with the core action and scope front-loaded and no filler. The closing sentence on return values is slightly redundant given a dedicated output schema exists.
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?
An output schema exists, so return values need not be explained, and the description covers purpose, scope, and the companion read tool. The main remaining gap is permissions/prerequisites for a mutation flagged as destructive.
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 all four parameters including the idNamespace enum are already documented. The description adds no syntax, formats, or edge cases beyond that, 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 pair (pins or unpins) and resource (a response on a completed PickFu survey), plus the scope constraint that the survey must be completed. An agent can tell it apart from rate_response or get_survey_responses 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?
"Use get_survey_responses to see current pin states" names the read-side alternative explicitly, and the completed-survey constraint implies a precondition. However, it never contrasts pinning with the sibling rate_response, nor says when not to pin.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_surveyADestructiveInspect
Prepares a current survey quote without spending when operationId is omitted. After the user confirms, repeat the call with operationId and quoteToken to pay and queue publication. Reuse the same operationId after an uncertain response. A paid receipt does not mean collection is live. Changed quotes and funding refusals require a new decision; never automatically recharge. On an image survey, verify the attached images with the user first — call save_survey with previewImages: true (or extract_images on the option image URLs) and show them the labeled previews, since a wrong or duplicated image cannot be fixed once the survey is live.
| Name | Required | Description | Default |
|---|---|---|---|
| surveyId | Yes | The unique identifier of the survey to publish | |
| quoteToken | No | The quote from preparation. Changed quotes require fresh consent. | |
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. | |
| operationId | No | Stable operation id. Omit to prepare without spending; supply it on the confirmed execution and reuse it after uncertain responses. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | No | |
| data | No | |
| note | No | |
| status | No | |
| account | No | |
| payment | No | |
| success | No | |
| surveyId | No | |
| quoteToken | No | |
| operationId | No | |
| alreadyPublished | No | |
| completionEstimate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint:true, idempotentHint:false, openWorldHint:true), it discloses non-obvious behavior: a paid receipt does not mean the survey is collecting, quotes can change and require fresh consent, and recharge must never be automatic. The warning that a wrong or duplicated image cannot be fixed once live is exactly the kind of irreversible-consequence context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Sentences are dense but each carries a distinct operational rule, and the core omit-operationId-to-prepare mechanic is front-loaded. It runs long, and the image-verification detour, while valuable, reads as a appended caveat rather than integrated workflow, keeping it from 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?
For a destructive, money-spending, open-world mutation, the description covers the confirmation gate, idempotency strategy, failure/refusal handling, and the image-integrity precondition. An output schema exists and annotations cover the safety profile, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning about the interaction between operationId and quoteToken — that operationId alone gates whether money is spent and that quoteToken plus operationId is the paying execution. surveyId and idNamespace are left entirely to the schema, which is acceptable given full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('publish') and immediately reframes it as a two-phase prepare-then-pay operation, which is the crucial distinction from a naive publish. It also implicitly separates itself from siblings like save_survey (used for preview) and stop_survey by defining the whole quote-to-queue lifecycle.
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 branching rules: omit operationId to prepare without spending, repeat with operationId and quoteToken after user confirmation, reuse the same operationId on an uncertain response, and start a new decision for changed quotes or funding refusals. It also names the alternate path for image surveys (save_survey with previewImages:true or extract_images) so the agent knows when not to call publish yet.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rate_responseADestructiveIdempotentInspect
Marks an individual respondent comment as helpful or not_helpful. Use this after get_survey_responses to programmatically curate response quality — e.g. flag low-effort or off-topic responses for downstream filtering.
IMPORTANT: rating a response 'not_helpful' is destructive. It counts against a per-survey flag cap: free (pay-as-you-go) owners may flag 10% of the sample size, rounded up (e.g. 3 flags on a 30-response survey) — or 30% of the sample size with a floor of 2 on screen-recording polls; trial owners use the same limit. Non-trial PickFu+/Enterprise subscribers have no cap. The cap is per survey, not a fixed number, so do not quote one without knowing the sample size and plan. Exceeding it returns an error. Within the cap it auto-rejects the response (and, on multi-question surveys, all responses from the same respondent), recalculates the survey's valid-answer count, and may reopen a completed survey to collect replacement responses. Confirm with the user before applying 'not_helpful' to multiple responses in bulk.
Switching a previous 'not_helpful' rating to 'helpful' records the new vote but does NOT un-reject the response that was auto-rejected by the prior flag. Re-rating without re-sending the comment field preserves the previous comment.
| Name | Required | Description | Default |
|---|---|---|---|
| rating | Yes | Rating to apply. 'helpful' marks the response as high-quality. 'not_helpful' flags it as low-quality and may auto-reject the response — see tool description for full effect. | |
| comment | No | Optional reason or note attached to the rating (max 500 chars). | |
| surveyId | Yes | The parent survey id returned with this response. | |
| responseId | Yes | The response ID (GUID) returned in the `id` field of get_survey_responses. | |
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint and idempotentHint, but the description goes far beyond them: per-plan flag caps with tier-specific math, error on cap exceedance, cascade rejection of all responses from the same respondent, valid-answer recalculation, possible survey reopening, and the irreversibility of auto-rejection when flipping not_helpful back to helpful. This is exactly the kind of consequence detail an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then routing, then a clearly marked IMPORTANT block of consequences; the cap arithmetic examples ('3 flags on a 30-response survey') aid comprehension rather than pad. It is dense but long, and the plan-tier enumeration could be tightened slightly without losing meaning.
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, a full output schema, and 100% parameter description coverage, the description supplies the remaining behavioral context (caps, cascades, reversibility) needed for a destructive multi-tier operation. Nothing required 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 coverage is 100% so the baseline is 3, but the description adds real semantics for the comment field ('Re-rating without re-sending the comment field preserves the previous comment') and clarifies that 'helpful' simply marks quality while 'not_helpful' triggers auto-rejection. idNamespace is left to the schema, which is acceptable given its own 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?
States a specific verb and resource ('Marks an individual respondent comment as helpful or not_helpful') and anchors it to the sibling it follows from, get_survey_responses. An agent can distinguish it from pin_response or semantic_search_answers without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing ('Use this after get_survey_responses to programmatically curate response quality'), names concrete use cases (flagging low-effort or off-topic responses), and adds a clear when-not/caution rule ('Confirm with the user before applying not_helpful to multiple responses in bulk').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_projectADestructiveInspect
Create or update a PickFu project. Omit id to create; include id to update. Only provided fields are changed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Project GUID to update. Omit to create a new project. | |
| goal | No | Project goal (update only); null clears it. | |
| name | No | Project name | |
| archive | No | Archive the project (update only) | |
| bookmark | No | Bookmark the project (update only) | |
| description | No | Project description; null clears it. | |
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and idempotentHint=false, so the safety profile is covered. The description adds genuinely useful patch semantics ("Only provided fields are changed"), but it does not disclose the destructive paths the annotations warn about, such as archiving/bookmarking a project or null-clearing goal and description, and says nothing about permissions.
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, no filler, and the create-vs-update fork is front-loaded right after the purpose statement. Every clause carries operative information for the caller.
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?
An output schema exists, so return values need not be described, and annotations carry the safety profile. However, a 7-parameter tool with zero required parameters leaves open questions the description does not resolve: whether name is needed to create, how idNamespace should be chosen on update, and what happens to unmentioned fields such as archive.
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 id, goal, name, archive, bookmark, description and idNamespace all documented inline, including the null-clears behavior for goal and description. The description reinforces the id semantics but adds no meaning beyond the schema, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("Create or update a PickFu project") and immediately splits the two modes by id presence, so an agent knows exactly which operation it will perform. It does not name or differentiate itself from the closely related sibling save_survey, which is the main thing keeping it from a 5.
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?
"Omit id to create; include id to update" is an explicit, actionable rule for choosing between the tool's two modes, and "Only provided fields are changed" clarifies that omitted fields are left alone. It stops short of naming alternatives (save_survey) or stating prerequisites such as which fields are needed for a valid creation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_surveyADestructiveInspect
The response also includes a completionEstimate object when the feature is enabled: bucket (SUPER_EASY, EASY, MEDIUM, HARD, or MAY_NOT_COMPLETE), estimatedMinutes (number or null), and status ('ready' or 'pending'). This reflects how quickly the selected audience is expected to fill. If bucket is MAY_NOT_COMPLETE, warn the user that the audience is too narrow and suggest broadening it.
For sampleSize 5, 10, 20, or 25, include questions containing a screen_recording question, even on updates. Use get_survey to retrieve the existing questions and preserve their ids; without questions, only standard sample sizes (15, 30, 50, 75, 100, 200, 300, 500) are accepted.
LIKERT: Use 2–8 text statements as options[].value, no media or URLs. The likertScale presets are agreement5, agreement7, frequency, satisfaction; agreement5 is the default on create, and omitting likertScale on an update preserves the question's existing scale rather than resetting it.
TEMPLATES: to run a template (a ready-made single-question poll at a fixed price per respondent), call get_template first to read its question, blanks, option slots and limits, then create with template: { id, blanks?, prompt?, context?, options? } in place of questions. Template ids start with cmb_ and come from list_templates. Fill every {{name}} blank through blanks, keyed by its name; use prompt only on a template without blanks. Omitted name, sampleSize, country and targeting come from the template; targeting replaces the preset audience, so to change it send the template's preset traits plus your additions. reporting cannot be sent because a template's reporting traits are fixed. A draft outside the template's limits is rejected with every violation and its allowed values, and nothing is saved: fix each one and retry, or build the poll with questions at standard pricing. Template is create only; edit the draft afterwards with surveyId and questions.
Create or update a PickFu survey. Omit surveyId to create; include surveyId to update. When updating questions, include 'id' fields (from get_survey) to update in-place — questions/options without 'id' are created as new, and those missing from the payload are removed.
IMPORTANT: every response automatically includes a required written explanation from the respondent for every question type except screen_recording. Do NOT add a separate open_ended question to capture 'why' — it duplicates the built-in explanation and wastes a question slot (multi-question surveys are priced per question). Phrase the real question, and the explanation comes back on each response as the explanation field.
The response includes a cost object with: amount (dollars), balance (dollars), currency, canPayWithBalance, quotedCreditsCost (post-discount credits after free credits), creditsCostSubtotal (pre-discount credits), discounts (credit-side [label, amountInCredits] tuples — amounts are in credits and subtract directly from creditsCostSubtotal; discountsMoney has the dollar values), discountsMoney (dollar-side [label, '$X.XX'] tuples), planRequired (plan tier name or null), and priceLines (the builder's price summary as [label, '$X.XX'] tuples, each the line's cost for the whole sample: base price, extra options, text or video length, targeting, reporting; before discounts, so they add up to creditsCostSubtotal in dollars and discountsMoney takes that down to amount). When the user asks why a survey costs what it does, explain it from priceLines, e.g. a Text Length surcharge for long options.
Note: Some reporting traits are auto-injected as free defaults based on the user's plan (Basic plans: age-range, gender; Standard+ plans: age-range, gender, ethnicity, house-income, edu). The response includes a reportingDefaultsApplied array listing which traits were auto-added vs explicitly requested.
OPTION SHAPE: each option carries exactly ONE content type — text (value), image/video (mediaUrl), Amazon product (asin), multiple images (imageSet), or a custom listing (mockup). Never combine them on one option; an image option is NOT given a text label (respondents see A, B, C…). For a hypothetical/custom mockup without an image, call generate_image first and pass its returned image_url as mockup.image. The one exception is a mockup template such as an App Store page: call list_mockup_templates, then give every option of the question { value, mockup: { template, values } }. When the template lists importSources, send mockup.import: { source, id } (an App Store link or id, or an Amazon ASIN or product link) instead of typing values; PickFu reads the listing when it saves. On an update, leaving mockup out keeps an option's page, and mockup: null on an option removes the question's template. Minimal 3-way image test: { questions: [{ type: "ranked", prompt: "Which design would you buy?", options: [{ mediaUrl: "https://media-cdn.pickfu.com/…a.jpg" }, { mediaUrl: "https://media-cdn.pickfu.com/…b.jpg" }, { mediaUrl: "https://media-cdn.pickfu.com/…c.jpg" }] }], sampleSize: "15", country: "US" }.
AMAZON SEARCH RESULTS (template amazon-search): one Amazon mobile search results page with the user's product among real competitors, for testing a main image, title or price in market context. It goes on a click_test only, as the question's one option; save_survey refuses it on any other question type. Fill it in this order: (1) call lookup_listing for each competitor ASIN and copy its fields into one values.competitors[] row (1 to 9 rows): title, image from images[0], price, rating rounded to one decimal, reviews from ratingsCount, prime "yes" when prime is true, else "no", and boughtPastMonth from recentSales; (2) fill the user's product the same way at the top level of values, or send mockup.import: { source: "amazon", id: <ASIN> } and PickFu reads it when it saves; either way the option's value is the product title; (3) set values.searchTerm, values.yourPosition (the user's 1-based row, at most competitors + 1) and values.currency. Fields no listing gives (sponsored, badge, delivery, listPrice) go in values by hand. Keep searchTerm, competitors, yourPosition and currency identical on every option and in every variant, so the user's product is the only thing that changes. For an A/B test of image variants, create one poll per variant, each a single click test that differs only in the user's product, so separate audiences each see one page; then compare the share of clicks on the user's result in each poll's PickFu results (get_survey_responses gives each click as coordinates, not as the result it landed on). Do not put variants side by side in a head_to_head, which measures stated preference. get_survey returns a click test's page as its image, not its values, so keep the values you sent in order to change the page later.
VERIFY IMAGES BEFORE PUBLISHING: on an image survey, show the user the actual images before you hand over the link or call publish_survey — pass previewImages: true here (or call extract_images on the option image URLs) and present the labeled previews, so wrong or duplicated assets are caught while the survey is still a draft.
ITERATING: to refine a draft, pass the id from the previous response back as surveyId to UPDATE it in place — calling save_survey again WITHOUT surveyId creates a brand-new draft each time (duplicate clutter on the user's account).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Survey name | |
| tags | No | Survey tags (replaces all). Empty array removes all tags. Max 10. | |
| tagIds | No | ||
| country | No | ISO-2 country code. Defaults to US. | |
| surveyId | No | Survey ID to update. Omit to create a new survey. | |
| template | No | Create the survey from a template instead of writing questions. Call get_template first for its blanks, option slots and limits. Create only. | |
| projectId | No | Project ID to assign to, or null to remove | |
| questions | No | Survey questions. On create send either questions or template. Required when using screen-recording-only sample sizes (5, 10, 20, 25), including updates. Include question/option 'id' fields to update in-place. | |
| reporting | No | Reporting segment permalinks (use list_available_reporting for options). Draft surveys only; not with template, whose reporting traits are fixed. Note: some traits (age-range, gender, and for Standard+ plans: ethnicity, house-income, edu) are auto-added as free defaults — check reportingDefaultsApplied in the response to see which were auto-injected. | |
| targeting | No | Demographic targeting permalinks (use list_available_targeting for options). Draft surveys only. | |
| externalId | No | ||
| projectIds | No | ||
| sampleSize | No | ||
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. | |
| ownAudience | No | ||
| surveyIntent | No | Brief description of what the user wants to learn from this survey. Always set on create; update when purpose changes. | |
| previewImages | No | Set to true to also return each image option of the saved survey as an inline image preview (labeled by question/option), so the user can visually confirm the right assets are attached — and spot two options sharing the same image — before publishing. Off by default because the previews are heavy; turn it on for image surveys before handing the user the link. Not sent to the API. | |
| responseSource | No | ||
| randomizeOptions | No | Randomize respondent options (default true). False uses builder label order. SERP stays fixed; question order and rating scales are unchanged. Omit on update to preserve the saved value. Drafts only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | No | |
| data | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, and the description elaborates exactly why: 'questions/options without id are created as new, and those missing from the payload are removed', plus repeated calls without surveyId create brand-new drafts. It further discloses constraints annotations cannot express — template is create-only, reporting cannot be sent with a template, amazon-search is refused on non-click_test questions, and rejected drafts save nothing and return every violation.
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?
Nearly every section carries real operational value, but the document is severely mis-front-loaded: it opens with the completionEstimate and cost response fields even though an output schema exists, and the actual purpose statement appears several paragraphs in. It also duplicates schema prose (option content-type rules, mockup import semantics) verbatim, inflating length without adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter tool spanning 12 question types, templates, mockups, Amazon SERP pages and pricing, the description covers the workflows an agent must chain and the failure modes it must avoid. Return values are covered by the output schema, so the extra cost/completionEstimate explanation is surplus rather than a missing piece.
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?
Well above the 68% schema coverage baseline: it explains that targeting replaces a template's preset audience (so presets must be resent), that omitting likertScale on update preserves the existing scale, that mockup: null removes a question's page while omission preserves it, and which sample sizes (5/10/20/25) force screen_recording questions. A few params — externalId, projectIds, ownAudience, responseSource — get no meaning beyond the schema, which keeps it from a 5.
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 sentence 'Create or update a PickFu survey. Omit surveyId to create; include surveyId to update.' gives a specific verb, resource and a clear create-vs-update discriminator. It also distinguishes itself from the draft-then-publish flow by telling the agent to hand back the returned id for iteration. It loses a point because that sentence is buried mid-document, so the opening the agent reads first describes response objects rather than the tool's purpose.
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?
Explicit routing is everywhere: call get_template before using a template, call get_survey before updating questions, use questions at standard pricing when a draft violates template limits, call generate_image before a hypothetical mockup, call extract_images/previewImages before publish_survey, and create one poll per variant rather than a head_to_head. It also states an explicit prohibition (do not add a separate open_ended question for 'why') and the duplicate-draft failure mode of calling without surveyId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
semantic_search_answersARead-onlyIdempotentInspect
Semantic (meaning-based) search across individual respondent answer explanations (the free-text comments) from this account's past surveys. Returns the most relevant answers grouped by survey, ranked by similarity; each survey group includes its survey_id (public slug) and a url to the results page — always present this url as a clickable link. Use for prompts like 'what did people say about color', 'feedback about ease of use', or 'concerns about price'. Optional keyword further narrows matched answers to those containing a substring. Searches an embedded snapshot of the account's responses; pair with get_survey or get_survey_responses for full live context.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of answers to return (default 30, max 100). | |
| query | Yes | Natural-language description of the respondent feedback to find. Semantic, not keyword. | |
| keyword | No | Optional case-insensitive substring filter applied to matched answers (e.g. a brand or feature name). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/openWorld, yet the description adds substantive behavior: results are grouped by survey and ranked by similarity, each group carries survey_id and url, the url must be surfaced as a clickable link, and the corpus is an embedded snapshot rather than live data. That snapshot caveat is exactly the kind of staleness disclosure 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?
One front-loaded paragraph: what it searches, how results are shaped, the mandatory url-linking instruction, example prompts, then the snapshot caveat. No sentence is redundant with another.
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?
No output schema exists, and the description compensates by describing the return shape (answers grouped by survey, ranked, with survey_id and url). Combined with the snapshot-vs-live caveat, an agent has everything needed to call it and present results 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 the schema already explains query (semantic, not keyword), keyword (case-insensitive substring), and k (default 30, max 100). The description's restatement of the semantic-vs-keyword distinction and the keyword filter adds marginal value only, 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?
States a specific verb and resource: semantic search across 'individual respondent answer explanations (the free-text comments)' from past surveys. The 'embedded snapshot' framing plus the pointer to get_survey/get_survey_responses cleanly separates it from the live-response siblings and from semantic_search_surveys.
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?
Concrete example prompts ('what did people say about color', 'concerns about price') and the keyword-narrowing tip make the intended call pattern obvious, and it names the live-data companions. It stops short of an explicit when-not (e.g., 'do not use for structured/quantitative fields'), so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
semantic_search_surveysARead-onlyIdempotentInspect
Semantic (meaning-based) search across this account's past PickFu surveys. Given a natural-language description, returns the most relevant surveys ranked by similarity — each with its title, question, options, context, status, a survey_id (the survey's public slug), and a url to the results page. When available, results also include the survey's targeting/audience, AI-generated descriptions of any images shown, and an ai_summary of the results (what won and why) — so matches reflect the audience, visual content, and outcomes, not just the question text. IMPORTANT: always present this url as a clickable link. Use for prompts like 'find my surveys about subscription pricing', 'logo tests we ran', or 'packaging concepts targeting women'. This is NOT a keyword search — describe the concept, not exact terms (use list_surveys for structured filtering by status/date/type). It searches an embedded snapshot of the account's survey corpus and does not include full results. To get the full details of any survey in the results — complete responses, comments, and result breakdowns — use the get_survey tool with its survey_id.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of surveys to return (default 10, max 50). | |
| query | Yes | Natural-language description of the surveys to find. Semantic (meaning-based), not keyword — describe the concept. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds genuinely non-structured facts: it searches an embedded snapshot of the corpus and does not include full results, results may include AI-generated image descriptions and an ai_summary, and callers must render the returned url as a clickable link. Minor gap: no disclosure of snapshot freshness/recall behavior.
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 purpose, then return shape, then usage rules, then hand-off to get_survey — logical ordering with no filler. It runs long (five-plus sentences, one in caps), and the field-by-field return enumeration and link-rendering instruction could be tightened, but each sentence carries information an agent needs.
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?
Only two parameters and no output schema, so the description carries the return-value burden — and it does, enumerating survey_id, url, title, question, options, status, plus the conditional targeting, image descriptions, and ai_summary. It also flags the snapshot limitation and the escalation path, leaving no meaningful gap.
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%, with both `query` and `k` documented in the schema itself, so the baseline is 3. The description reinforces the query semantics ('describe the concept, not exact terms') but largely repeats the schema's own wording, and never mentions `k` (default 10, max 50) or guidance on choosing it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Semantic (meaning-based) search across this account's past PickFu surveys') and immediately scopes it against siblings: not a keyword search, and distinct from list_surveys (structured filtering) and get_survey (full details). An agent can tell exactly what this tool does and does not do 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?
Gives explicit trigger prompts ('find my surveys about subscription pricing', 'logo tests we ran'), an explicit exclusion ('This is NOT a keyword search — describe the concept, not exact terms'), and names both alternatives (list_surveys for status/date/type filtering, get_survey for full results). When-to-use, when-not, and next-step routing are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_surveyADestructiveIdempotentInspect
Stops a live PickFu survey. This is irreversible -- the survey will be marked as complete and no further responses will be collected.
| Name | Required | Description | Default |
|---|---|---|---|
| surveyId | Yes | The unique identifier (GUID) of the survey to stop | |
| idNamespace | No | Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description still adds real value by explaining what destruction means concretely: the survey is marked complete and collection ceases, while nothing is said about existing responses surviving. It does not address permission requirements or whether already-collected responses remain accessible.
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, effect stated first and the irreversibility warning second. No filler or restated name, and nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, rich annotations, and fully documented parameters, the description only needs to carry the behavioral consequence, which it does. The remaining gap is routing against delete_survey, which matters for a destructive pair but is not addressed.
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 schema already explains surveyId as a GUID and gives detailed enum semantics for idNamespace. The description adds no parameter-level 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 and resource: 'Stops a live PickFu survey', and clarifies the effect ('marked as complete', 'no further responses'). It implicitly separates itself from delete_survey by describing completion rather than removal, but never names that sibling, so an agent comparing the two must infer the distinction.
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 phrase 'live' survey implies the precondition (a survey currently collecting responses), and 'irreversible' hints at caution before use. There is no explicit when-not guidance or pointer to alternatives such as delete_survey or publish_survey, which are plausible confusions in this sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_synthetic_feedbackADestructiveIdempotentInspect
Dispatches an approved synthetic feedback request to the synthetic audience stored on the draft. Do NOT call this tool until you have presented the plan from get_synthetic_feedback to the user in chat — the selected audience plus the question (single-concept) or options (comparison) — and they have explicitly approved it; do not infer approval from silence or prior context. Pass the same guid; audience changes require a new get_synthetic_feedback draft and a new approval. Optionally pass questions when the user edited the question text (single-concept research has exactly one question). Optionally pass excludePollGuids when the request repeats existing PickFu surveys, for example in a benchmark replay. The response confirms dispatch with the request guid and status; present that confirmation, then call get_synthetic_feedback_results once with the same guid to retrieve the completed prediction. That call streams live progress and returns when the panel is COMPLETE (typically a few minutes). Do not call it repeatedly.
| Name | Required | Description | Default |
|---|---|---|---|
| guid | Yes | The synthetic request guid returned by get_synthetic_feedback. | |
| questions | No | Optional question edits, applied before dispatch. For single-concept research this is the ONE question the panel answers — pass exactly one item, and only when the user edited the question text (omit to run the question as drafted). For comparisons there is nothing to edit; omit. When passed, the list fully replaces what was drafted. | |
| excludePollGuids | No | Optional, for benchmark or replay runs: the top-level `id` of each PickFu survey (from list_surveys or get_survey) that this request repeats, not a question id. The synthetic respondents are built from real respondents, so a synthetic respondent can hold its own answer to that survey. Every synthetic respondent's memory of these surveys is withheld for this run, so the run measures prediction, not recall. Applies to comparison and single-concept requests. Pass it on the first submit, and pass the same list on any later submit for this guid. The request does not store it: a later submit before the run completes starts more synthetic respondents, and they use only the list that the later call sends. Omit for ordinary research. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: an approval gate, the fact that the response only confirms dispatch (guid + status), and that results stream for minutes and must not be polled repeatedly. The note that 'a later submit before the run completes starts more synthetic respondents' sits in mild tension with idempotentHint=true, but it is explained as same-guid re-dispatch rather than duplicate-request creation, so it reads as clarification rather than contradiction.
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-loads purpose, then the hard precondition, then parameter guidance, then the follow-up path — a sensible order. It is dense and long for a three-parameter tool, with some repetition (guid consistency is stated twice), but nearly every clause carries operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the full lifecycle an agent must know: approval prerequisite, dispatch, what the response contains, and the single streaming retrieval call with its multi-minute duration. No output schema exists, and the description compensates by describing the confirmation payload and downstream call.
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%, yet the description still adds decision-relevant meaning: guid must be the same one from the draft, questions is only for edited single-concept text (exactly one item), and excludePollGuids is for benchmark replay with the same list repeated on later submits. This tells an agent when to omit each optional parameter, which the schema alone does not.
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 ('Dispatches an approved synthetic feedback request to the synthetic audience stored on the draft'), clearly separating it from get_synthetic_feedback (drafting) and get_synthetic_feedback_results (retrieval), both named in the text.
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?
States explicit preconditions (must show the plan in chat and get explicit user approval, no inferred approval), states what to do when the audience changes (new draft, new approval), and names the correct follow-up call (get_synthetic_feedback_results with the same guid, once). When-not rules and alternatives are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_mediaADestructiveInspect
Upload an image or video to get a permanent CDN URL for use in PickFu surveys. Three modes: (1) pass a publicly accessible HTTPS url; (2) pass base64 data (images only — JPEG/PNG/GIF/WebP/BMP/TIFF/SVG, max 20 MB; videos must use url) — ONLY when the file exists on local disk you can read directly (CLI/IDE clients such as Claude Code or Cursor); (3) call with neither url nor data to mint a PickFu-hosted upload session. If the user ATTACHED the file in the chat, always use mode 3: chat attachments are not reliably accessible as raw bytes, and re-encoding or compressing them into base64 tool calls fails on payload limits — do not attempt it. Present the returned upload_url to the user, wait for them to return, then call check_upload with the returned token to receive ordered media-cdn.pickfu.com URLs and continue the original task. YouTube/Vimeo/Wistia URLs do not need uploading.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | HTTPS URL of the media to upload (image or video). Cloudinary fetches the file directly — any publicly accessible URL works. | |
| data | No | Base64-encoded image data. Can be a data URL (data:image/png;base64,...) or raw base64 string. Images only — video files are too large for base64. | |
| filename | No | Optional filename hint used as the Cloudinary public_id. If omitted, Cloudinary generates one. | |
| resourceType | No | Whether the media is an image or video. Defaults to auto-detection. Explicitly set "video" for MP4, MOV, WebM, AVI, WMV files if auto-detection fails. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| token | No | |
| action | No | |
| message | No | |
| expires_at | No | |
| upload_url | No | |
| resource_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true and idempotentHint=false; the description adds real context beyond that, including that results are permanent, that mode 3 mints a hosted session rather than performing the upload immediately, and that the agent must show `upload_url` to the user and wait before calling `check_upload`. It does not cover failure behavior, retries, or whether re-uploading an identical file creates a duplicate, which matters given idempotentHint=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?
The purpose and outcome are front-loaded, and the numbered modes map cleanly to the decision an agent must make, so the length is largely justified. Some parenthetical detail (format list, client examples) and repeated restatement of the chat-attachment rule ('do not attempt it') add bulk that could be trimmed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still supplies the orchestration detail an output schema cannot: present `upload_url`, wait for the user, then call `check_upload` with `token` to get ordered CDN URLs before resuming the original task. Combined with the mode rules and video exclusion, an agent has everything needed to call this correctly on the first try.
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 earns extra credit by adding cross-parameter selection logic the schema lacks — that `data` is only appropriate for locally readable files and is image-only with named formats and a 20 MB limit, and that neither parameter being supplied is itself a valid mode. The base64 payload-length rationale is meaningfully beyond the schema text.
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 ('Upload an image or video') plus the concrete outcome ('permanent CDN URL for use in PickFu surveys'), then enumerates three distinct invocation modes. It also names the follow-up sibling `check_upload`, so an agent can place it in the workflow without opening another 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?
Explicitly routes between the three modes with conditions: mode 1 for public HTTPS URLs, mode 2 for base64 only when the file is readable from local disk on CLI/IDE clients, mode 3 when the user attached a file in chat. It also states a hard exclusion ('videos must use url', 'YouTube/Vimeo/Wistia URLs do not need uploading') and warns against a failing approach (re-encoding chat attachments).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
help_center_search2 fields changed- removed
Output schema / properties / meta / properties / degraded / constRemoved value: -true - added
Output schema / properties / meta / properties / fallbackAdded value: +{ + "type": "boolean" +}
33 tool updates
- Changed
add_respondents16 fields changed- added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - added
Input schema / properties / operationIdAdded value: +{ + "description": "Stable operation id. Omit to prepare without spending; supply it on the confirmed execution and reuse it after uncertain responses.", + "maxLength": 255, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / previewTokenAdded value: +{ + "description": "Consent token returned by preview; required for execution.", + "minLength": 1, + "type": "string" +} - added
Output schema / properties / additionalRespondentsAdded value: +{ + "type": "integer" +} - added
Output schema / properties / costAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / creditBalanceAdded value: +{ + "additionalProperties": {}, + "type": "object" +} - added
Output schema / properties / currentSampleSizeAdded value: +{ + "type": "integer" +} - added
Output schema / properties / eligibilityAdded value: +{ + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "eligible": { + "type": "boolean" + }, + "message": { + "type": "string" + } + }, + "required": [ + "eligible" + ], + "type": "object" +} - added
Output schema / properties / executionAvailableAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / executionUnavailableReasonAdded value: +{ + "type": "string" +} - added
Output schema / properties / operationIdAdded value: +{ + "type": "string" +} - added
Output schema / properties / previewTokenAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / sampleSizeAdded value: +{ + "type": "integer" +} - added
Output schema / properties / shortfallAdded value: +{ + "additionalProperties": {}, + "type": "object" +} - added
Output schema / properties / statusAdded value: +{ + "const": "prepared", + "type": "string" +} - added
Output schema / properties / surveyIdAdded value: +{ + "type": "string" +}
- Changed
delete_survey1 field changed- added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +}
- Changed
discover_targeting3 fields changed- added
Input schema / properties / countryCodeAdded value: +{ + "description": "ISO-2 country code the survey will run in (e.g. 'US', 'GB', 'CA'). Required.", + "enum": [ + "US", + "CA", + "AU", + "DE", + "GB", + "JP", + "MX", + "ES", + "FR", + "IT", + "KR", + "BR", + "ZA", + "PL", + "SE" + ], + "type": "string" +} - removed
Input schema / properties / country_codeRemoved value: -{ - "description": "ISO-2 country code the survey will run in (e.g. 'US', 'GB', 'CA'). Required.", - "enum": [ - "US", - "CA", - "AU", - "DE", - "GB", - "JP", - "MX", - "ES", - "FR", - "IT", - "KR", - "BR", - "ZA", - "PL", - "SE" - ], - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "country_code", - "query" -]New value: +[ + "countryCode", + "query" +]
- Added
duplicate_survey - Changed
export_survey_results2 fields changed- added
Input schema / properties / csvVersionAdded value: +{ + "default": "v2", + "enum": [ + "v1", + "v2" + ], + "type": "string" +} - added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +}
- Changed
generate_image11 fields changed- added
Input schema / properties / aspectRatioAdded value: +{ + "description": "Aspect ratio of the generated image. Defaults to 1:1.", + "enum": [ + "1:1", + "2:3", + "3:2", + "3:4", + "4:3", + "4:5", + "5:4", + "9:16", + "16:9" + ], + "type": "string" +} - removed
Input schema / properties / aspect_ratioRemoved value: -{ - "description": "Aspect ratio of the generated image. Defaults to 1:1.", - "enum": [ - "1:1", - "2:3", - "3:2", - "3:4", - "4:3", - "4:5", - "5:4", - "9:16", - "16:9" - ], - "type": "string" -} - added
Input schema / properties / operationIdAdded value: +{ + "description": "Stable operation id. Omit to prepare without spending; supply it on the confirmed execution and reuse it after uncertain responses.", + "maxLength": 255, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / referenceImageUrlsAdded value: +{ + "description": "Optional existing assets to use as references (max 3) when preparing a research variant. Omit this for a new hypothetical/custom product image. URLs must be HTTPS on allowed image hosts, such as PickFu CDN or Amazon product image hosts. For local files, call upload_media with no arguments, present the upload_url, then check_upload for media-cdn.pickfu.com URLs.", + "items": { + "format": "uri", + "maxLength": 2048, + "type": "string" + }, + "maxItems": 3, + "type": "array" +} - removed
Input schema / properties / reference_image_urlsRemoved value: -{ - "description": "Optional existing assets to use as references (max 3) when preparing a research variant. Omit this for a new hypothetical/custom product image. URLs must be HTTPS on allowed image hosts, such as PickFu CDN or Amazon product image hosts. For local files, call upload_media with no arguments, present the upload_url, then check_upload for media-cdn.pickfu.com URLs.", - "items": { - "format": "uri", - "maxLength": 2048, - "type": "string" - }, - "maxItems": 3, - "type": "array" -} - added
Input schema / properties / requestIdAdded value: +{ + "description": "First-party agent tool-call ID supplied by the runtime. Starts asynchronous generation in the verified conversation; correlation only, not authorization. Omit for external preparation and confirmed execution.", + "maxLength": 255, + "minLength": 1, + "type": "string" +} - added
Output schema / anyOfAdded value: +[ + { + "required": [ + "imageGeneration" + ] + }, + { + "properties": { + "status": { + "enum": [ + "prepared", + "processing" + ] + } + }, + "required": [ + "status", + "operationId" + ] + }, + { + "required": [ + "image_url", + "aspect_ratio", + "prompt", + "reference_image_count" + ] + } +] - added
Output schema / properties / imageGenerationAdded value: +{ + "additionalProperties": false, + "properties": { + "admissionError": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "continuation": { + "additionalProperties": false, + "properties": { + "key": { + "type": "string" + }, + "nextContinuationKey": { + "type": "string" + }, + "notificationMessageId": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "notificationRunId": { + "type": "string" + }, + "revision": { + "minimum": 0, + "type": "integer" + }, + "state": { + "enum": [ + "waiting", + "queued", + "running", + "complete", + "interrupted", + "suppressed" + ], + "type": "string" + } + }, + "required": [ + "key", + "state", + "revision" + ], + "type": "object" + }, + "messageId": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "originUserMessageId": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "requestId": { + "minLength": 1, + "type": "string" + }, + "result": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "height": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "model": { + "type": "string" + }, + "publicId": { + "type": "string" + }, + "status": { + "const": "succeeded", + "type": "string" + }, + "url": { + "format": "uri", + "type": "string" + }, + "width": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "status", + "url", + "publicId", + "model", + "width", + "height" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "status": { + "const": "failed", + "type": "string" + } + }, + "required": [ + "code", + "message", + "status" + ], + "type": "object" + } + ] + }, + "runId": { + "minLength": 1, + "type": "string" + }, + "status": { + "enum": [ + "submitting", + "queued", + "running", + "succeeded", + "failed", + "unavailable" + ], + "type": "string" + } + }, + "required": [ + "messageId", + "requestId", + "status" + ], + "type": "object" +} - added
Output schema / properties / operationIdAdded value: +{ + "type": "string" +} - added
Output schema / properties / statusAdded value: +{ + "enum": [ + "prepared", + "processing", + "succeeded" + ], + "type": "string" +} - removed
Output schema / requiredRemoved value: -[ - "image_url", - "aspect_ratio", - "prompt", - "reference_image_count" -]
- Changed
generate_report5 fields changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "The project ID, as list_projects or get_project returns it. Required for project-summary; omit for poll-summary.", + "maxLength": 255, + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "The project ID, as list_projects or get_project returns it. Required for project-summary; omit for poll-summary.", - "maxLength": 255, - "minLength": 1, - "type": "string" -} - added
Input schema / properties / surveyIdAdded value: +{ + "description": "The survey's srv_ ID. Required for poll-summary; omit for project-summary.", + "pattern": "^srv_[a-f0-9]{32}$", + "type": "string" +} - removed
Input schema / properties / survey_idRemoved value: -{ - "description": "The survey's srv_ ID. Required for poll-summary; omit for project-summary.", - "pattern": "^srv_[a-f0-9]{32}$", - "type": "string" -} - changed
Input schema / properties / template / descriptionPrevious value: -"poll-summary reports on one survey (pass survey_id). project-summary reports on every poll in a project together (pass project_id)."New value: +"poll-summary reports on one survey (pass surveyId). project-summary reports on every poll in a project together (pass projectId)."
- Added
get_collection_link - Changed
get_followup_answers10 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page.", + "maxLength": 8192, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - added
Input schema / properties / page / maximumAdded value: +20 - added
Input schema / properties / responseIdAdded value: +{ + "description": "Filter follow-up answers to a single original response by its GUID. Use the `id` field of an individual response from get_survey_responses.", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "type": "string" +} - removed
Input schema / properties / response_idRemoved value: -{ - "description": "Filter follow-up answers to a single original response by its GUID. Use the `id` field of an individual response from get_survey_responses.", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "type": "string" -} - added
Input schema / properties / surveyIdAdded value: +{ + "description": "The survey GUID (the `id` field returned by get_survey or list_surveys).", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "type": "string" +} - removed
Input schema / properties / survey_idRemoved value: -{ - "description": "The survey GUID (the `id` field returned by get_survey or list_surveys).", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "survey_id" -]New value: +[ + "surveyId" +] - added
Output schema / properties / hasMoreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / nextCursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +}
- Added
get_image_generation_status - Changed
get_playbook2 fields changed- added
Output schema / properties / name / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / name / typeRemoved value: -"string"
- Changed
get_project3 fields changed- added
Input schema / properties / cursorAdded value: +{ + "maxLength": 4096, + "type": "string" +} - added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "maximum": 100, + "minimum": 1, + "type": "integer" +}
- Changed
get_survey4 fields changed- added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - added
Output schema / properties / data / properties / questions / items / properties / loadedResponseCountAdded value: +{ + "type": "number" +} - added
Output schema / properties / data / properties / questions / items / properties / responsesLoadedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / data / properties / randomizeOptionsAdded value: +{ + "type": "boolean" +}
- Changed
get_survey_responses10 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page.", + "maxLength": 8192, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - added
Input schema / properties / page / maximumAdded value: +20 - added
Input schema / properties / questionIdAdded value: +{ + "description": "Filter responses to a specific question by ID", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "type": "string" +} - removed
Input schema / properties / question_idRemoved value: -{ - "description": "Filter responses to a specific question by ID", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "type": "string" -} - added
Input schema / properties / surveyIdAdded value: +{ + "description": "The survey GUID", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "type": "string" +} - removed
Input schema / properties / survey_idRemoved value: -{ - "description": "The survey GUID", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "survey_id" -]New value: +[ + "surveyId" +] - added
Output schema / properties / hasMoreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / nextCursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +}
- Changed
get_synthetic_feedback1 field changed- changed
Input schema / properties / sampleSize / descriptionPrevious value: -"How many synthetic respondents answer (default 30, cap 75 on every panel, general-audience panels included); the server lowers a larger value to the panel's respondent count. Larger = steadier results and a longer wait; there is no charge until PickFu's new plans launch."New value: +"How many synthetic respondents answer (default 30, cap 75 on every panel, general-audience panels included); the server lowers a larger value to the panel's respondent count."
- Changed
get_synthetic_playbook2 fields changed- added
Input schema / properties / playbookIdAdded value: +{ + "description": "Omit to LIST the available synthetic research playbooks (each comes back with an `id`, `title`, and `description`). Pass an `id` returned by a prior list call to fetch that single playbook's full step-by-step instructions.", + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / playbook_idRemoved value: -{ - "description": "Omit to LIST the available synthetic research playbooks (each comes back with an `id`, `title`, and `description`). Pass an `id` returned by a prior list call to fetch that single playbook's full step-by-step instructions.", - "minLength": 1, - "type": "string" -}
- Changed
help_center_search5 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page.", + "maxLength": 8192, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / page / maximumAdded value: +20 - added
Output schema / properties / hasMoreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / nextCursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / requiredPrevious value: -[ - "totalCount", - "pages", - "data" -]New value: +[ + "data" +]
- Changed
list_available_reporting2 fields changed- added
Input schema / properties / countryCodeAdded value: +{ + "description": "ISO-2 country code to filter by (e.g., 'US', 'CA', 'GB')", + "maxLength": 2, + "minLength": 2, + "type": "string" +} - removed
Input schema / properties / country_codeRemoved value: -{ - "description": "ISO-2 country code to filter by (e.g., 'US', 'CA', 'GB')", - "maxLength": 2, - "minLength": 2, - "type": "string" -}
- Changed
list_available_targeting2 fields changed- added
Input schema / properties / countryCodeAdded value: +{ + "description": "ISO-2 country code to filter by (e.g., 'US', 'CA', 'GB')", + "maxLength": 2, + "minLength": 2, + "type": "string" +} - removed
Input schema / properties / country_codeRemoved value: -{ - "description": "ISO-2 country code to filter by (e.g., 'US', 'CA', 'GB')", - "maxLength": 2, - "minLength": 2, - "type": "string" -}
- Changed
list_playbooks7 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page.", + "maxLength": 8192, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / industry / maxLengthAdded value: +255 - added
Input schema / properties / page / maximumAdded value: +20 - added
Output schema / properties / hasMoreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / nextCursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / playbooks / items / properties / name / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / playbooks / items / properties / name / typeRemoved value: -"string"
- Changed
list_projects4 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page.", + "maxLength": 8192, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / page / maximumAdded value: +20 - added
Output schema / properties / data / properties / hasMoreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / data / properties / nextCursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +}
- Changed
list_surveys12 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page.", + "maxLength": 8192, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / optionTypeAdded value: +{ + "description": "Comma-separated option types: text, image, video", + "type": "string" +} - removed
Input schema / properties / option_typeRemoved value: -{ - "description": "Comma-separated option types: text, image, video", - "type": "string" -} - added
Input schema / properties / page / maximumAdded value: +20 - added
Input schema / properties / projectIdsAdded value: +{ + "description": "Comma-separated project GUIDs or numeric IDs", + "type": "string" +} - removed
Input schema / properties / project_idsRemoved value: -{ - "description": "Comma-separated project GUIDs or numeric IDs", - "type": "string" -} - added
Input schema / properties / publishedAfterAdded value: +{ + "description": "ISO-8601 date/datetime. Only returns surveys published after this date.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(.\\d+)?(Z|[+-]\\d{2}:?\\d{2})?)?$", + "type": "string" +} - removed
Input schema / properties / published_afterRemoved value: -{ - "description": "ISO-8601 date/datetime. Only returns surveys published after this date.", - "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(.\\d+)?(Z|[+-]\\d{2}:?\\d{2})?)?$", - "type": "string" -} - added
Input schema / properties / sortByAdded value: +{ + "description": "Field to sort results by", + "enum": [ + "createdAt", + "name", + "creator", + "status" + ], + "type": "string" +} - removed
Input schema / properties / sort_byRemoved value: -{ - "description": "Field to sort results by", - "enum": [ - "createdAt", - "name", - "creator", - "status" - ], - "type": "string" -} - added
Output schema / properties / hasMoreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / nextCursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +}
- Changed
list_tags4 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page.", + "maxLength": 8192, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / page / maximumAdded value: +20 - added
Output schema / properties / data / properties / hasMoreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / data / properties / nextCursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +}
- Changed
list_templates9 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Continue with the nextCursor from the previous result, keeping filters and limit unchanged. Do not combine with page.", + "maxLength": 8192, + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / limit / defaultRemoved value: -20 - removed
Input schema / properties / page / defaultRemoved value: -1 - added
Input schema / properties / page / descriptionAdded value: +"Page number (default 1). Prefer cursor." - added
Input schema / properties / page / maximumAdded value: +20 - added
Output schema / properties / hasMoreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / nextCursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Pass back as cursor, with the same filters and limit." +} - removed
Output schema / properties / paginationRemoved value: -{ - "additionalProperties": false, - "properties": { - "hasMore": { - "type": "boolean" - }, - "limit": { - "type": "integer" - }, - "page": { - "type": "integer" - }, - "total": { - "type": "integer" - }, - "totalPages": { - "type": "integer" - } - }, - "required": [ - "page", - "limit", - "total", - "totalPages", - "hasMore" - ], - "type": "object" -} - changed
Output schema / requiredPrevious value: -[ - "templates", - "pagination" -]New value: +[ + "templates", + "hasMore", + "nextCursor" +]
- Changed
mcp_feedback10 fields changed- added
Input schema / properties / actualBehaviorAdded value: +{ + "description": "What actually happened", + "maxLength": 1000, + "type": "string" +} - removed
Input schema / properties / actual_behaviorRemoved value: -{ - "description": "What actually happened", - "maxLength": 1000, - "type": "string" -} - added
Input schema / properties / errorMessageAdded value: +{ + "description": "The specific error message or text received", + "maxLength": 1000, + "type": "string" +} - removed
Input schema / properties / error_messageRemoved value: -{ - "description": "The specific error message or text received", - "maxLength": 1000, - "type": "string" -} - added
Input schema / properties / expectedBehaviorAdded value: +{ + "description": "What was expected to happen", + "maxLength": 1000, + "type": "string" +} - removed
Input schema / properties / expected_behaviorRemoved value: -{ - "description": "What was expected to happen", - "maxLength": 1000, - "type": "string" -} - added
Input schema / properties / stepsToReproduceAdded value: +{ + "description": "Steps to reproduce the issue", + "maxLength": 1000, + "type": "string" +} - removed
Input schema / properties / steps_to_reproduceRemoved value: -{ - "description": "Steps to reproduce the issue", - "maxLength": 1000, - "type": "string" -} - added
Input schema / properties / toolNameAdded value: +{ + "description": "Name of the PickFu MCP tool involved (e.g., 'save_survey', 'build_poll_url')", + "maxLength": 100, + "type": "string" +} - removed
Input schema / properties / tool_nameRemoved value: -{ - "description": "Name of the PickFu MCP tool involved (e.g., 'save_survey', 'build_poll_url')", - "maxLength": 100, - "type": "string" -}
- Changed
mini_poll8 fields changed- added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - added
Input schema / properties / operationIdAdded value: +{ + "description": "Omit to prepare publication without consuming allowance. Confirm using the returned operationId.", + "maxLength": 255, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / questions / items / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - added
Input schema / properties / questions / items / properties / options / items / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - changed
Input schema / properties / questions / items / properties / options / items / properties / mockup / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": true, - "description": "A mockup template, such as an App Store page or Amazon search results, shown for a text option. Set the option's value too. Every option of the question names the same template. On an update, leaving mockup out, or sending it back as get_survey returns it, keeps the page.", - "properties": { - "import": { - "additionalProperties": false, - "description": "A store listing that fills the template's values when the survey is saved, for templates whose importSources list the store. values sent beside it win, so put fields the store lacks there, such as an App Store subtitle, or an Amazon result's sponsored, badge, delivery and list_price. The option's value stays its text. An amazon import fills only the user's own product, never competitors, and costs 5 platform credits per distinct listing, charged only once the survey saves; an apple import is not charged.", - "properties": { - "country": { - "description": "Storefront or Amazon marketplace to read when the link names none. Defaults to the survey's country where the store serves it, else the US.", - "pattern": "^[A-Za-z]{2}$", - "type": "string" - }, - "id": { - "description": "The listing. For apple: an App Store link such as https://apps.apple.com/us/app/name/id123456789, or the number after \"id\". For amazon: an Amazon product link such as https://www.amazon.com/dp/B08BFFG82B, or its 10-character ASIN.", - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "source": { - "description": "The store, from the template's importSources in list_mockup_templates: apple for the App Store page, amazon for Amazon search results.", - "enum": [ - "apple", - "amazon" - ], - "type": "string" - } - }, - "required": [ - "source", - "id" - ], - "type": "object" - }, - "template": { - "description": "lookupKey of a template from list_mockup_templates, such as app-store-page or amazon-search.", - "minLength": 1, - "type": "string" - }, - "values": { - "additionalProperties": {}, - "description": "The template's values, matching its valuesSchema from list_mockup_templates. Leave out the display field: the option's value fills it. Images are https URLs.", - "type": "object" - } - }, - "required": [ - "template" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Amazon product listing mockup. Include image or title; generate_image can create the image for a hypothetical/custom product.", - "properties": { - "currency": { - "description": "Currency code (e.g. USD)", - "type": "string" - }, - "image": { - "description": "Product image URL. For a hypothetical/custom product, use the image_url returned by generate_image.", - "format": "uri", - "type": "string" - }, - "numRatings": { - "description": "Number of ratings", - "type": "number" - }, - "price": { - "description": "Product price", - "type": "number" - }, - "reviewScore": { - "description": "Review score (e.g. 4.5)", - "type": "number" - }, - "title": { - "description": "Product title", - "type": "string" - }, - "type": { - "description": "Mockup type: serp (search results) or listing (product page)", - "enum": [ - "serp", - "listing" - ], - "type": "string" - } - }, - "type": "object" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "additionalProperties": true, + "description": "A mockup template, such as an App Store page or Amazon search results, shown for a text option. Set the option's value too. Every option of the question names the same template. On an update, leaving mockup out, or sending it back as get_survey returns it, keeps the page.", + "properties": { + "import": { + "additionalProperties": false, + "description": "A store listing that fills the template's values when the survey is saved, for templates whose importSources list the store. values sent beside it win, so put fields the store lacks there, such as an App Store subtitle, or an Amazon result's sponsored, badge, delivery and listPrice. The option's value stays its text. An amazon import fills only the user's own product, never competitors.", + "properties": { + "country": { + "description": "Storefront or Amazon marketplace to read when the link names none. Defaults to the survey's country where the store serves it, else the US.", + "pattern": "^[A-Za-z]{2}$", + "type": "string" + }, + "id": { + "description": "The listing. For apple: an App Store link such as https://apps.apple.com/us/app/name/id123456789, or the number after \"id\". For amazon: an Amazon product link such as https://www.amazon.com/dp/B08BFFG82B, or its 10-character ASIN.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "source": { + "description": "The store, from the template's importSources in list_mockup_templates: apple for the App Store page, amazon for Amazon search results.", + "enum": [ + "apple", + "amazon" + ], + "type": "string" + } + }, + "required": [ + "source", + "id" + ], + "type": "object" + }, + "template": { + "description": "lookupKey of a template from list_mockup_templates, such as app-store-page or amazon-search.", + "minLength": 1, + "type": "string" + }, + "values": { + "additionalProperties": {}, + "description": "The template's values, matching its valuesSchema from list_mockup_templates. Leave out the display field: the option's value fills it. Images are https URLs.", + "type": "object" + } + }, + "required": [ + "template" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Amazon product listing mockup. Include image or title; generate_image can create the image for a hypothetical/custom product.", + "properties": { + "currency": { + "description": "Currency code (e.g. USD)", + "type": "string" + }, + "image": { + "description": "Product image URL. For a hypothetical/custom product, use the image_url returned by generate_image.", + "format": "uri", + "type": "string" + }, + "numRatings": { + "description": "Number of ratings", + "type": "number" + }, + "price": { + "description": "Product price", + "type": "number" + }, + "reviewScore": { + "description": "Review score (e.g. 4.5)", + "type": "number" + }, + "title": { + "description": "Product title", + "type": "string" + }, + "type": { + "description": "Mockup type: serp (search results) or listing (product page)", + "enum": [ + "serp", + "listing" + ], + "type": "string" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / questions / items / properties / variantAdded value: +{ + "description": "Persisted question variant from get_survey. Preserve it when editing.", + "maxLength": 100, + "type": "string" +} - added
Output schema / properties / operationIdAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "success", - "action", - "id", - "url", - "status" -]New value: +[ + "status" +]
- Changed
pin_response6 fields changed- added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - added
Input schema / properties / responseIdAdded value: +{ + "description": "The unique identifier (GUID) of the response to pin or unpin", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "type": "string" +} - removed
Input schema / properties / response_idRemoved value: -{ - "description": "The unique identifier (GUID) of the response to pin or unpin", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "type": "string" -} - added
Input schema / properties / surveyIdAdded value: +{ + "description": "The unique identifier (GUID) of the survey containing the response", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "type": "string" +} - removed
Input schema / properties / survey_idRemoved value: -{ - "description": "The unique identifier (GUID) of the survey containing the response", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "survey_id", - "response_id", - "pinned" -]New value: +[ + "surveyId", + "responseId", + "pinned" +]
- Changed
publish_survey17 fields changed- added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - added
Input schema / properties / operationIdAdded value: +{ + "description": "Stable operation id. Omit to prepare without spending; supply it on the confirmed execution and reuse it after uncertain responses.", + "maxLength": 255, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / quoteTokenAdded value: +{ + "description": "The quote from preparation. Changed quotes require fresh consent.", + "minLength": 1, + "type": "string" +} - added
Output schema / properties / accountAdded value: +{ + "type": "string" +} - added
Output schema / properties / alreadyPublishedAdded value: +{ + "type": "boolean" +} - removed
Output schema / properties / cost / additionalPropertiesRemoved value: -{} - added
Output schema / properties / cost / anyOfAdded value: +[ + { + "additionalProperties": {}, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / cost / typeRemoved value: -"object" - added
Output schema / properties / data / properties / questions / items / properties / loadedResponseCountAdded value: +{ + "type": "number" +} - added
Output schema / properties / data / properties / questions / items / properties / responsesLoadedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / data / properties / randomizeOptionsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / noteAdded value: +{ + "type": "string" +} - added
Output schema / properties / operationIdAdded value: +{ + "type": "string" +} - added
Output schema / properties / paymentAdded value: +{ + "additionalProperties": true, + "properties": { + "orderId": { + "type": "string" + }, + "status": { + "const": "paid", + "type": "string" + } + }, + "required": [ + "status", + "orderId" + ], + "type": "object" +} - added
Output schema / properties / quoteTokenAdded value: +{ + "type": "string" +} - added
Output schema / properties / statusAdded value: +{ + "const": "prepared", + "type": "string" +} - added
Output schema / properties / surveyIdAdded value: +{ + "type": "string" +}
- Changed
rate_response5 fields changed- added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - added
Input schema / properties / responseIdAdded value: +{ + "description": "The response ID (GUID) returned in the `id` field of get_survey_responses.", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "type": "string" +} - removed
Input schema / properties / response_idRemoved value: -{ - "description": "The response ID (GUID) returned in the `id` field of get_survey_responses.", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "type": "string" -} - added
Input schema / properties / surveyIdAdded value: +{ + "description": "The parent survey id returned with this response.", + "minLength": 1, + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "response_id", - "rating" -]New value: +[ + "surveyId", + "responseId", + "rating" +]
- Changed
save_project9 fields changed- added
Input schema / properties / description / anyOfAdded value: +[ + { + "maxLength": 5000, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / description / descriptionPrevious value: -"Project description"New value: +"Project description; null clears it." - removed
Input schema / properties / description / maxLengthRemoved value: -5000 - removed
Input schema / properties / description / typeRemoved value: -"string" - added
Input schema / properties / goal / anyOfAdded value: +[ + { + "maxLength": 5000, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / goal / descriptionPrevious value: -"Project goal (update only)"New value: +"Project goal (update only); null clears it." - removed
Input schema / properties / goal / maxLengthRemoved value: -5000 - removed
Input schema / properties / goal / typeRemoved value: -"string" - added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +}
- Changed
save_survey23 fields changed- added
Input schema / properties / externalIdAdded value: +{ + "maxLength": 255, + "type": "string" +} - added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - added
Input schema / properties / ownAudienceAdded value: +{ + "additionalProperties": false, + "properties": { + "askDemographics": { + "type": "boolean" + }, + "requireEmail": { + "type": "boolean" + } + }, + "required": [ + "requireEmail", + "askDemographics" + ], + "type": "object" +} - added
Input schema / properties / projectIdsAdded value: +{ + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 50, + "type": "array" +} - added
Input schema / properties / questions / items / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - added
Input schema / properties / questions / items / properties / options / items / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - changed
Input schema / properties / questions / items / properties / options / items / properties / mockup / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": true, - "description": "A mockup template, such as an App Store page or Amazon search results, shown for a text option. Set the option's value too. Every option of the question names the same template. On an update, leaving mockup out, or sending it back as get_survey returns it, keeps the page.", - "properties": { - "import": { - "additionalProperties": false, - "description": "A store listing that fills the template's values when the survey is saved, for templates whose importSources list the store. values sent beside it win, so put fields the store lacks there, such as an App Store subtitle, or an Amazon result's sponsored, badge, delivery and list_price. The option's value stays its text. An amazon import fills only the user's own product, never competitors, and costs 5 platform credits per distinct listing, charged only once the survey saves; an apple import is not charged.", - "properties": { - "country": { - "description": "Storefront or Amazon marketplace to read when the link names none. Defaults to the survey's country where the store serves it, else the US.", - "pattern": "^[A-Za-z]{2}$", - "type": "string" - }, - "id": { - "description": "The listing. For apple: an App Store link such as https://apps.apple.com/us/app/name/id123456789, or the number after \"id\". For amazon: an Amazon product link such as https://www.amazon.com/dp/B08BFFG82B, or its 10-character ASIN.", - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "source": { - "description": "The store, from the template's importSources in list_mockup_templates: apple for the App Store page, amazon for Amazon search results.", - "enum": [ - "apple", - "amazon" - ], - "type": "string" - } - }, - "required": [ - "source", - "id" - ], - "type": "object" - }, - "template": { - "description": "lookupKey of a template from list_mockup_templates, such as app-store-page or amazon-search.", - "minLength": 1, - "type": "string" - }, - "values": { - "additionalProperties": {}, - "description": "The template's values, matching its valuesSchema from list_mockup_templates. Leave out the display field: the option's value fills it. Images are https URLs.", - "type": "object" - } - }, - "required": [ - "template" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Amazon product listing mockup. Include image or title; generate_image can create the image for a hypothetical/custom product.", - "properties": { - "currency": { - "description": "Currency code (e.g. USD)", - "type": "string" - }, - "image": { - "description": "Product image URL. For a hypothetical/custom product, use the image_url returned by generate_image.", - "format": "uri", - "type": "string" - }, - "numRatings": { - "description": "Number of ratings", - "type": "number" - }, - "price": { - "description": "Product price", - "type": "number" - }, - "reviewScore": { - "description": "Review score (e.g. 4.5)", - "type": "number" - }, - "title": { - "description": "Product title", - "type": "string" - }, - "type": { - "description": "Mockup type: serp (search results) or listing (product page)", - "enum": [ - "serp", - "listing" - ], - "type": "string" - } - }, - "type": "object" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "additionalProperties": true, + "description": "A mockup template, such as an App Store page or Amazon search results, shown for a text option. Set the option's value too. Every option of the question names the same template. On an update, leaving mockup out, or sending it back as get_survey returns it, keeps the page.", + "properties": { + "import": { + "additionalProperties": false, + "description": "A store listing that fills the template's values when the survey is saved, for templates whose importSources list the store. values sent beside it win, so put fields the store lacks there, such as an App Store subtitle, or an Amazon result's sponsored, badge, delivery and listPrice. The option's value stays its text. An amazon import fills only the user's own product, never competitors.", + "properties": { + "country": { + "description": "Storefront or Amazon marketplace to read when the link names none. Defaults to the survey's country where the store serves it, else the US.", + "pattern": "^[A-Za-z]{2}$", + "type": "string" + }, + "id": { + "description": "The listing. For apple: an App Store link such as https://apps.apple.com/us/app/name/id123456789, or the number after \"id\". For amazon: an Amazon product link such as https://www.amazon.com/dp/B08BFFG82B, or its 10-character ASIN.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "source": { + "description": "The store, from the template's importSources in list_mockup_templates: apple for the App Store page, amazon for Amazon search results.", + "enum": [ + "apple", + "amazon" + ], + "type": "string" + } + }, + "required": [ + "source", + "id" + ], + "type": "object" + }, + "template": { + "description": "lookupKey of a template from list_mockup_templates, such as app-store-page or amazon-search.", + "minLength": 1, + "type": "string" + }, + "values": { + "additionalProperties": {}, + "description": "The template's values, matching its valuesSchema from list_mockup_templates. Leave out the display field: the option's value fills it. Images are https URLs.", + "type": "object" + } + }, + "required": [ + "template" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Amazon product listing mockup. Include image or title; generate_image can create the image for a hypothetical/custom product.", + "properties": { + "currency": { + "description": "Currency code (e.g. USD)", + "type": "string" + }, + "image": { + "description": "Product image URL. For a hypothetical/custom product, use the image_url returned by generate_image.", + "format": "uri", + "type": "string" + }, + "numRatings": { + "description": "Number of ratings", + "type": "number" + }, + "price": { + "description": "Product price", + "type": "number" + }, + "reviewScore": { + "description": "Review score (e.g. 4.5)", + "type": "number" + }, + "title": { + "description": "Product title", + "type": "string" + }, + "type": { + "description": "Mockup type: serp (search results) or listing (product page)", + "enum": [ + "serp", + "listing" + ], + "type": "string" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } +] - added
Input schema / properties / questions / items / properties / variantAdded value: +{ + "description": "Persisted question variant from get_survey. Preserve it when editing.", + "maxLength": 100, + "type": "string" +} - added
Input schema / properties / randomizeOptionsAdded value: +{ + "description": "Randomize respondent options (default true). False uses builder label order. SERP stays fixed; question order and rating scales are unchanged. Omit on update to preserve the saved value. Drafts only.", + "type": "boolean" +} - added
Input schema / properties / responseSourceAdded value: +{ + "enum": [ + "panel", + "own" + ], + "type": "string" +} - added
Input schema / properties / sampleSize / anyOfAdded value: +[ + { + "pattern": "^[1-9]\\d*$", + "type": "string" + }, + { + "exclusiveMinimum": 0, + "type": "integer" + } +] - removed
Input schema / properties / sampleSize / descriptionRemoved value: -"Audience size to order, as a string. Valid values depend on question type: standard surveys support \"15\", \"30\", \"50\", \"75\", \"100\", \"200\", \"300\", \"500\"; screen_recording surveys also support the smaller sizes \"5\", \"10\", \"20\", \"25\" and have a maximum of \"75\". Arbitrary in-between amounts are not real sizes and are rejected." - removed
Input schema / properties / sampleSize / enumRemoved value: -[ - "5", - "10", - "15", - "20", - "25", - "30", - "50", - "75", - "100", - "200", - "300", - "500" -] - removed
Input schema / properties / sampleSize / typeRemoved value: -"string" - added
Input schema / properties / tagIdsAdded value: +{ + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "type": "array" +} - added
Input schema / properties / tags / items / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +} - changed
Input schema / properties / template / properties / options / items / properties / mockup / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": true, - "description": "A mockup template, such as an App Store page or Amazon search results, shown for a text option. Set the option's value too. Every option of the question names the same template. On an update, leaving mockup out, or sending it back as get_survey returns it, keeps the page.", - "properties": { - "import": { - "additionalProperties": false, - "description": "A store listing that fills the template's values when the survey is saved, for templates whose importSources list the store. values sent beside it win, so put fields the store lacks there, such as an App Store subtitle, or an Amazon result's sponsored, badge, delivery and list_price. The option's value stays its text. An amazon import fills only the user's own product, never competitors, and costs 5 platform credits per distinct listing, charged only once the survey saves; an apple import is not charged.", - "properties": { - "country": { - "description": "Storefront or Amazon marketplace to read when the link names none. Defaults to the survey's country where the store serves it, else the US.", - "pattern": "^[A-Za-z]{2}$", - "type": "string" - }, - "id": { - "description": "The listing. For apple: an App Store link such as https://apps.apple.com/us/app/name/id123456789, or the number after \"id\". For amazon: an Amazon product link such as https://www.amazon.com/dp/B08BFFG82B, or its 10-character ASIN.", - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "source": { - "description": "The store, from the template's importSources in list_mockup_templates: apple for the App Store page, amazon for Amazon search results.", - "enum": [ - "apple", - "amazon" - ], - "type": "string" - } - }, - "required": [ - "source", - "id" - ], - "type": "object" - }, - "template": { - "description": "lookupKey of a template from list_mockup_templates, such as app-store-page or amazon-search.", - "minLength": 1, - "type": "string" - }, - "values": { - "additionalProperties": {}, - "description": "The template's values, matching its valuesSchema from list_mockup_templates. Leave out the display field: the option's value fills it. Images are https URLs.", - "type": "object" - } - }, - "required": [ - "template" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Amazon product listing mockup. Include image or title; generate_image can create the image for a hypothetical/custom product.", - "properties": { - "currency": { - "description": "Currency code (e.g. USD)", - "type": "string" - }, - "image": { - "description": "Product image URL. For a hypothetical/custom product, use the image_url returned by generate_image.", - "format": "uri", - "type": "string" - }, - "numRatings": { - "description": "Number of ratings", - "type": "number" - }, - "price": { - "description": "Product price", - "type": "number" - }, - "reviewScore": { - "description": "Review score (e.g. 4.5)", - "type": "number" - }, - "title": { - "description": "Product title", - "type": "string" - }, - "type": { - "description": "Mockup type: serp (search results) or listing (product page)", - "enum": [ - "serp", - "listing" - ], - "type": "string" - } - }, - "type": "object" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "additionalProperties": true, + "description": "A mockup template, such as an App Store page or Amazon search results, shown for a text option. Set the option's value too. Every option of the question names the same template. On an update, leaving mockup out, or sending it back as get_survey returns it, keeps the page.", + "properties": { + "import": { + "additionalProperties": false, + "description": "A store listing that fills the template's values when the survey is saved, for templates whose importSources list the store. values sent beside it win, so put fields the store lacks there, such as an App Store subtitle, or an Amazon result's sponsored, badge, delivery and listPrice. The option's value stays its text. An amazon import fills only the user's own product, never competitors.", + "properties": { + "country": { + "description": "Storefront or Amazon marketplace to read when the link names none. Defaults to the survey's country where the store serves it, else the US.", + "pattern": "^[A-Za-z]{2}$", + "type": "string" + }, + "id": { + "description": "The listing. For apple: an App Store link such as https://apps.apple.com/us/app/name/id123456789, or the number after \"id\". For amazon: an Amazon product link such as https://www.amazon.com/dp/B08BFFG82B, or its 10-character ASIN.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "source": { + "description": "The store, from the template's importSources in list_mockup_templates: apple for the App Store page, amazon for Amazon search results.", + "enum": [ + "apple", + "amazon" + ], + "type": "string" + } + }, + "required": [ + "source", + "id" + ], + "type": "object" + }, + "template": { + "description": "lookupKey of a template from list_mockup_templates, such as app-store-page or amazon-search.", + "minLength": 1, + "type": "string" + }, + "values": { + "additionalProperties": {}, + "description": "The template's values, matching its valuesSchema from list_mockup_templates. Leave out the display field: the option's value fills it. Images are https URLs.", + "type": "object" + } + }, + "required": [ + "template" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Amazon product listing mockup. Include image or title; generate_image can create the image for a hypothetical/custom product.", + "properties": { + "currency": { + "description": "Currency code (e.g. USD)", + "type": "string" + }, + "image": { + "description": "Product image URL. For a hypothetical/custom product, use the image_url returned by generate_image.", + "format": "uri", + "type": "string" + }, + "numRatings": { + "description": "Number of ratings", + "type": "number" + }, + "price": { + "description": "Product price", + "type": "number" + }, + "reviewScore": { + "description": "Review score (e.g. 4.5)", + "type": "number" + }, + "title": { + "description": "Product title", + "type": "string" + }, + "type": { + "description": "Mockup type: serp (search results) or listing (product page)", + "enum": [ + "serp", + "listing" + ], + "type": "string" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } +] - removed
Output schema / properties / cost / additionalPropertiesRemoved value: -{} - added
Output schema / properties / cost / anyOfAdded value: +[ + { + "additionalProperties": {}, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / cost / typeRemoved value: -"object" - added
Output schema / properties / data / properties / questions / items / properties / loadedResponseCountAdded value: +{ + "type": "number" +} - added
Output schema / properties / data / properties / questions / items / properties / responsesLoadedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / data / properties / randomizeOptionsAdded value: +{ + "type": "boolean" +}
- Changed
stop_survey1 field changed- added
Input schema / properties / idNamespaceAdded value: +{ + "description": "Identifier namespace. Omit for historical/canonical lookup; choose canonical or legacyGuid to disambiguate an owned collision. legacyNumber uses a positive decimal database id.", + "enum": [ + "canonical", + "legacyGuid", + "legacyNumber", + "unclassified" + ], + "type": "string" +}
- Changed
upload_media2 fields changed- added
Input schema / properties / resourceTypeAdded value: +{ + "description": "Whether the media is an image or video. Defaults to auto-detection. Explicitly set \"video\" for MP4, MOV, WebM, AVI, WMV files if auto-detection fails.", + "enum": [ + "image", + "video" + ], + "type": "string" +} - removed
Input schema / properties / resource_typeRemoved value: -{ - "description": "Whether the media is an image or video. Defaults to auto-detection. Explicitly set \"video\" for MP4, MOV, WebM, AVI, WMV files if auto-detection fails.", - "enum": [ - "image", - "video" - ], - "type": "string" -}
2 tool updates
- Added
semantic_search_answers - Added
semantic_search_surveys
1 tool update
- Changed
mini_poll1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "action": { + "enum": [ + "create", + "update", + "publish" + ], + "type": "string" + }, + "id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "url": { + "type": "string" + } + }, + "required": [ + "success", + "action", + "id", + "url", + "status" + ], + "type": "object" +}
2 tool updates
- Changed
get_synthetic_feedback4 fields changed- changed
Input schema / properties / question / descriptionPrevious value: -"Single-concept (concept: \"single\") ONLY, and REQUIRED there: the ONE open-ended question every sampled synthetic panelist answers about the concept. Pass the user's question verbatim — it is stored and asked exactly as written. Do not pass it for comparisons."New value: +"Single-concept (concept: \"single\") ONLY, and REQUIRED there: the ONE open-ended question every sampled synthetic respondent answers about the concept. Pass the user's question verbatim — it is stored and asked exactly as written. Do not pass it for comparisons." - changed
Input schema / properties / sampleSize / descriptionPrevious value: -"How many synthetic panelists answer (default 30, cap 75 on every panel, general-audience panels included); the server lowers a larger value to the panel's respondent count. Larger = steadier results and a longer wait; there is no charge until PickFu's new plans launch."New value: +"How many synthetic respondents answer (default 30, cap 75 on every panel, general-audience panels included); the server lowers a larger value to the panel's respondent count. Larger = steadier results and a longer wait; there is no charge until PickFu's new plans launch." - changed
Input schema / properties / textOptions / descriptionPrevious value: -"concept: \"multi\" only: 2-10 TEXT options to compare instead of option images (claims, product names, hero-copy candidates). Mutually exclusive with imageUrls — pass either 2+ option images or 2+ textOptions, never both. Synthetic panelists pick/rank among these texts: 2 → head-to-head, 3+ → ranked."New value: +"concept: \"multi\" only: 2-10 TEXT options to compare instead of option images (claims, product names, hero-copy candidates). Mutually exclusive with imageUrls — pass either 2+ option images or 2+ textOptions, never both. Synthetic respondents pick/rank among these texts: 2 → head-to-head, 3+ → ranked." - changed
Input schema / properties / userInput / descriptionPrevious value: -"The user's raw, verbatim request that prompted this brief — copy their actual words/message exactly as they wrote them, NOT your cleaned-up `description` or paraphrase. Recorded only for analytics on real user intent: it is never shown to the synthetic panelists and does not affect the research. Always include it whenever there is a real user message."New value: +"The user's raw, verbatim request that prompted this brief — copy their actual words/message exactly as they wrote them, NOT your cleaned-up `description` or paraphrase. Recorded only for analytics on real user intent: it is never shown to the synthetic respondents and does not affect the research. Always include it whenever there is a real user message."
- Changed
submit_synthetic_feedback1 field changed- changed
Input schema / properties / excludePollGuids / descriptionPrevious value: -"Optional, for benchmark or replay runs: the top-level `id` of each PickFu survey (from list_surveys or get_survey) that this request repeats, not a question id. The synthetic panelists are built from real respondents, so a synthetic panelist can hold its own answer to that survey. Every synthetic panelist's memory of these surveys is withheld for this run, so the run measures prediction, not recall. Applies to comparison and single-concept requests. Pass it on the first submit, and pass the same list on any later submit for this guid. The request does not store it: a later submit before the run completes starts more synthetic panelists, and they use only the list that the later call sends. Omit for ordinary research."New value: +"Optional, for benchmark or replay runs: the top-level `id` of each PickFu survey (from list_surveys or get_survey) that this request repeats, not a question id. The synthetic respondents are built from real respondents, so a synthetic respondent can hold its own answer to that survey. Every synthetic respondent's memory of these surveys is withheld for this run, so the run measures prediction, not recall. Applies to comparison and single-concept requests. Pass it on the first submit, and pass the same list on any later submit for this guid. The request does not store it: a later submit before the run completes starts more synthetic respondents, and they use only the list that the later call sends. Omit for ordinary research."
1 tool update
- Changed
get_synthetic_feedback1 field changed- changed
Input schema / properties / sampleSize / descriptionPrevious value: -"How many synthetic panelists answer (default 30, cap 75 on every panel, general-audience panels included); the server lowers a larger value to the panel's respondent count. Larger = steadier results, a longer wait, and more platform credits (10 per respondent for a comparison run, 20 for a single-concept run)."New value: +"How many synthetic panelists answer (default 30, cap 75 on every panel, general-audience panels included); the server lowers a larger value to the panel's respondent count. Larger = steadier results and a longer wait; there is no charge until PickFu's new plans launch."
5 tool updates
- Changed
get_synthetic_feedback4 fields changed- changed
Input schema / properties / question / descriptionPrevious value: -"Single-concept (concept: \"single\") ONLY, and REQUIRED there: the ONE open-ended question every sampled digital twin answers about the concept. Pass the user's question verbatim — it is stored and asked exactly as written. Do not pass it for comparisons."New value: +"Single-concept (concept: \"single\") ONLY, and REQUIRED there: the ONE open-ended question every sampled synthetic panelist answers about the concept. Pass the user's question verbatim — it is stored and asked exactly as written. Do not pass it for comparisons." - changed
Input schema / properties / sampleSize / descriptionPrevious value: -"How many digital twins answer (default 30, cap 75 on every panel, general-audience panels included); the server lowers a larger value to the panel's twin count. Larger = steadier results, more cost/time."New value: +"How many synthetic panelists answer (default 30, cap 75 on every panel, general-audience panels included); the server lowers a larger value to the panel's respondent count. Larger = steadier results, a longer wait, and more platform credits (10 per respondent for a comparison run, 20 for a single-concept run)." - changed
Input schema / properties / textOptions / descriptionPrevious value: -"concept: \"multi\" only: 2-10 TEXT options to compare instead of option images (claims, product names, hero-copy candidates). Mutually exclusive with imageUrls — pass either 2+ option images or 2+ textOptions, never both. Twins pick/rank among these texts: 2 → head-to-head, 3+ → ranked."New value: +"concept: \"multi\" only: 2-10 TEXT options to compare instead of option images (claims, product names, hero-copy candidates). Mutually exclusive with imageUrls — pass either 2+ option images or 2+ textOptions, never both. Synthetic panelists pick/rank among these texts: 2 → head-to-head, 3+ → ranked." - changed
Input schema / properties / userInput / descriptionPrevious value: -"The user's raw, verbatim request that prompted this brief — copy their actual words/message exactly as they wrote them, NOT your cleaned-up `description` or paraphrase. Recorded only for analytics on real user intent: it is never shown to the twins and does not affect the research. Always include it whenever there is a real user message."New value: +"The user's raw, verbatim request that prompted this brief — copy their actual words/message exactly as they wrote them, NOT your cleaned-up `description` or paraphrase. Recorded only for analytics on real user intent: it is never shown to the synthetic panelists and does not affect the research. Always include it whenever there is a real user message."
- Changed
list_mockup_templates2 fields changed- changed
Output schema / properties / templates / items / properties / category / descriptionPrevious value: -"The store the template looks like, such as apple."New value: +"The store the template looks like, such as apple or amazon." - added
Output schema / properties / templates / items / properties / questionTypesAdded value: +{ + "description": "The question types the template goes on, such as click_test. save_survey refuses it on a question of any other type.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
mini_poll2 fields changed- changed
Input schema / properties / questions / items / properties / options / items / properties / mockup / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": true, - "description": "A mockup template, such as an App Store page, shown for a text option. Set the option's value too. Every option of the question names the same template. On an update, leaving mockup out, or sending it back as get_survey returns it, keeps the page.", - "properties": { - "import": { - "additionalProperties": false, - "description": "A store listing that fills the template's values when the survey is saved, for templates whose importSources list the store. values sent beside it win, so put fields the store lacks, such as an App Store subtitle, there. The option's value stays its text.", - "properties": { - "country": { - "description": "Storefront to read when the link names none. Defaults to the survey's country.", - "pattern": "^[A-Za-z]{2}$", - "type": "string" - }, - "id": { - "description": "The app: an App Store link such as https://apps.apple.com/us/app/name/id123456789, or the number after \"id\".", - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "source": { - "description": "The store, from the template's importSources in list_mockup_templates.", - "enum": [ - "apple" - ], - "type": "string" - } - }, - "required": [ - "source", - "id" - ], - "type": "object" - }, - "template": { - "description": "lookupKey of a template from list_mockup_templates, such as app-store-page.", - "minLength": 1, - "type": "string" - }, - "values": { - "additionalProperties": {}, - "description": "The template's values, matching its valuesSchema from list_mockup_templates. Leave out the display field: the option's value fills it. Images are https URLs.", - "type": "object" - } - }, - "required": [ - "template" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Amazon product listing mockup. Include image or title; generate_image can create the image for a hypothetical/custom product.", - "properties": { - "currency": { - "description": "Currency code (e.g. USD)", - "type": "string" - }, - "image": { - "description": "Product image URL. For a hypothetical/custom product, use the image_url returned by generate_image.", - "format": "uri", - "type": "string" - }, - "numRatings": { - "description": "Number of ratings", - "type": "number" - }, - "price": { - "description": "Product price", - "type": "number" - }, - "reviewScore": { - "description": "Review score (e.g. 4.5)", - "type": "number" - }, - "title": { - "description": "Product title", - "type": "string" - }, - "type": { - "description": "Mockup type: serp (search results) or listing (product page)", - "enum": [ - "serp", - "listing" - ], - "type": "string" - } - }, - "type": "object" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "additionalProperties": true, + "description": "A mockup template, such as an App Store page or Amazon search results, shown for a text option. Set the option's value too. Every option of the question names the same template. On an update, leaving mockup out, or sending it back as get_survey returns it, keeps the page.", + "properties": { + "import": { + "additionalProperties": false, + "description": "A store listing that fills the template's values when the survey is saved, for templates whose importSources list the store. values sent beside it win, so put fields the store lacks there, such as an App Store subtitle, or an Amazon result's sponsored, badge, delivery and list_price. The option's value stays its text. An amazon import fills only the user's own product, never competitors, and costs 5 platform credits per distinct listing, charged only once the survey saves; an apple import is not charged.", + "properties": { + "country": { + "description": "Storefront or Amazon marketplace to read when the link names none. Defaults to the survey's country where the store serves it, else the US.", + "pattern": "^[A-Za-z]{2}$", + "type": "string" + }, + "id": { + "description": "The listing. For apple: an App Store link such as https://apps.apple.com/us/app/name/id123456789, or the number after \"id\". For amazon: an Amazon product link such as https://www.amazon.com/dp/B08BFFG82B, or its 10-character ASIN.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "source": { + "description": "The store, from the template's importSources in list_mockup_templates: apple for the App Store page, amazon for Amazon search results.", + "enum": [ + "apple", + "amazon" + ], + "type": "string" + } + }, + "required": [ + "source", + "id" + ], + "type": "object" + }, + "template": { + "description": "lookupKey of a template from list_mockup_templates, such as app-store-page or amazon-search.", + "minLength": 1, + "type": "string" + }, + "values": { + "additionalProperties": {}, + "description": "The template's values, matching its valuesSchema from list_mockup_templates. Leave out the display field: the option's value fills it. Images are https URLs.", + "type": "object" + } + }, + "required": [ + "template" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Amazon product listing mockup. Include image or title; generate_image can create the image for a hypothetical/custom product.", + "properties": { + "currency": { + "description": "Currency code (e.g. USD)", + "type": "string" + }, + "image": { + "description": "Product image URL. For a hypothetical/custom product, use the image_url returned by generate_image.", + "format": "uri", + "type": "string" + }, + "numRatings": { + "description": "Number of ratings", + "type": "number" + }, + "price": { + "description": "Product price", + "type": "number" + }, + "reviewScore": { + "description": "Review score (e.g. 4.5)", + "type": "number" + }, + "title": { + "description": "Product title", + "type": "string" + }, + "type": { + "description": "Mockup type: serp (search results) or listing (product page)", + "enum": [ + "serp", + "listing" + ], + "type": "string" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } +] - changed
Input schema / properties / questions / items / properties / type / descriptionPrevious value: -"Question type. head_to_head: exactly 2 options. ranked/single_select/multi_select: 3-8 options. open_ended/emoji_rating/star_rating/screen_recording: 0-1 option. van_westendorp: no options. click_test/five_second_test: 1 image option. likert: Use 2–8 text statements as `options[].value`, no media or URLs. The `likertScale` presets are `agreement5`, `agreement7`, `frequency`, `satisfaction`; `agreement5` is the default on create, and omitting `likertScale` on an update preserves the question's existing scale rather than resetting it."New value: +"Question type. head_to_head: exactly 2 options. ranked/single_select/multi_select: 3-8 options. open_ended/emoji_rating/star_rating/screen_recording: 0-1 option. van_westendorp: no options. click_test/five_second_test: 1 image option, or 1 text option with a mockup template whose questionTypes include the type, such as amazon-search on click_test. likert: Use 2–8 text statements as `options[].value`, no media or URLs. The `likertScale` presets are `agreement5`, `agreement7`, `frequency`, `satisfaction`; `agreement5` is the default on create, and omitting `likertScale` on an update preserves the question's existing scale rather than resetting it."
- Changed
save_survey3 fields changed- changed
Input schema / properties / questions / items / properties / options / items / properties / mockup / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": true, - "description": "A mockup template, such as an App Store page, shown for a text option. Set the option's value too. Every option of the question names the same template. On an update, leaving mockup out, or sending it back as get_survey returns it, keeps the page.", - "properties": { - "import": { - "additionalProperties": false, - "description": "A store listing that fills the template's values when the survey is saved, for templates whose importSources list the store. values sent beside it win, so put fields the store lacks, such as an App Store subtitle, there. The option's value stays its text.", - "properties": { - "country": { - "description": "Storefront to read when the link names none. Defaults to the survey's country.", - "pattern": "^[A-Za-z]{2}$", - "type": "string" - }, - "id": { - "description": "The app: an App Store link such as https://apps.apple.com/us/app/name/id123456789, or the number after \"id\".", - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "source": { - "description": "The store, from the template's importSources in list_mockup_templates.", - "enum": [ - "apple" - ], - "type": "string" - } - }, - "required": [ - "source", - "id" - ], - "type": "object" - }, - "template": { - "description": "lookupKey of a template from list_mockup_templates, such as app-store-page.", - "minLength": 1, - "type": "string" - }, - "values": { - "additionalProperties": {}, - "description": "The template's values, matching its valuesSchema from list_mockup_templates. Leave out the display field: the option's value fills it. Images are https URLs.", - "type": "object" - } - }, - "required": [ - "template" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Amazon product listing mockup. Include image or title; generate_image can create the image for a hypothetical/custom product.", - "properties": { - "currency": { - "description": "Currency code (e.g. USD)", - "type": "string" - }, - "image": { - "description": "Product image URL. For a hypothetical/custom product, use the image_url returned by generate_image.", - "format": "uri", - "type": "string" - }, - "numRatings": { - "description": "Number of ratings", - "type": "number" - }, - "price": { - "description": "Product price", - "type": "number" - }, - "reviewScore": { - "description": "Review score (e.g. 4.5)", - "type": "number" - }, - "title": { - "description": "Product title", - "type": "string" - }, - "type": { - "description": "Mockup type: serp (search results) or listing (product page)", - "enum": [ - "serp", - "listing" - ], - "type": "string" - } - }, - "type": "object" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "additionalProperties": true, + "description": "A mockup template, such as an App Store page or Amazon search results, shown for a text option. Set the option's value too. Every option of the question names the same template. On an update, leaving mockup out, or sending it back as get_survey returns it, keeps the page.", + "properties": { + "import": { + "additionalProperties": false, + "description": "A store listing that fills the template's values when the survey is saved, for templates whose importSources list the store. values sent beside it win, so put fields the store lacks there, such as an App Store subtitle, or an Amazon result's sponsored, badge, delivery and list_price. The option's value stays its text. An amazon import fills only the user's own product, never competitors, and costs 5 platform credits per distinct listing, charged only once the survey saves; an apple import is not charged.", + "properties": { + "country": { + "description": "Storefront or Amazon marketplace to read when the link names none. Defaults to the survey's country where the store serves it, else the US.", + "pattern": "^[A-Za-z]{2}$", + "type": "string" + }, + "id": { + "description": "The listing. For apple: an App Store link such as https://apps.apple.com/us/app/name/id123456789, or the number after \"id\". For amazon: an Amazon product link such as https://www.amazon.com/dp/B08BFFG82B, or its 10-character ASIN.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "source": { + "description": "The store, from the template's importSources in list_mockup_templates: apple for the App Store page, amazon for Amazon search results.", + "enum": [ + "apple", + "amazon" + ], + "type": "string" + } + }, + "required": [ + "source", + "id" + ], + "type": "object" + }, + "template": { + "description": "lookupKey of a template from list_mockup_templates, such as app-store-page or amazon-search.", + "minLength": 1, + "type": "string" + }, + "values": { + "additionalProperties": {}, + "description": "The template's values, matching its valuesSchema from list_mockup_templates. Leave out the display field: the option's value fills it. Images are https URLs.", + "type": "object" + } + }, + "required": [ + "template" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Amazon product listing mockup. Include image or title; generate_image can create the image for a hypothetical/custom product.", + "properties": { + "currency": { + "description": "Currency code (e.g. USD)", + "type": "string" + }, + "image": { + "description": "Product image URL. For a hypothetical/custom product, use the image_url returned by generate_image.", + "format": "uri", + "type": "string" + }, + "numRatings": { + "description": "Number of ratings", + "type": "number" + }, + "price": { + "description": "Product price", + "type": "number" + }, + "reviewScore": { + "description": "Review score (e.g. 4.5)", + "type": "number" + }, + "title": { + "description": "Product title", + "type": "string" + }, + "type": { + "description": "Mockup type: serp (search results) or listing (product page)", + "enum": [ + "serp", + "listing" + ], + "type": "string" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } +] - changed
Input schema / properties / questions / items / properties / type / descriptionPrevious value: -"Question type. head_to_head: exactly 2 options. ranked/single_select/multi_select: 3-8 options. open_ended/emoji_rating/star_rating/screen_recording: 0-1 option. van_westendorp: no options. click_test/five_second_test: 1 image option. likert: Use 2–8 text statements as `options[].value`, no media or URLs. The `likertScale` presets are `agreement5`, `agreement7`, `frequency`, `satisfaction`; `agreement5` is the default on create, and omitting `likertScale` on an update preserves the question's existing scale rather than resetting it."New value: +"Question type. head_to_head: exactly 2 options. ranked/single_select/multi_select: 3-8 options. open_ended/emoji_rating/star_rating/screen_recording: 0-1 option. van_westendorp: no options. click_test/five_second_test: 1 image option, or 1 text option with a mockup template whose questionTypes include the type, such as amazon-search on click_test. likert: Use 2–8 text statements as `options[].value`, no media or URLs. The `likertScale` presets are `agreement5`, `agreement7`, `frequency`, `satisfaction`; `agreement5` is the default on create, and omitting `likertScale` on an update preserves the question's existing scale rather than resetting it." - changed
Input schema / properties / template / properties / options / items / properties / mockup / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": true, - "description": "A mockup template, such as an App Store page, shown for a text option. Set the option's value too. Every option of the question names the same template. On an update, leaving mockup out, or sending it back as get_survey returns it, keeps the page.", - "properties": { - "import": { - "additionalProperties": false, - "description": "A store listing that fills the template's values when the survey is saved, for templates whose importSources list the store. values sent beside it win, so put fields the store lacks, such as an App Store subtitle, there. The option's value stays its text.", - "properties": { - "country": { - "description": "Storefront to read when the link names none. Defaults to the survey's country.", - "pattern": "^[A-Za-z]{2}$", - "type": "string" - }, - "id": { - "description": "The app: an App Store link such as https://apps.apple.com/us/app/name/id123456789, or the number after \"id\".", - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "source": { - "description": "The store, from the template's importSources in list_mockup_templates.", - "enum": [ - "apple" - ], - "type": "string" - } - }, - "required": [ - "source", - "id" - ], - "type": "object" - }, - "template": { - "description": "lookupKey of a template from list_mockup_templates, such as app-store-page.", - "minLength": 1, - "type": "string" - }, - "values": { - "additionalProperties": {}, - "description": "The template's values, matching its valuesSchema from list_mockup_templates. Leave out the display field: the option's value fills it. Images are https URLs.", - "type": "object" - } - }, - "required": [ - "template" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Amazon product listing mockup. Include image or title; generate_image can create the image for a hypothetical/custom product.", - "properties": { - "currency": { - "description": "Currency code (e.g. USD)", - "type": "string" - }, - "image": { - "description": "Product image URL. For a hypothetical/custom product, use the image_url returned by generate_image.", - "format": "uri", - "type": "string" - }, - "numRatings": { - "description": "Number of ratings", - "type": "number" - }, - "price": { - "description": "Product price", - "type": "number" - }, - "reviewScore": { - "description": "Review score (e.g. 4.5)", - "type": "number" - }, - "title": { - "description": "Product title", - "type": "string" - }, - "type": { - "description": "Mockup type: serp (search results) or listing (product page)", - "enum": [ - "serp", - "listing" - ], - "type": "string" - } - }, - "type": "object" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "additionalProperties": true, + "description": "A mockup template, such as an App Store page or Amazon search results, shown for a text option. Set the option's value too. Every option of the question names the same template. On an update, leaving mockup out, or sending it back as get_survey returns it, keeps the page.", + "properties": { + "import": { + "additionalProperties": false, + "description": "A store listing that fills the template's values when the survey is saved, for templates whose importSources list the store. values sent beside it win, so put fields the store lacks there, such as an App Store subtitle, or an Amazon result's sponsored, badge, delivery and list_price. The option's value stays its text. An amazon import fills only the user's own product, never competitors, and costs 5 platform credits per distinct listing, charged only once the survey saves; an apple import is not charged.", + "properties": { + "country": { + "description": "Storefront or Amazon marketplace to read when the link names none. Defaults to the survey's country where the store serves it, else the US.", + "pattern": "^[A-Za-z]{2}$", + "type": "string" + }, + "id": { + "description": "The listing. For apple: an App Store link such as https://apps.apple.com/us/app/name/id123456789, or the number after \"id\". For amazon: an Amazon product link such as https://www.amazon.com/dp/B08BFFG82B, or its 10-character ASIN.", + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "source": { + "description": "The store, from the template's importSources in list_mockup_templates: apple for the App Store page, amazon for Amazon search results.", + "enum": [ + "apple", + "amazon" + ], + "type": "string" + } + }, + "required": [ + "source", + "id" + ], + "type": "object" + }, + "template": { + "description": "lookupKey of a template from list_mockup_templates, such as app-store-page or amazon-search.", + "minLength": 1, + "type": "string" + }, + "values": { + "additionalProperties": {}, + "description": "The template's values, matching its valuesSchema from list_mockup_templates. Leave out the display field: the option's value fills it. Images are https URLs.", + "type": "object" + } + }, + "required": [ + "template" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Amazon product listing mockup. Include image or title; generate_image can create the image for a hypothetical/custom product.", + "properties": { + "currency": { + "description": "Currency code (e.g. USD)", + "type": "string" + }, + "image": { + "description": "Product image URL. For a hypothetical/custom product, use the image_url returned by generate_image.", + "format": "uri", + "type": "string" + }, + "numRatings": { + "description": "Number of ratings", + "type": "number" + }, + "price": { + "description": "Product price", + "type": "number" + }, + "reviewScore": { + "description": "Review score (e.g. 4.5)", + "type": "number" + }, + "title": { + "description": "Product title", + "type": "string" + }, + "type": { + "description": "Mockup type: serp (search results) or listing (product page)", + "enum": [ + "serp", + "listing" + ], + "type": "string" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } +]
- Changed
submit_synthetic_feedback1 field changed- changed
Input schema / properties / excludePollGuids / descriptionPrevious value: -"Optional, for benchmark or replay runs: the top-level `id` of each PickFu survey (from list_surveys or get_survey) that this request repeats, not a question id. The digital twins are built from real respondents, so a twin can hold its own answer to that survey. Every twin's memory of these surveys is withheld for this run, so the run measures prediction, not recall. Applies to comparison and single-concept requests. Pass it on the first submit, and pass the same list on any later submit for this guid. The request does not store it: a later submit before the run completes starts more twins, and they use only the list that the later call sends. Omit for ordinary research."New value: +"Optional, for benchmark or replay runs: the top-level `id` of each PickFu survey (from list_surveys or get_survey) that this request repeats, not a question id. The synthetic panelists are built from real respondents, so a synthetic panelist can hold its own answer to that survey. Every synthetic panelist's memory of these surveys is withheld for this run, so the run measures prediction, not recall. Applies to comparison and single-concept requests. Pass it on the first submit, and pass the same list on any later submit for this guid. The request does not store it: a later submit before the run completes starts more synthetic panelists, and they use only the list that the later call sends. Omit for ordinary research."
7 tool updates
- Added
generate_report - Added
get_synthetic_feedback - Added
get_synthetic_feedback_results - Added
get_synthetic_playbook - Added
list_synthetic_audiences - Added
list_synthetic_feedback - Added
submit_synthetic_feedback
7 tool updates
- Removed
generate_report - Removed
get_synthetic_feedback - Removed
get_synthetic_feedback_results - Removed
get_synthetic_playbook - Removed
list_synthetic_audiences - Removed
list_synthetic_feedback - Removed
submit_synthetic_feedback
2 tool updates
- Added
generate_report - Added
lookup_listing
9 tool updates
- Removed
generate_report - Removed
get_report_writing_guide - Added
get_synthetic_feedback - Added
get_synthetic_feedback_results - Added
get_synthetic_playbook - Added
list_synthetic_audiences - Added
list_synthetic_feedback - Added
submit_synthetic_feedback - Removed
write_report
36 tool updates
- First observed
add_respondents - First observed
build_poll_url - First observed
check_upload - First observed
create_tag - First observed
delete_survey - First observed
discover_targeting - First observed
export_survey_results - First observed
extract_images - First observed
generate_image - First observed
generate_report - First observed
get_followup_answers - First observed
get_playbook - First observed
get_project - First observed
get_report_writing_guide - First observed
get_survey - First observed
get_survey_responses - First observed
get_template - First observed
help_center_search - First observed
list_available_reporting - First observed
list_available_targeting - First observed
list_mockup_templates - First observed
list_playbooks - First observed
list_projects - First observed
list_surveys - First observed
list_tags - First observed
list_templates - First observed
mcp_feedback - First observed
mini_poll - First observed
pin_response - First observed
publish_survey - First observed
rate_response - First observed
save_project - First observed
save_survey - First observed
stop_survey - First observed
upload_media - First observed
write_report
Related MCP Connectors
Test ideas, messages and ads with Human Digital Twins built from real people, in your AI assistant.
Synthetic audiences built from real people. Ask anyone anything before you decide.
Anonymous feedback from real people by voice or text, with an AI report. Flat price per campaign.
Ask fifty verified people a five-second question and see what they think.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceLets agents put a five-second question to fifty verified real people and get the split back, with tools to estimate cost and timing before spending, ask and cancel questions, add more heads, page through individual answers, target audiences and countries, and export results as CSV, PDF, or PNG.111 npm1MIT
- AlicenseAqualityDmaintenanceReal human judgment as agent tools -- an AI agent can ask a question and get back a structured, schema-validated JSON answer from a real quality-scored human. 16 response types (yes/no, ratings, rankings, A/B tests, sentiment, image/video/audio review, voice/video/photo capture). Fully programmatic signup with a $5 free trial credit, no card required.766 npmMIT
- AlicenseCqualityCmaintenanceRun real user interviews from AI agents and retrieve structured insights with themes and verbatim quotes.581 npm5MIT
- AlicenseAqualityBmaintenanceEnables AI agents to recruit real humans for evaluation tasks like surveys, A/B tests, and ratings on text, images, audio, and video, returning aggregated results directly into the conversation.137MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.