Skip to main content
Glama

run_focus_group

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).

Input Schema

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

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema 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"
      +}
  2. Changed1 schema 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."
  3. Changed2 schema 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."
  4. First observed

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources