Skip to main content
Glama

Server Details

CrowdOS lets AI agents run synthetic focus groups over MCP against census-calibrated panels that disagree. MCP on every plan including Free.

Ownership verified
Status
Healthy
Uptime
82.3% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL
ChatGPT
–
Claude
–

TDQS

A4.2/5.0

Scored across 18 tools

Disambiguation4/5

The five study runners are explicitly contrasted (run_focus_group records sentiment, run_debate deliberates, compare_options ranks text, screen_creatives gives creative feedback, test_ads predicts feed CTR), and the read/utility tools (get_simulation vs list_simulations vs get_report_link vs share_study vs validate_study vs record_outcome) are cleanly separated. The one soft boundary is screen_creatives vs test_ads: both accept image/video URLs and both rank creatives, so an agent holding a single ad asset must reason from subtle cues (qualitative synthesis vs predicted click-through) to pick correctly.

Naming Consistency4/5

Almost every tool is a verb_noun snake_case name (run_focus_group, get_credits, preview_cost, cancel_simulation, validate_study), which makes the set highly predictable. The single deviation is crowd_sample, which is noun-first, though it stays within the same snake_case convention and remains unambiguous.

Tool Count4/5

18 tools is on the heavy side but is earned by genuinely distinct capabilities: five study modes plus cost preview, audience discovery, reach checking, results retrieval, listing, follow-up chat, sharing, validation, outcome recording, cancellation and billing. It sits just above the comfortable 3-15 band rather than sprawling arbitrarily.

Completeness5/5

The lifecycle is unusually complete: presets and reach estimation before a run, cost preview and confirmation, execution across five study types, cancellation with refund, retrieval and polling after timeouts, listing, follow-up chat, sharing, PDF/report links, real-world validation and outcome recording, plus wallet/credits. There are no obvious dead ends an agent would hit in normal research workflows.

Available Tools

18 tools
ask_followupAInspect

Ask a follow-up question about a completed study you ran: why a group disagreed, what drove a split, how to read a result. It is the study's moderator chat from the web app, answered from the study's own results; it fields no new respondents.

It works on the studies the web app offers a follow-up chat on: Pulse studies (run_focus_group, run_debate) and Screening Room Deep Reviews. On any other study (a compare, a Quick or Balanced screening, an Ads Labo test, a pricing or MaxDiff study) it returns error='not_supported' and charges nothing.

Priced as on the web: the first 10 questions on a study are free, then each question is charged to the account at the follow-up price. A Screening Room Deep Review (screen_creatives with comparison_tier='deep_research') is answered by its analyst chat instead, as on the web: 3 free questions, then the same price. When an organization pays for the account's studies, the account is not charged per question. On error='insufficient_funds', tell the user; the message says what the balance is.

Like the rest of your results, answers come as totals: they describe the panel and its groups and do not name or quote individual respondents. Individual answers are on the study's page in the web app.

Returns: { sim_id, answer, chat ('moderator' | 'screening_analyst'), charged_credits, questions_remaining_free, credits_per_question }.

NameRequiredDescriptionDefault
sim_idYesThe id of a completed study you ran.
questionYesYour question, up to 2,000 characters (1,000 on a Deep Review screening).

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it discloses pricing (10 free questions then per-question charge), org-level billing exemption, the 3-free-question Deep Review variant, the insufficient_funds error and required user messaging, and the aggregate/no-individual-quotes constraint on answers. This is exactly the cost, failure, and output-shape information an agent needs before invoking a billable tool.

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

Conciseness4/5

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

Four tight paragraphs that are front-loaded with the core purpose and then layered by eligibility, pricing, and return shape. A few phrases repeat ('as on the web', the Deep Review pricing restated) and the returns line duplicates information the agent could infer, keeping it just short of a 5.

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

Completeness5/5

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

No output schema exists, yet the description specifies the returned fields (sim_id, answer, chat, charged_credits, questions_remaining_free, credits_per_question) and the two chat modes. Combined with the error list and billing rules, an agent has everything needed to call this correctly and to explain the result to a user.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: sim_id must be a *completed* study of a supported type (with the supported set enumerated), and the question length limit differs for Deep Review screenings, which is also noted. Only minor duplication remains.

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

Purpose5/5

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

States a specific verb and resource ('ask a follow-up question about a completed study') and immediately scopes it as the study's moderator chat answered from the study's own results, not a new data collection. It is clearly distinguishable from siblings like run_focus_group, run_debate, and screen_creatives, which are named as the tools that produce the studies this one queries.

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

Usage Guidelines5/5

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

Explicitly enumerates where it works (Pulse studies from run_focus_group/run_debate, Screening Room Deep Reviews) and where it does not (compares, Quick/Balanced screening, Ads Labo, pricing, MaxDiff), including the exact failure mode error='not_supported' with no charge. It also routes Deep Review follow-ups to the analyst chat, giving the agent a clear alternative path.

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

cancel_simulationAInspect

Explicitly cancel a running simulation and refund the wallet reservation. Use when:

  • The user changes their mind mid-run

  • You realize the parameters were wrong (e.g., wrong audience, typo in topic)

  • A long-running debate is going off the rails

Closing the MCP session does NOT cancel the simulation — the run continues server-side and results land in the DB. Only call this if you genuinely want to stop the run AND refund the credits. Returns 409 if the sim is already terminal. Cancelling a re-run of a study that had already finished refunds the re-run only and keeps the study's earlier results (results_kept: true).

NameRequiredDescriptionDefault
sim_idYesThe id of the running simulation.

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden and does so well. It discloses the refund side effect, the 409 behavior for already-terminal simulations, the fact that closing the session does not stop the run, and the special re-run refund behavior with results_kept: true.

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

Conciseness5/5

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

The definition is front-loaded with the action and refund effect, then uses a short bullet list for usage conditions and a compact paragraph for edge cases. Every sentence adds operational value and there is no wasted prose.

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

Completeness5/5

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

For a single-parameter cancellation tool with no annotations or output schema, the description is complete enough. It covers the action, side effect, session-close misconception, error behavior, and re-run results behavior, leaving no major ambiguity for correct invocation.

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

Parameters3/5

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

The schema has 100% description coverage and already documents sim_id as the running simulation id. The description reinforces that the target is a running simulation but adds no syntax, format, or validation detail beyond the schema, so the baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource: cancel a running simulation and refund the wallet reservation. It also distinguishes this explicit cancellation from merely closing the MCP session, which is a critical scope distinction.

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

Usage Guidelines5/5

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

It gives explicit when-to-use scenarios such as user changes their mind, wrong parameters, or a debate going off the rails. It also gives a clear when-not-to-use warning: closing the session does not cancel, and the tool should only be called if the user genuinely wants to stop the run and refund credits.

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

compare_optionsAInspect

Run a simulated A/B (or A/B/C…) test (a Pulse compare) on text options. Each respondent reads every option and ranks them; you get a leaderboard with Borda scores and the winner, without individual answers. Use it for product descriptions, headlines, policy framings, slogans or value propositions.

RECOMMENDED FLOW: if the user didn't pick an audience, call list_demographic_presets and propose one or two; call preview_cost for the price; confirm with the user; then run. Studies are charged to the account's wallet at the same per-respondent rate as on the web.

Your plan allows up to 20 respondents per study (Free 20, Pro 500, Max 1,000). Your plan compares up to 3 options (Free 3, Pro 5, Max 10).

To show respondents an image with the question (a product photo, a chart, a screenshot), pass image_url: a public https link to it. To have them watch videos or look at images as creatives, use screen_creatives; to test an ad in the feed, use test_ads.

Returns: { id, status, mode='comparison', topic, demographic_preset, population_size, options, winner, leaderboard (first_place_votes, vote_pct, borda_score, borda_pct, scores {mean, n, positive_pct, neutral_pct, negative_pct} of each option's 0-10 scores), counted_agent_count, breakdowns (each option's first-choice share and mean score by age_band, gender, political_ideology, region and, where respondents carry their market's party lean, party), [undecided] (when respondents could choose none of the options: an election or referendum question, or undecided_option; each leaderboard row then adds decided_vote_pct), total_responses, billing }.

Read first-choice shares as a direction, beside each option's scores, not as a market share. WHEN IT MISLEADS: options described unevenly (one with its costs or limits spelled out, the others with strengths only; some priced, others not), or a panel of the whole market read as a survey of buyers. Pass the draft to preview_cost first: its brief_warnings flag these.

NameRequiredDescriptionDefault
topicYesThe question framing the comparison, e.g. 'Which of these product descriptions resonates most with you?'
contextNoBackground every respondent reads before answering: a product description, the ad copy, a news story, the terms of an offer. Plain text, up to 16,000 characters. The result's shown_to_respondents block echoes what the panel read.
optionsYes2-3 text options to compare, each up to 500 characters (Free 3, Pro 5, Max 10).
languageNoLanguage the respondents answer in. Default: en.en
image_urlNoOptional public HTTPS URL of an image every respondent considers while ranking the options (a product photo, the ad the headlines go with). Same shape as run_focus_group.image_url.
custom_audienceNoOptional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp.
population_sizeNoRespondents. Default 20. Your plan's limit is 20 (Free 20, Pro 500, Max 1,000).
undecided_optionNoWhether respondents may choose none of the options (undecided, would not vote). Omit it and it is on for an election or referendum question and off otherwise. When on, the result adds undecided {first_choice_pct, respondents, chance_pct, chance_respondents} and each leaderboard row a decided_vote_pct.
demographic_presetNoAudience preset. Use list_demographic_presets to see all options. Default: us_general_population.us_general_population

TDQS

A4.8/5.0
Behavior5/5

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

No annotations, so the description carries full burden and does so: it discloses wallet billing at per-respondent rates, plan-based caps on respondents and option counts, and the full return shape including breakdowns and undecided handling. It even warns about the conditions under which results mislead.

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

Conciseness4/5

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

Front-loaded with purpose, then clearly sectioned (RECOMMENDED FLOW, plan limits, alternatives, Returns, WHEN IT MISLEADS). The Returns block is long but earns its place since no output schema exists; some prose could be trimmed.

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

Completeness5/5

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

With no output schema, the description supplies the return contract in detail (leaderboard fields, breakdowns, undecided, billing) plus cost and plan constraints. An agent has everything needed to call it and interpret results correctly.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds real meaning: image_url vs screen_creatives routing, undecided_option's default-on-for-elections behavior and its output effect, and previewing custom_audience with estimate_reach. It leaves some params (language, topic) to the already-rich schema.

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

Purpose5/5

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

Specific verb+resource: 'Run a simulated A/B (or A/B/C…) test (a Pulse compare) on text options' plus exactly what comes back (leaderboard with Borda scores and winner). It explicitly distinguishes itself from sibling tools screen_creatives (videos/images as creatives) and test_ads (in-feed ads).

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

Usage Guidelines5/5

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

Provides an explicit RECOMMENDED FLOW (list_demographic_presets → preview_cost → confirm → run) and names alternatives with the conditions that select them (screen_creatives for videos/image creatives, test_ads for feed ads). It also gives a WHEN IT MISLEADS section describing misuse conditions.

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

crowd_sampleAInspect

Browse the persistent CrowdOS crowd — a sample of the live agent population, sanitized to remove internal IDs. Useful for showing 'what kind of people are in this audience' to a user. No API key required — this endpoint is public.

Returns: { total_population, sample_size, agents: [ { name, age, gender, occupation, country, ocean: { openness, conscientiousness, extraversion, agreeableness, neuroticism }, values, media_diet, political_ideology, latest_opinion, recent_headline } ] }.

NameRequiredDescriptionDefault
limitNoHow many agents to sample, 1-60. Default: 20.

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden and does well: it discloses that the endpoint is public with no API key required, that data is sanitized of internal IDs, and that it draws from a persistent (not one-shot) population. It omits freshness/rate-limit behavior, which keeps it from a 5.

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

Conciseness4/5

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

Purpose is front-loaded in the first sentence, followed by usage context, an auth note, and a compact returns block. Every sentence carries information, though the returns enumeration is dense and could be trimmed if an output schema existed.

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

Completeness4/5

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

There is no output schema, but the description compensates with an inline 'Returns' shape covering population totals and per-agent fields. Combined with the public-access note and sanitization disclosure, an agent has enough to call and interpret it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the lone 'limit' parameter (range 1-60, default 20) is fully documented in the schema. The description adds no additional meaning about sampling size or its effect, so the baseline of 3 applies.

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

Purpose4/5

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

The description names a specific verb and resource ('Browse the persistent CrowdOS crowd — a sample of the live agent population') and adds a distinguishing property (sanitized of internal IDs). It does not explicitly contrast itself with siblings like list_demographic_presets or estimate_reach, so it stops short of a 5.

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

Usage Guidelines3/5

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

It offers a soft use case ('useful for showing what kind of people are in this audience to a user') but gives no when-not guidance and does not name an alternative sibling for related needs such as demographic enumeration. Usage is implied rather than prescribed.

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

estimate_reachAInspect

Preview how broad an audience a custom_audience filter describes — FREE: no model calls, no wallet debit, returns in under a second. Call it before a run that uses custom_audience to check the spec is valid and to see how tight the cut is.

A small audience is NOT a blocked one. Every panel is delivered at the population_size you request, with every respondent satisfying your filter. So never refuse or abandon a run because this returns audience_size 'small' — run it, and tell the user the audience is narrow. The band tells you how much natural variety sits behind the panel: a small audience's results carry an audience_note (incidence 'low', or 'very_low' for the rarest) saying they reflect a narrower range of perspectives, which is a reason to suggest widening the filter, not to stop.

Returns: { audience_size ('small' | 'medium' | 'large'), narrowed_by (the single filter cutting hardest — age, gender, geo, income, ethnicity, religion, interests or exclusions; null if nothing is narrowing it), narrowing_filters (every narrowing filter, strongest first; narrowed_by is its first entry), preset_key, and — with include_by_dimension=true — by_dimension as percentage shares }.

Note on interests: respondents each carry a handful of tags from a ~200-topic taxonomy, so ANY single tag describes only a small slice of a market. Pass several related tags (they are OR-matched) when you want a broader cut — e.g. 'Stock Trading' plus 'Day Trading' and 'Personal Investing' rather than 'Stock Trading' alone.

The market is preset_key; demographic_preset, the name the run tools use, is accepted too (both at once must name the same market).

An impossible spec (unknown country, gender, heritage value, currency code or income_match; an interest that is not a taxonomy tag; a city or region the market does not have; an unknown market; a heritage cut on a market without that axis; an income range no band on the market's ladder falls inside) returns audience_size=null plus spec_errors (human strings) and spec_error_details [{code, field, values, allowed, message}] — the same stable codes a run would reject with (422, before any charge) — so fix the spec here, for free.

NameRequiredDescriptionDefault
targetingYesOptional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp.
preset_keyNoMarket preset to sample. Use list_demographic_presets for the roster. Default: us_general_population.
sample_sizeNoHow much evidence the size band rests on. Default 500. Snapped up to the nearest of 100/250/500/1000/2500/5000/10000. An input only — it is not echoed in the response.
demographic_presetNoThe same market under the name the run tools use. Send this or preset_key; if both are sent they must name the same market.
include_by_dimensionNoAlso return the matched sample's composition by age band / gender / region / income.

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it discloses cost behavior (no model calls, no wallet debit), latency (under a second), the error contract (audience_size=null plus spec_errors/spec_error_details with the same stable codes a run would reject with at 422, before any charge), and the return shape including audience_note/incidence semantics. It also pre-empts a likely agent misread — that 'small' means blocked — which is exactly the non-obvious behavior 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.

Conciseness4/5

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

Front-loaded with the free/sub-second hook, then the small-audience caveat, then the returns block and error contract — a sensible order. It is long and partly duplicates the targeting schema's prose about small audiences, but nearly every sentence carries decision-relevant information, so the bulk is defensible.

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

Completeness5/5

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

No output schema exists, so the description supplies an explicit Returns block (audience_size, narrowed_by, narrowing_filters, preset_key, optional by_dimension) and the full failure surface with error codes. Combined with nested-object targeting params, an agent has everything needed to call it, interpret results, and act on failures without guessing.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning: the preset_key/demographic_preset aliasing rule (send either; both must name the same market), and the critical interest-tag guidance that a ~200-topic taxonomy means a single tag is a narrow slice and several tags are OR-matched. It does not explain sample_size or include_by_dimension's cost/effect beyond the schema text.

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

Purpose5/5

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

States a specific verb and resource — preview how broad an audience a `custom_audience` filter describes — and immediately scopes it as a free, sub-second validation step distinct from a paid run. An agent can distinguish it from `crowd_sample`, `preview_cost` and the run tools without opening any schema.

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

Usage Guidelines4/5

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

Explicit timing is given: 'Call it before a run that uses custom_audience to check the spec is valid and to see how tight the cut is,' plus a strong when-not: never abandon a run because the band returns 'small'. It routes to sibling concepts ('the run tools', fix the spec here before a 422) but never names `preview_cost` or `list_demographic_presets` as alternatives, leaving some inference about which free pre-flight check to pick.

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

get_creditsAInspect

The account's balance, as the web app's wallet shows it: what is left, the plan, and who pays for the next study. For a member of an organization that pays for its studies, also the organization's credits left this month. Free. Use it before a large study, or after an insufficient_funds error.

Returns: { unit, balance_credits, credits_expiring (credits that will expire, soonest first), plan, billed_to ('wallet' | 'org'), billed_org_name, organization (its credits this month: included, used, remaining, level), spend_paused, payment_overdue, card_required, credit_line_reached, weekly_free (Free plan: the weekly credits and when they reset), plan_unpaid, top_up_url }. payment_overdue is present when the organization that pays has an overdue invoice: { state ('scheduled' | 'paused'), pause_at, can_pay }. card_required is present when that organization has no card on file and its agreement requires one: { state, pause_at }. credit_line_reached is present when that organization is paused at its credit line: { state, reason }. While scheduled, studies run until pause_at; tell the user an org admin should pay, or save a card, in the organization portal.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the entire burden and does so well: it enumerates conditional return fields, explains that payment_overdue/card_required/credit_line_reached appear only in specific org states, and clarifies that 'while scheduled, studies run until pause_at' with a directive to tell the user to pay or save a card. These are non-obvious behavioral and remediation details an agent could not infer elsewhere.

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

Conciseness4/5

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

Front-loads purpose and usage in two short sentences before the return-field block, and every sentence earns its place by naming a field or a conditional state. The dense parenthetical field list is long but is genuine specification rather than filler.

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

Completeness5/5

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

There is no output schema, so the description must document the return shape, and it does so thoroughly, including conditional-field presence rules and the actionable 'pay or save a card in the organization portal' instruction. Nothing an agent needs to interpret the response or act on it is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The description instead spends its budget on return-value semantics, which is the right use of space for a no-arg tool.

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

Purpose5/5

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

States a specific resource ('the account's balance') with concrete scope ('what is left, the plan, and who pays for the next study') and adds organization-credit behavior for org members. It is clearly distinguishable from the cost-estimation sibling preview_cost by framing itself as the balance/wallet view.

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

Usage Guidelines4/5

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

Gives explicit triggering contexts: 'before a large study, or after an insufficient_funds error', plus the useful note that it is Free. It does not name a sibling alternative (e.g., preview_cost) for the pre-study case, so routing is clear but not fully comparative.

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

get_simulationAInspect

Fetch the results of a study you ran, by id. Use it to read a study again, or to collect one whose tool call failed after the study launched: if a run tool returns error='timeout' or any error carrying recoverable: true, the study is still running (or has finished) and the error's sim_id names it. Do NOT re-run the tool — that launches and charges a second study. Wait 30-60 seconds, then call get_simulation(sim_id); poll again while status is 'running'.

Returns the same shape as the run tool that started it, plus a top-level status (running | complete | failed | cancelled).

NameRequiredDescriptionDefault
sim_idYesThe id returned by any run tool, OR the sim_id field of a run tool's error (stream_disconnected, timeout, or any error carrying recoverable: true).

TDQS

A5/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does: it discloses the cost/duplication hazard of re-running, the async lifecycle (study keeps running after a timeout or recoverable error), the recommended polling cadence, and the status state machine. It also warns which error shapes are recoverable.

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

Conciseness5/5

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

Front-loaded with the core purpose, then the failure-recovery path, then the return shape. Dense but every sentence carries operational information; no filler or restatement of the name.

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

Completeness5/5

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

No output schema exists, yet the description compensates by describing the return shape ('same shape as the run tool that started it, plus a top-level status' with enumerated values). For a single-parameter read tool this leaves nothing an agent needs unstated.

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

Parameters5/5

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

Schema coverage is already 100%, so the baseline would be 3, but the description adds real meaning by explaining that sim_id can come either from a run tool's success response or from the sim_id field of a recoverable error — context the schema only states tersely.

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

Purpose5/5

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

Opens with a specific verb+resource+key ('Fetch the results of a study you ran, by id') and immediately scopes it as a retrieval-only operation, which cleanly separates it from the run_* siblings that launch studies. An agent can tell what it returns without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use cases (read a study again, recover a run whose tool call failed), an explicit prohibition with the reason ('Do NOT re-run the tool — that launches and charges a second study'), and a concrete recovery procedure (wait 30-60s, call get_simulation(sim_id), poll while status is 'running'). 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.

list_demographic_presetsAInspect

List all available demographic presets (audience templates). Each preset is a calibrated mix of demographics + Big Five OCEAN personality distributions for a country, region, or behavioral segment. Call this first if you don't know which preset to use.

Returns: { presets: [ { key, label, description, age_range, panel_age_range } ] }: panel_age_range is the youngest and oldest ages a panel for the preset can include, often wider than age_range. Pass the key to run_focus_group / run_debate as demographic_preset.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does disclose the return shape and a subtle semantic detail (panel_age_range is often wider than age_range). It is implicitly a safe, stateless enumeration, but never states there are no side effects or how large the list may be.

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

Conciseness5/5

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

Front-loaded with purpose, then usage routing, then return shape. Every sentence — including the panel_age_range clarification — earns its place and prevents a downstream mistake.

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

Completeness5/5

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

No output schema exists, yet the description enumerates the returned fields (key, label, description, age_range, panel_age_range) and their meanings, so an agent knows exactly what it gets and how to use the key.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline of 4 applies; there are no parameter semantics to clarify beyond the empty schema.

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

Purpose5/5

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

States a specific verb and resource ('List all available demographic presets') and immediately defines what a preset is (a calibrated mix of demographics + Big Five OCEAN distributions). This distinguishes it from simulation siblings like run_focus_group, which consume rather than enumerate presets.

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

Usage Guidelines5/5

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

Explicitly says 'Call this first if you don't know which preset to use', which is exactly the discovery condition, and names the two downstream consumers (run_focus_group / run_debate) plus the field to pass (demographic_preset). The routing is fully spelled out.

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

list_simulationsAInspect

List the studies you ran, newest first, with the summary the web app's dashboard shows for each: the question, mode, status, date, market, panel size, respondents counted, the sentiment split where the study has one, and what it cost. Free. Page with limit and offset; next_offset is set when there may be more. Use it to find a sim_id for get_simulation, ask_followup, share_study, get_report_link, validate_study or record_outcome.

Returns: { simulations: [ { id, topic, session_name, mode, status, created_at, demographic_preset, population_size, respondents, sentiment_summary, comparison_tier, num_rounds, instrument_type, billed_credits } ], limit, offset, next_offset }.

NameRequiredDescriptionDefault
limitNoStudies per page, 1-100. Default: 20.
offsetNoStudies to skip, newest first. Default: 0.

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does: it discloses cost ('Free'), ordering ('newest first'), pagination behavior ('next_offset is set when there may be more'), and scoping ('the studies you ran'). These are exactly the traits an agent needs before calling a list endpoint repeatedly.

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

Conciseness4/5

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

Front-loaded with purpose and ordering, then routing, then return shape. The one inefficiency is restating the field list twice — loosely in prose ('the question, mode, status, date, market...') and again as the returned object's keys.

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

Completeness5/5

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

No output schema exists, so the description supplies the full return shape including every key and the pagination fields. Combined with cost and ordering disclosure, an agent has everything needed to call and consume the result.

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

Parameters4/5

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

Schema coverage is 100%, so limit/offset meaning is already documented. The description still adds the pagination contract — that next_offset signals more pages — which is output semantics not conveyed by the input schema.

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

Purpose5/5

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

States a concrete verb and resource ('List the studies you ran') plus scope ('newest first') and content ('the summary the web app's dashboard shows'). It is clearly separable from get_simulation, which fetches a single study by id.

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

Usage Guidelines5/5

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

Explicitly routes the agent: 'Use it to find a sim_id for get_simulation, ask_followup, share_study, get_report_link, validate_study or record_outcome.' That names both the use case and the six downstream alternatives, leaving nothing to inference.

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

preview_costAInspect

Estimate the cost (credits) and runtime (seconds) of a hypothetical run_focus_group, run_debate, compare_options, screen_creatives or test_ads call WITHOUT actually running it. Use this when you need to budget before committing — autonomous agents should preview before any sim with population_size > 100 or any debate at all.

Free to call (no wallet debit, no rate-limit penalty beyond the regular per-key limit). Pricing is a fixed rate per respondent. Returns: estimate_credits, min_credits and max_credits (the figures below in credits — quote these to the user), estimate_cents (what a real run reserves — a completed vote is charged exactly this), min_cents / max_cents (the settle range: a debate may settle lower if it reaches consensus early, down to min_cents; respondents who fail to answer are never charged), expected_seconds_min / expected_seconds_max (so you can set a sensible tool-call timeout), plan, agent_cap, and within_agent_cap (false means the population_size exceeds the user's plan limit and the real call would 400).

BRIEF CHECK: also pass the draft brief (topic, the options for a comparison, demographic_preset and custom_audience as you plan to run them) and the result adds brief_warnings, a list of { code, message, options?, compared_with?, phrase? }. Codes: choice_question_in_vote (a vote or debate that asks people to pick between options — use compare_options), election_question_in_vote (a vote or debate on an election or referendum — use compare_options with each candidate or answer as an option), election_question (a compare_options run on an election or referendum — name each candidate's party in its option and ask whom respondents would vote for), one_sided_option (some options state a cost or limit and others state none), uneven_prices (some options carry a price and others none), missing_prices (the question asks about buying and no option has a price), audience_fit (the question assumes something, such as a next car or a job, that the audience is not narrowed to). Option letters: A is the first. Show the notes to the user before running; they never block a run, and the user decides whether to change the brief.

NameRequiredDescriptionDefault
modeNoWhich study to price: voting (one pass), debate (priced per round), comparison (priced like a vote; send the options to have them checked) or ad_lab (a test_ads study, priced per respondent however many creatives). Default: voting.voting
topicNoOptional: the question you plan to ask. With it the result adds brief_warnings.
optionsNoOptional, comparison: the text options you plan to rank, in order.
num_roundsNoDebate-only. Default 5 to match run_debate's platform-standard default. Ignored for voting.
num_optionsNoWith comparison_tier: how many creatives you will screen (1-4).
comparison_tierNoTo price a screen_creatives study: its tier, with mode='comparison' and num_options. The quote is for the tier's panel (35 / 150 / 400); leave population_size out.
custom_audienceNoOptional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp.
population_sizeNoThe panel to price. Your plan's limit is 20 respondents (Free 20, Pro 500, Max 1,000); an Ads Labo study (mode='ad_lab') takes 100, 200, 400 or 1,000 on every plan.
stance_statementNoOptional: the statement a vote will ask respondents to agree or disagree with.
demographic_presetNoOptional: the market preset you plan to run.

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations present, the description carries the full burden and does so: it declares the call is free ('no wallet debit, no rate-limit penalty beyond the regular per-key limit'), explains the charging model ('a completed vote is charged exactly this', 'respondents who fail to answer are never charged'), and flags a failure mode ('within_agent_cap (false means ... the real call would 400)'). It also notes brief_warnings 'never block a run', which is a behavioral fact an agent could otherwise misread as a gate.

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

Conciseness4/5

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

Front-loaded correctly (what it does, then cost/free status, then the return fields) and split with clear headers, so an agent can stop reading early. It is on the long side: the brief-check section enumerates eight warning codes with parenthetical guidance, and the custom_audience guidance edge could be trimmed without losing callable information.

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

Completeness5/5

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

For a 10-parameter tool with a nested object and no output schema, the description fully documents the return shape (estimate_credits, min/max_credits, estimate_cents, min/max_cents, expected_seconds_min/max, plan, agent_cap, within_agent_cap, plus brief_warnings) and explains the settle-range semantics. Nothing an agent needs to invoke or interpret it correctly appears to be missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns more by explaining how parameters interact rather than restating them — e.g. comparison_tier must be paired with mode='comparison' and num_options, its panel sizes (35/150/400), and 'leave population_size out'. It likewise explains what to pass for the brief check (topic, options, demographic_preset, custom_audience) and enumerates the resulting warning codes, which is meaning the schema cannot convey.

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

Purpose5/5

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

States a specific verb and two specific outputs ('estimate the cost (credits) and runtime (seconds)') and names exactly which sibling tools it prices (run_focus_group, run_debate, compare_options, screen_creatives, test_ads). The phrase 'WITHOUT actually running it' cleanly separates it from those siblings without opening a schema.

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

Usage Guidelines5/5

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

Gives an explicit trigger ('use this when you need to budget before committing') plus a hard rule for autonomous agents ('preview before any sim with population_size > 100 or any debate at all'). It also routes a related need to a different tool: 'Preview a custom_audience with the free estimate_reach tool before paying for a run'.

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

record_outcomeAInspect

Record what happened in the real world after a study you ran, so CrowdOS can keep calibrating against real outcomes. Pass at least one of: accuracy_rating (1-5, how well the study matched what happened), ground_truth (what happened, in words), ground_truth_data (an object of real figures, e.g. {"ctr": {"A": 0.021, "B": 0.014}}, up to 16 KB). Free. Recording again replaces the earlier record for that study.

Returns: { ok, simulation_id }.

NameRequiredDescriptionDefault
notesNoAnything else worth keeping with the record.
sim_idYesThe id of a study you ran.
ground_truthNoWhat happened, in words.
accuracy_ratingNo1-5: how well the study matched what happened.
ground_truth_dataNoReal figures, as an object (up to 16 KB).

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does most of it: it discloses cost ('Free'), overwrite semantics on re-record, a 16 KB payload cap, and the return shape { ok, simulation_id }. It still omits permission/auth requirements and whether the replaced record is recoverable.

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

Conciseness4/5

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

Front-loaded with the action and purpose, then constraints, then return value; roughly four tight sentences with little waste. The 'so CrowdOS can keep calibrating' clause and the 'Free.' fragment are mild padding but serve selection decisions.

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

Completeness4/5

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

For a 5-parameter mutation tool with a nested object and no output schema, the description covers the critical gaps: the at-least-one-input rule, overwrite behavior, payload limit, cost, and a lightweight return contract. The 'notes' field is left to the schema and no error behavior is described, so it is not fully exhaustive.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline would be 3, but the description adds real value beyond the schema: the at-least-one-of constraint across accuracy_rating/ground_truth/ground_truth_data is not encoded in the schema, and it supplies a concrete example and size limit for the nested ground_truth_data object.

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

Purpose4/5

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

States a specific verb and resource: record real-world outcomes for a study you previously ran, with the downstream purpose (calibration) named. It is clearly distinct from siblings like get_simulation or list_simulations, though it never explicitly contrasts with a near-neighbor.

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

Usage Guidelines4/5

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

Gives a clear trigger ('after a study you ran') plus a hard input constraint ('Pass at least one of: ...') and an upsert rule ('Recording again replaces the earlier record'). No explicit when-not-to-use or named alternative, so it stops short of a 5.

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

run_debateAInspect

Run a multi-round simulated debate (a Pulse debate). Respondents discuss the motion over several rounds and update their positions in response to each other. Returns the final consensus, the key arguments on each side, dissenting views and a synthesis, without individual answers. Use it to see whether a position survives scrutiny, not just a snapshot.

RECOMMENDED FLOW: if the user didn't pick an audience, call list_demographic_presets and propose one or two; call preview_cost for the price; confirm with the user; then run. Studies are charged to the account's wallet at the same per-respondent rate as on the web. A debate costs population_size × num_rounds, so preview it.

Your plan allows up to 20 respondents per study (Free 20, Pro 500, Max 1,000). The default debate is 30 respondents × 5 rounds.

WHEN IT FITS: whether a position survives argument, and which arguments move people. WHEN IT MISLEADS: read as a population estimate. Deliberation pulls a panel together; for the unprompted split, use run_focus_group.

Returns: final_consensus_score (0-1), summary, key_arguments_for, key_arguments_against, dissenting_views, num_rounds, agent_count (respondents counted in the final round), position_shifts_count, and breakdowns (final positions by age_band, gender, political_ideology, region and, where respondents carry their market's party lean, party).

NameRequiredDescriptionDefault
topicYesThe motion the panel debates, e.g. 'Should the federal minimum wage be $20/hr?'
contextNoBackground every respondent reads before answering: a product description, the ad copy, a news story, the terms of an offer. Plain text, up to 16,000 characters. The result's shown_to_respondents block echoes what the panel read.
languageNoLanguage the respondents answer in. Default: en.en
image_urlNoOptional public HTTPS URL of an image to attach to the debate topic. Same shape as run_focus_group.image_url.
num_roundsNoDebate rounds. Default 5 (platform standard). More rounds = more convergence pressure and cleaner consensus, but cost grows linearly.
custom_audienceNoOptional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp.
population_sizeNoRespondents in the debate. Default 20. Your plan's limit is 20 (Free 20, Pro 500, Max 1,000).
stance_statementNoOptional declarative the agents argue FOR or AGAINST. Sharpens the split when the topic is open-ended.
demographic_presetNoAudience preset. Use list_demographic_presets to see all options. Default: us_general_population.us_general_population

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does substantial work: it discloses the billing model (wallet charged per respondent), the cost formula population_size × num_rounds, plan caps, and that individual answers are deliberately excluded from the return. It also warns that more rounds means more convergence pressure, which is genuinely behavioral. It loses a point for an internal inconsistency: it claims "the default debate is 30 respondents × 5 rounds" while the schema caps population_size at 20 and defaults it to 20, so an agent relaying the default to a user would misstate it.

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

Conciseness4/5

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

Front-loaded with purpose, then clearly delimited blocks (RECOMMENDED FLOW, plan limits, WHEN IT FITS / WHEN IT MISLEADS, Returns). The Returns enumeration and the flow block both earn their place, but the cost point is made three times (wallet rate, population_size × num_rounds, "so preview it"), which is more repetition than a complex tool needs.

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

Completeness5/5

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

For a 9-parameter, nested-object, no-output-schema, paid, non-annotated tool, the description covers everything an agent needs: what it costs, how to check cost first, plan caps, when to use a sibling instead, and a full enumeration of returned fields including num_rounds, position_shifts_count and the breakdown dimensions. Nothing material is missing apart from the default disagreement noted above.

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

Parameters3/5

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

Schema coverage is 100% and the properties already document topic, context, language, num_rounds, custom_audience and population_size, so the baseline is 3. The description adds useful cost-per-round reasoning and a concrete pre-check (estimate_reach for custom_audience), but it also contradicts the schema on the population default (30 vs 20), which actively undermines parameter understanding rather than adding to it.

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

Purpose5/5

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

Opens with a specific verb+resource ("Run a multi-round simulated debate") and immediately describes the mechanism: respondents discuss over rounds and update positions in response to each other. It explicitly distinguishes itself from the nearest sibling by naming run_focus_group as the tool for the unprompted split, so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

Provides an explicit RECOMMENDED FLOW sequencing list_demographic_presets, preview_cost and user confirmation before running, plus a WHEN IT FITS / WHEN IT MISLEADS pair that names the failure mode (reading results as a population estimate) and the alternative (run_focus_group). Alternatives and exclusions are both stated.

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

run_focus_groupAInspect

Run a simulated focus group (a Pulse vote) on a question, policy, product idea or stance. Respondents are drawn from a demographic preset; you get the sentiment totals (counts and shares, no individual answers). Blocks about 5-120 seconds depending on population_size.

RECOMMENDED FLOW: if the user didn't pick an audience, call list_demographic_presets and propose one or two; call preview_cost for the price; confirm with the user; then run. Studies are charged to the account's wallet at the same per-respondent rate as on the web.

Your plan allows up to 20 respondents per study (Free 20, Pro 500, Max 1,000). On error_type=over_plan_cap, retry with the limit named in the error.

To target inside a market (age band, cities, income, interests, ethnicity), pass custom_audience and preview it for free with estimate_reach first.

To show respondents an image with the question (a product photo, a chart, a screenshot), pass image_url: a public https link to it. To have them watch videos or look at images as creatives, use screen_creatives; to test an ad in the feed, use test_ads.

WHEN IT FITS: one proposition, read as how a market feels about it (agree or disagree with a stance_statement, or the mood around a topic). WHEN IT MISLEADS: a question that asks people to pick between options. A vote records feelings, never picks; use compare_options.

Returns: { id, status, mode='voting', topic, demographic_preset, population_size, sentiment_summary: { positive, neutral, negative, positive_pct, neutral_pct, negative_pct }, counted_agent_count (the respondents whose answers were counted), breakdowns (the same split by age_band, gender, political_ideology, region and, where respondents carry their market's party lean, party; a group under min_group_size shows only its size), total_responses, billing }. If you gave a stance_statement, sentiment_axis says what positive and negative mean (Agree / Disagree).

NameRequiredDescriptionDefault
topicYesThe question or subject to test, e.g. 'Should the federal minimum wage be $20/hr?'. With a stance_statement, respondents read the statement and, under it, this topic whenever it adds to it.
contextNoBackground every respondent reads before answering: a product description, the ad copy, a news story, the terms of an offer. Plain text, up to 16,000 characters. The result's shown_to_respondents block echoes what the panel read.
languageNoLanguage the respondents answer in. Default: en.en
image_urlNoOptional public HTTPS URL of an image to attach to the question. One vision call extracts a description that every text-only agent reacts to alongside the question — useful for testing diagrams, product photos, charts, screenshots, or political imagery. Adds ~1-3s to the run regardless of population_size.
custom_audienceNoOptional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp.
population_sizeNoRespondents. Default 20. Your plan's limit is 20 (Free 20, Pro 500, Max 1,000).
stance_statementNoOptional declarative the agents take a position FOR or AGAINST. Improves clarity on comparison questions.
demographic_presetNoAudience preset. Use list_demographic_presets to see all options. Default: us_general_population.us_general_population

TDQS

A4.8/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden and does: it discloses blocking duration (5–120s scaled by population_size), billing to the account wallet at web per-respondent rates, plan caps with a retry rule on error_type=over_plan_cap, and the privacy constraint that only aggregate sentiment is returned, never individual answers. Small-group suppression (min_group_size) and the panel_check caveat are also surfaced.

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

Conciseness4/5

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

Front-loads the one-line purpose, then uses caps-labeled blocks (RECOMMENDED FLOW, WHEN IT FITS, WHEN IT MISLEADS, Returns) so an agent can skim to the needed section. It is long and repeats the plan-cap figure already in the population_size schema, which keeps it from a 5.

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

Completeness5/5

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

With no output schema, the description fully specifies the return payload — id, status, sentiment_summary with counts and shares, counted_agent_count, breakdowns by age/gender/ideology/region/party with min_group_size suppression, total_responses, billing. For an 8-parameter, nested-object, paid, blocking tool, nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description still adds real meaning on top, notably that stance_statement changes how positive/negative are interpreted (sentiment_axis = Agree/Disagree) and that image_url costs ~1–3s regardless of population_size. It largely restates the custom_audience preview advice already in the schema, so it stops short of a 5.

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

Purpose5/5

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

Opens with a specific verb+resource ("Run a simulated focus group (a Pulse vote)") and scopes the accepted inputs (question, policy, product idea, stance). The WHEN IT FITS / WHEN IT MISLEADS block explicitly separates it from compare_options, and later sentences route image/video/ad work to screen_creatives and test_ads, so an agent can distinguish it from every relevant sibling.

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

Usage Guidelines5/5

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

Provides an explicit RECOMMENDED FLOW naming list_demographic_presets and preview_cost in order, plus the free estimate_reach preview for custom_audience. It also states a negative condition — option-picking questions belong to compare_options, not this tool — which is exactly the when-not guidance the dimension rewards.

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

screen_creativesAInspect

Screen videos or images in Screening Room, as on the web: every respondent watches or looks at each creative itself, scores and ranks them, and says what works in the creative (message, hook, visuals, pacing, copy, call to action). One creative is a solo review; two or more are ranked against each other. You get the ranking or the solo verdict, a synthesis memo and, on the deeper tiers, expert reports and a debate summary, without individual answers.

Pick a tier; each fields the panel the web sells: quick_pulse (Quick Review, 35 respondents), balanced_insight (Balanced Insight, 150, the default), deep_research (Deep Review, 400). Your plan screens up to 2 creatives per study (Free 2, Pro 3, Max 4). Every plan can run every tier.

Pass each creative as a public https link straight to the file (PNG/JPG/WEBP/GIF up to 10 MB, MP4/MOV/WebM/AVI/MKV/M4V up to 100 MB) that opens without signing in, not a page that shows it; a link that returns a web page is refused before anything is charged.

RECOMMENDED FLOW: if the user didn't pick an audience, call list_demographic_presets and propose one or two; call preview_cost for the price; confirm with the user; then run. Studies are charged to the account's wallet at the same per-respondent rate as on the web. Price it with preview_cost(mode='comparison', comparison_tier, num_options).

Takes minutes; the tool waits up to ~15 minutes and reports progress. On error='timeout' with a sim_id the study keeps running: collect it with get_simulation, do not re-run.

Returns: { id, status, mode='comparison', topic, demographic_preset, population_size, screening_room: {tier, tier_label}, options, winner and leaderboard (2+ creatives), solo_summary (one creative), synthesis_memo, expert_reports [{lens, report}], debate_summary (Deep Review), total_responses, billing }.

NameRequiredDescriptionDefault
mediaYesThe creatives, in order (option A is the first): 1 for a solo review, up to 2 to rank (Free 2, Pro 3, Max 4).
topicYesWhat the viewers are asked, e.g. 'Which ad makes you most likely to try the app?' or, for one creative, 'Would this ad make you stop scrolling?'
contextNoBackground every respondent reads before answering: a product description, the ad copy, a news story, the terms of an offer. Plain text, up to 16,000 characters. The result's shown_to_respondents block echoes what the panel read.
languageNoLanguage the respondents answer in. Default: en.en
comparison_tierNoDepth: quick_pulse (35 respondents), balanced_insight (150, expert reports; the default), deep_research (400, expert reports and a debate).balanced_insight
custom_audienceNoOptional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp.
demographic_presetNoAudience preset. Use list_demographic_presets to see all options. Default: us_general_population.us_general_population

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it discloses wallet charging, per-respondent pricing, runtime and timeout behavior, media validation before charging, plan-based creative limits, and that results exclude individual answers. These are exactly the behavioral facts an agent needs before invoking a paid, long-running study.

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

Conciseness5/5

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

The description is long but appropriately sized for a complex paid study tool, and the core purpose and creative-input rules are front-loaded. Every paragraph earns its place by covering flow, pricing, validation, tiers, timeout handling, and return fields.

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

Completeness5/5

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

There is no output schema, but the description lists the returned fields and explains the key result shapes for solo and ranked modes. Combined with the detailed input schema and operational guidance, an agent has enough information to call the tool correctly.

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

Parameters5/5

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

Although schema coverage is already 100%, the description adds substantial meaning beyond the schema: it explains acceptable media formats and sizes, the requirement for direct public file links rather than web pages, plan-specific creative limits, tier respondent counts, and how to price a run. It also clarifies the relationship between comparison_tier, media count, and preview_cost.

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

Purpose5/5

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

The description states a specific verb and resource: it screens videos or images in Screening Room and clearly distinguishes solo review from ranked comparison. It also names the outputs, making the tool’s purpose unmistakable relative to its siblings.

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

Usage Guidelines4/5

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

It gives a strong recommended flow: if the audience is unset, use list_demographic_presets, price with preview_cost, confirm with the user, then run. It also explains timeout recovery via get_simulation, but it does not explicitly say when not to use this tool or which sibling to use instead for other kinds of evaluation.

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

share_studyAInspect

Get the public share link for a completed study you ran, the link the web app's Share button makes: a page anyone with the link can open without signing in. It shows the question, the sentiment split, the panel size and up to three short quotes; never the full results, the cost or who ran it. Free. Asking again returns the same link. Share only when the user wants the study public: they can turn the link off from the study's page in the web app.

Returns: { sim_id, share_url }.

NameRequiredDescriptionDefault
sim_idYesThe id of a completed study you ran.

TDQS

A4.4/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it discloses what the shared page reveals (question, sentiment split, panel size, three quotes), what it never reveals (full results, cost, who ran it), that it is free, that it is idempotent ('Asking again returns the same link'), and that it is revocable via the web app.

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

Conciseness4/5

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

Front-loads the core purpose in the first clause and keeps every sentence informative, including the return shape in lieu of an output schema. Slightly dense but no wasted sentences.

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

Completeness5/5

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

No output schema exists, so the description supplies the return shape ({ sim_id, share_url }) plus the privacy/idempotency/revocability semantics. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% with a single required param, so the schema already documents sim_id. The description's phrase 'a completed study you ran' reinforces the constraint but adds no syntax or format detail beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb+resource ('Get the public share link for a completed study') and immediately distinguishes it from the web app's general report by describing what the page contains vs. what it withholds. An agent can tell this apart from siblings like get_report_link and get_simulation.

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

Usage Guidelines4/5

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

Explicitly scopes usage: 'Share only when the user wants the study public' and notes the link can be turned off from the study's page. It also constrains input to 'a completed study you ran.' It does not name a competing sibling by name, but the when-to-use condition is clear.

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

test_adsAInspect

Test ad creatives in Ads Labo, as on the web: a panel scrolls past the ad in the feed you choose (Facebook feed, Instagram feed, Reels or Stories) and says whether it would click, stop scrolling and remember the brand. One creative returns its predicted click-through rate with a 95% interval, stop-scroll and brand-recall rates, sentiment and breakdowns by age, gender, income and interest. Two to four return a verdict (ship one, tied, or neither), each version's share of the panel's picks and a head-to-head of the top two. You get the totals, without individual answers. Predicted rates are a panel's reading, set against the typical click rate for the placement and industry; read them as a comparison, not a forecast of a live campaign.

Every plan tests up to 4 creatives on a panel of 100, 200 (the default), 400 or 1,000, the sizes the web offers; priced per respondent, however many creatives.

Pass each creative as a public https link straight to the file (PNG/JPG/WEBP/GIF up to 10 MB, MP4/MOV/WebM/AVI/MKV/M4V up to 100 MB) that opens without signing in, not a page that shows it. Put the ad copy (brand, headline, post text, button) in campaign; the panel reads it with the creative.

RECOMMENDED FLOW: if the user didn't pick an audience, call list_demographic_presets and propose one or two; call preview_cost for the price; confirm with the user; then run. Studies are charged to the account's wallet at the same per-respondent rate as on the web. Price it with preview_cost(mode='ad_lab', population_size).

Takes a few minutes; the tool waits up to ~15 minutes and reports progress. On error='timeout' with a sim_id the study keeps running: collect it with get_simulation, do not re-run.

Returns: { id, status, mode='ad_lab', topic, demographic_preset, population_size, run_type, and for one creative: metrics {predicted_ctr, ctr_ci_low, ctr_ci_high, stop_scroll_pct, brand_recall_pct, sentiment_*_pct, mean_conviction, predicted_cvr}, creative {summary, core_message, emotional_tone, hook_strength}, context_benchmark {typical_ctr_pct, placement, vertical}; for 2-4: verdict {call, winner, headline}, variants [ {key, label, share_pct, pull_index} ], head_to_head; both: counts, cohorts, billing }.

NameRequiredDescriptionDefault
mediaYesThe creatives, in order (Variant A is the first): 1 to predict its performance, 2-4 to find which one the panel would click.
campaignNoThe ad around the creative. Every field is optional; an ad with no copy is tested on the creative alone.
languageNoLanguage the respondents answer in. Default: en.en
include_cvrNoAlso predict how many who click would complete the objective (predicted_cvr).
custom_audienceNoOptional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp.
population_sizeNoRespondents: 100, 200 (the default), 400 or 1,000, the panels the web offers.
demographic_presetNoThe market the panel is drawn from. Use list_demographic_presets to see all options. Default: us_general_population.us_general_population

TDQS

A4.3/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does: it discloses wallet billing at per-respondent rates, the ~15 minute wait with progress reporting, the timeout/retry hazard, and the aggregation level ('You get the totals, without individual answers'). It also pre-empts misinterpretation by framing predicted rates as a panel's reading benchmarked against placement and industry, 'not a forecast of a live campaign'.

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

Conciseness4/5

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

Purpose is front-loaded and the paragraph order (what it does → pricing → input rules → flow → returns) is logical. There is some duplication: 'Every plan tests up to 4 creatives on a panel of 100, 200 (the default), 400 or 1,000, the sizes the web offers' restates the population_size enum and media maxItems, and the long Returns block is dense, but it is load-bearing given there is no output schema.

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

Completeness5/5

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

For a 7-parameter tool with nested objects, no annotations and no output schema, this is unusually complete: it documents the return shape per mode, billing, latency, timeout recovery, input validation rules, and how to interpret the numbers. An agent has everything needed to call it correctly and handle the failure case without guessing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns above that by adding constraints the schema does not carry — accepted file types and the 10 MB image / 100 MB video caps, and the requirement that the link open without signing in and point at the file, 'not a page that shows it'. It also ties population_size and media count to pricing, which the schema does not.

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

Purpose4/5

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

Opens with a specific verb+resource ('Test ad creatives in Ads Labo') and immediately explains the mechanism: a simulated panel scrolls past the ad in a chosen placement. It clearly splits the two modes (1 creative = predicted metrics, 2-4 = comparative verdict), so an agent knows exactly what it gets. It stops short of naming which sibling to use instead (e.g. screen_creatives or compare_options), so sibling differentiation is only implicit.

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

Usage Guidelines4/5

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

The RECOMMENDED FLOW block gives an explicit ordered sequence with named siblings: list_demographic_presets when no audience is picked, preview_cost for pricing, confirm with the user, then run. It also states the error path precisely ('On error=timeout with a sim_id... collect it with get_simulation, do not re-run'), which prevents duplicate spend. What's missing is any exclusion rule against the other analysis siblings.

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

validate_studyAInspect

Check a completed study against real data, as the web app's Validate panel does: pass the split a real survey or poll found on the same question, and get back how far the simulated split was from it. Free. Works on a study with a sentiment split (run_focus_group); a debate or a ranking has none and is refused. The check is saved with the study.

real_distribution takes percentages that sum to 100, or raw respondent counts, for positive, neutral and negative (agree, undecided and disagree when the study had a stance_statement).

Returns: { sim_id, grade (A-F), parity_pct (0-100), mae (mean absolute error, percentage points), rmse, pearson_r, simulated: { positive, neutral, negative }, real: {...}, buckets: [ { bucket, simulated_pct, real_pct, delta_pp } ], real_source, real_sample_size }.

NameRequiredDescriptionDefault
sim_idYesThe id of a completed study you ran.
real_sourceNoWhere the real figures come from, e.g. 'Pew, March 2026'.
real_sample_sizeNoHow many people the real survey asked.
real_distributionYesThe real split: percentages summing to 100, or raw counts. Keys: positive, neutral, negative.

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and discloses key behavior: the check is free, it saves the check with the study, and it refuses studies without a sentiment split. It does not cover permissions, re-run/overwrite behavior, or failure modes beyond refusal, but the main traits are clearly stated.

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

Conciseness5/5

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

The description is front-loaded and appropriately sized: purpose and restrictions come first, parameter clarification follows, and the return shape comes last. Because there is no output schema, the explicit return summary earns its space.

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

Completeness5/5

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

Given the nested real_distribution parameter, no output schema, and the need to understand study-type restrictions, the description is complete enough to call the tool correctly. It explains accepted input forms, refusal cases, persistence behavior, and the full returned metric shape.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds useful meaning beyond the schema: real_distribution may be percentages summing to 100 or raw respondent counts, and maps positive/neutral/negative to agree/undecided/disagree when the study had a stance_statement.

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

Purpose5/5

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

The description states a specific verb and resource: check a completed study against real data and return how far the simulated split was from it. It also distinguishes compatible studies (sentiment split from run_focus_group) from incompatible ones (debate or ranking).

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

Usage Guidelines5/5

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

It clearly says when the tool works and when it does not: only for a study with a sentiment split, while a debate or ranking is refused. It also names run_focus_group as the relevant sibling for the supported study type.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedcompare_options1 field changed
      • addedInput schema / properties / undecided_option
        Added value: +{
        +  "description": "Whether respondents may choose none of the options (undecided, would not vote). Omit it and it is on for an election or referendum question and off otherwise. When on, the result adds undecided {first_choice_pct, respondents, chance_pct, chance_respondents} and each leaderboard row a decided_vote_pct.",
        +  "type": "boolean"
        +}
  2. 7 tool updates
    • Addedask_followup
    • Addedget_credits
    • Addedget_report_link
    • Addedlist_simulations
    • Addedrecord_outcome
    • Addedshare_study
    • Addedvalidate_study
  3. 2 tool updates
    • Changedpreview_cost4 fields changed
      • changedInput schema / properties / mode / description
        Previous value: -"Which study to price: voting (one pass), debate (priced per round) or comparison (priced like a vote; send the options to have them checked). Default: voting."New value: +"Which study to price: voting (one pass), debate (priced per round), comparison (priced like a vote; send the options to have them checked) or ad_lab (a test_ads study, priced per respondent however many creatives). Default: voting."
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "voting",
        -  "debate",
        -  "comparison"
        -]New value: +[
        +  "voting",
        +  "debate",
        +  "comparison",
        +  "ad_lab"
        +]
      • changedInput schema / properties / population_size / description
        Previous value: -"Default 200 to match run_focus_group's Standard Pulse default. Pass the same value the user agreed to."New value: +"The panel to price. Your plan's limit is 20 respondents (Free 20, Pro 500, Max 1,000); an Ads Labo study (mode='ad_lab') takes 100, 200, 400 or 1,000 on every plan."
      • changedInput schema / properties / population_size / maximum
        Previous value: -20New value: +1000
    • Addedtest_ads
  4. 5 tool updates
    • Changedcompare_options1 field changed
      • addedInput schema / properties / image_url
        Added value: +{
        +  "description": "Optional public HTTPS URL of an image every respondent considers while ranking the options (a product photo, the ad the headlines go with). Same shape as run_focus_group.image_url.",
        +  "maxLength": 2048,
        +  "type": "string"
        +}
    • Changedpreview_cost2 fields changed
      • addedInput schema / properties / comparison_tier
        Added value: +{
        +  "description": "To price a screen_creatives study: its tier, with mode='comparison' and num_options. The quote is for the tier's panel (35 / 150 / 400); leave population_size out.",
        +  "enum": [
        +    "quick_pulse",
        +    "balanced_insight",
        +    "deep_research"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / num_options
        Added value: +{
        +  "description": "With comparison_tier: how many creatives you will screen (1-4).",
        +  "maximum": 2,
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changedrun_debate1 field changed
      • addedInput schema / properties / image_url
        Added value: +{
        +  "description": "Optional public HTTPS URL of an image to attach to the debate topic. Same shape as run_focus_group.image_url.",
        +  "maxLength": 2048,
        +  "type": "string"
        +}
    • Changedrun_focus_group1 field changed
      • addedInput schema / properties / image_url
        Added value: +{
        +  "description": "Optional public HTTPS URL of an image to attach to the question. One vision call extracts a description that every text-only agent reacts to alongside the question — useful for testing diagrams, product photos, charts, screenshots, or political imagery. Adds ~1-3s to the run regardless of population_size.",
        +  "maxLength": 2048,
        +  "type": "string"
        +}
    • Addedscreen_creatives
  5. 1 tool update
    • Changedpreview_cost7 fields changed
      • addedInput schema / properties / custom_audience
        Added value: +{
        +  "description": "Optional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp.",
        +  "type": "object"
        +}
      • addedInput schema / properties / demographic_preset
        Added value: +{
        +  "description": "Optional: the market preset you plan to run.",
        +  "type": "string"
        +}
      • changedInput schema / properties / mode / description
        Previous value: -"Which study to price: voting (one pass) or debate (priced per round). Default: voting."New value: +"Which study to price: voting (one pass), debate (priced per round) or comparison (priced like a vote; send the options to have them checked). Default: voting."
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "voting",
        -  "debate"
        -]New value: +[
        +  "voting",
        +  "debate",
        +  "comparison"
        +]
      • addedInput schema / properties / options
        Added value: +{
        +  "description": "Optional, comparison: the text options you plan to rank, in order.",
        +  "items": {
        +    "maxLength": 500,
        +    "type": "string"
        +  },
        +  "maxItems": 10,
        +  "type": "array"
        +}
      • addedInput schema / properties / stance_statement
        Added value: +{
        +  "description": "Optional: the statement a vote will ask respondents to agree or disagree with.",
        +  "type": "string"
        +}
      • addedInput schema / properties / topic
        Added value: +{
        +  "description": "Optional: the question you plan to ask. With it the result adds brief_warnings.",
        +  "maxLength": 4000,
        +  "type": "string"
        +}
  6. 4 tool updates
    • Changedcompare_options1 field changed
      • changedInput schema / properties / custom_audience / description
        Previous value: -"Optional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter. Guide: https://crowdos.ai/mcp."New value: +"Optional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp."
    • Changedestimate_reach1 field changed
      • changedInput schema / properties / targeting / description
        Previous value: -"Optional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter. Guide: https://crowdos.ai/mcp."New value: +"Optional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp."
    • Changedrun_debate1 field changed
      • changedInput schema / properties / custom_audience / description
        Previous value: -"Optional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter. Guide: https://crowdos.ai/mcp."New value: +"Optional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp."
    • Changedrun_focus_group1 field changed
      • changedInput schema / properties / custom_audience / description
        Previous value: -"Optional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter. Guide: https://crowdos.ai/mcp."New value: +"Optional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp."
  7. 3 tool updates
    • Changedcompare_options1 field changed
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Background every respondent reads before answering: a product description, the ad copy, a news story, the terms of an offer. Plain text, up to 16,000 characters. The result's shown_to_respondents block echoes what the panel read.",
        +  "maxLength": 16000,
        +  "type": "string"
        +}
    • Changedrun_debate1 field changed
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Background every respondent reads before answering: a product description, the ad copy, a news story, the terms of an offer. Plain text, up to 16,000 characters. The result's shown_to_respondents block echoes what the panel read.",
        +  "maxLength": 16000,
        +  "type": "string"
        +}
    • Changedrun_focus_group2 fields changed
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Background every respondent reads before answering: a product description, the ad copy, a news story, the terms of an offer. Plain text, up to 16,000 characters. The result's shown_to_respondents block echoes what the panel read.",
        +  "maxLength": 16000,
        +  "type": "string"
        +}
      • changedInput schema / properties / topic / description
        Previous value: -"The question or stance to test, e.g. 'Should the federal minimum wage be $20/hr?'"New value: +"The question or subject to test, e.g. 'Should the federal minimum wage be $20/hr?'. With a stance_statement, respondents read the statement and, under it, this topic whenever it adds to it."
  8. 1 tool update
    • Changedpreview_cost1 field changed
      • changedInput schema / properties / population_size / default
        Previous value: -200New value: +20
  9. 9 tool updates
    • First observedcancel_simulation
    • First observedcompare_options
    • First observedcrowd_sample
    • First observedestimate_reach
    • First observedget_simulation
    • First observedlist_demographic_presets
    • First observedpreview_cost
    • First observedrun_debate
    • First observedrun_focus_group

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Remote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.
    16
    23 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources