stunt-double avatar

Stunt Double

stunt-double/stuntdouble-mcp

Connects Claude to Stunt Double's automated UX validation platform. You get tools to orchestrate AI user personas, run them through workflows and checklists against live web apps, and surface friction points in user journeys. The server exposes workspace and project management, actor creation with custom system prompts and capabilities, structured interviews with discussion guides and persona specs, plus conversation and feedback APIs. Authenticate once via OAuth and PKCE, then trigger checklist runs, launch interview rounds, manage knowledge bases, and pull synthesized reports with themes and recommendations. Hosted endpoint means no local installation. Reach for this when you need to validate UI flows at scale before shipping or want to generate realistic user research without manual testing sessions.

GitHub stars
1
tools
69
transport
HTTP
last updated
Nov 4, 2026

Install

From registry metadata
$ npx add-mcp https://app.stuntdouble.io/api/mcp --name stuntdouble

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http stuntdouble https://app.stuntdouble.io/api/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 69 tools

Verified live against the running server on Nov 6, 2026.

get_meGet the account this connection is acting as: id, email, name, timezone and where notifications reach them. Use `timezone` when creating a scheduled workflow rather than defaulting to UTC, and `id` to tell your own runs and feedback from a teammate's in lists that carry only u...

Get the account this connection is acting as: id, email, name, timezone and where notifications reach them. Use `timezone` when creating a scheduled workflow rather than defaulting to UTC, and `id` to tell your own runs and feedback from a teammate's in lists that carry only u...

No parameters. Call it with no arguments.

list_workspacesList the workspaces you belong to, with your role in each. Call this first: almost every other tool needs a workspace_id from here.

List the workspaces you belong to, with your role in each. Call this first: almost every other tool needs a workspace_id from here.

No parameters. Call it with no arguments.

get_workspaceGet workspace details by ID or slug, including the admin-set controls that decide what runs in it may do. `settings` is a ceiling, never a grant: a network policy there applies on top of each worker's own, and a feature switched off there cannot be switched back on per project.2 params

Get workspace details by ID or slug, including the admin-set controls that decide what runs in it may do. `settings` is a ceiling, never a grant: a network policy there applies on top of each worker's own, and a feature switched off there cannot be switched back on per project.

Parameters* required
idstring
Workspace UUID, from list_workspaces. Provide this or slug.
slugstring
Workspace URL slug, e.g. "acme" for app.stuntdouble.io/w/acme. Provide this or id.
list_workspace_membersList the members of a workspace with their role, name and join date. Use it to resolve the user ids that runs, feedback and assignments carry.1 params

List the members of a workspace with their role, name and join date. Use it to resolve the user ids that runs, feedback and assignments carry.

Parameters* required
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
searchSearch everything in a workspace (projects, actors, checklists, interviews, automations, issues, goals, feedback, knowledge, insights, design reviews, resources, conversations) by name or content. Use it instead of listing and filtering, and before creating something that may...5 params

Search everything in a workspace (projects, actors, checklists, interviews, automations, issues, goals, feedback, knowledge, insights, design reviews, resources, conversations) by name or content. Use it instead of listing and filtering, and before creating something that may...

Parameters* required
limitinteger
Maximum results to return (default 20, max 50).
project_idstring
Project UUID, from list_projects, to restrict results to one project. Workspace-level entities (actors, actor knowledge, conversations) are excluded when this is set, since they do not belong to a...
querystring
What to search for, e.g. "checkout" or "onboard". Words are matched as prefixes, so a partial term is fine (max 200 characters). Leave empty to list the most recently updated items.
typesarray
Restrict the search to these entity types, e.g. ["checklist", "interview"]. Defaults to all of them.
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
list_projectsList the live projects in a workspace, most recently opened first. Call this after list_workspaces and match a target URL or product name against these before creating anything new.1 params

List the live projects in a workspace, most recently opened first. Call this after list_workspaces and match a target URL or product name against these before creating anything new.

Parameters* required
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
get_projectGet one project (the product tracked by checklists, workflows, interviews and feedback), including its URL, audience and product description. Archived projects read as not found.1 params

Get one project (the product tracked by checklists, workflows, interviews and feedback), including its URL, audience and product description. Archived projects read as not found.

Parameters* required
project_id*string
Project UUID, from list_projects.
create_projectCreate a project (a product to track with checklists, workflows, interviews and feedback). Call list_projects first and reuse a matching project rather than creating a duplicate.7 params

Create a project (a product to track with checklists, workflows, interviews and feedback). Call list_projects first and reuse a matching project rather than creating a duplicate.

Parameters* required
audiencestring
Who the product is for, e.g. "small business owners doing their own payroll".
colorstring
Six-digit hex colour for the project, e.g. #8470e5 (Violet). Prefer a palette value. Defaults to the standard project colour when omitted.
descriptionstring
Short internal note about the project shown in the dashboard. Optional.
name*string
Display name for the project, 1 to 200 characters, e.g. "Acme checkout".
product_descriptionstring
What the product does, in a sentence or two. Used as context for actors and interviews, so a specific description gives better runs.
urlstring
Primary URL of the product, e.g. https://example.com. A missing scheme is added. When omitted, the project has no address until one is set in the dashboard.
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
list_project_mcp_serversList the third-party MCP servers attached to a project and the tools each allows. Configuration only: those tools are not callable here, but an actor in a run (checklist, interview, workflow) may call the allowed tools of servers whose in_force is true. Servers are registered...1 params

List the third-party MCP servers attached to a project and the tools each allows. Configuration only: those tools are not callable here, but an actor in a run (checklist, interview, workflow) may call the allowed tools of servers whose in_force is true. Servers are registered...

Parameters* required
project_id*string
Project UUID, from list_projects.
list_workspace_guidelinesList the workspace's whole library of standing rules (design system, tone of voice, brand, compliance, accessibility, shared knowledge), with how many projects hold each one. Read this before writing a rule: attaching one that already exists with `set_project_guideline` beats...2 params

List the workspace's whole library of standing rules (design system, tone of voice, brand, compliance, accessibility, shared knowledge), with how many projects hold each one. Read this before writing a rule: attaching one that already exists with `set_project_guideline` beats...

Parameters* required
include_disabledboolean
Include rules that are switched off in the library. Defaults to true; pass false to see only rules in force.
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
add_workspace_guidelineAdd a standing rule to the workspace library. Call list_workspace_guidelines first so you do not add a near-duplicate. Attach it to the projects it applies to with `project_ids` here or `set_project_guideline` later, or set `apply_to_design_reviews` so every design review in t...6 params

Add a standing rule to the workspace library. Call list_workspace_guidelines first so you do not add a near-duplicate. Attach it to the projects it applies to with `project_ids` here or `set_project_guideline` later, or set `apply_to_design_reviews` so every design review in t...

Parameters* required
apply_to_design_reviewsboolean
Hold every design review in the workspace to this rule, including reviews with no project. Defaults to false.
category*string
What kind of rule this is: design_system, tone_of_voice, brand, content (labels, terminology, formatting), accessibility, compliance, security, performance, or knowledge (anything else an actor sho...one of design_system · tone_of_voice · brand · content · accessibility · compliance
content*string
The rule itself, written so someone can observe whether the product holds to it, e.g. "Primary buttons use sentence case." Trimmed and capped at 4000 characters.
project_idsarray
Project UUIDs (from list_projects) to attach the new rule to straight away. Projects outside this workspace are reported in `attach_failed`. When omitted, the rule sits in the library unattached.
titlestring
Short name for the rule, capped at 160 characters, e.g. "Sentence-case buttons". Derived from the leading words of content when omitted.
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
update_workspace_guidelineUpdate a rule in the workspace library, or switch it off. Every project holding it is held to the new wording, so prefer editing the shared rule over adding a near-duplicate. Pass only the fields to change; at least one is required.7 params

Update a rule in the workspace library, or switch it off. Every project holding it is held to the new wording, so prefer editing the shared rule over adding a near-duplicate. Pass only the fields to change; at least one is required.

Parameters* required
apply_to_design_reviewsboolean
Hold every design review in the workspace to this rule, project or not. Unchanged when omitted.
categorystring
What kind of rule this is: design_system, tone_of_voice, brand, content (labels, terminology, formatting), accessibility, compliance, security, performance, or knowledge (anything else an actor sho...one of design_system · tone_of_voice · brand · content · accessibility · compliance
contentstring
The rule itself, written so someone can observe whether the product holds to it, e.g. "Primary buttons use sentence case." Trimmed and capped at 4000 characters.
enabledboolean
False switches the rule off everywhere without removing it from the library; true switches it back on. Unchanged when omitted.
guideline_id*string
Library guideline UUID: the `id` from list_workspace_guidelines or list_project_guidelines (not the `attachment_id`).
titlestring
New short name for the rule, capped at 160 characters. Unchanged when omitted.
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
remove_workspace_guidelineRemove a rule from the workspace library permanently. This detaches it from every project holding it, so prefer `update_workspace_guideline` with `enabled: false` when the rule may come back.2 params

Remove a rule from the workspace library permanently. This detaches it from every project holding it, so prefer `update_workspace_guideline` with `enabled: false` when the rule may come back.

Parameters* required
guideline_id*string
Library guideline UUID: the `id` from list_workspace_guidelines or list_project_guidelines (not the `attachment_id`).
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
list_project_guidelinesList the standing rules this project is held to: the workspace library rules it has attached. Read these before writing checks, interview guides or design feedback for the project, and assert them as observable checks rather than restating them. `attachment_id` is this project...2 params

List the standing rules this project is held to: the workspace library rules it has attached. Read these before writing checks, interview guides or design feedback for the project, and assert them as observable checks rather than restating them. `attachment_id` is this project...

Parameters* required
include_disabledboolean
Include attached rules that are switched off, either in the library or for this project. Defaults to false, which returns only rules in force.
project_id*string
Project UUID, from list_projects.
add_project_guidelineAdd a standing rule and hold this project to it (a design-system rule, a tone-of-voice rule, a compliance obligation, or shared knowledge). Every checklist run, design review, interview and triage for the project is then held to it. The rule joins the workspace library, so che...4 params

Add a standing rule and hold this project to it (a design-system rule, a tone-of-voice rule, a compliance obligation, or shared knowledge). Every checklist run, design review, interview and triage for the project is then held to it. The rule joins the workspace library, so che...

Parameters* required
category*string
What kind of rule this is: design_system, tone_of_voice, brand, content (labels, terminology, formatting), accessibility, compliance, security, performance, or knowledge (anything else an actor sho...one of design_system · tone_of_voice · brand · content · accessibility · compliance
content*string
The rule itself, written so someone can observe whether the product holds to it, e.g. "Primary buttons use sentence case." Trimmed and capped at 4000 characters.
project_id*string
Project UUID, from list_projects.
titlestring
Short name for the rule, capped at 160 characters, e.g. "Sentence-case buttons". Derived from the leading words of content when omitted.
set_project_guidelineAttach a library rule to a project, detach it, or switch it off for this project alone. Attaching is how one workspace rule comes to hold for several projects without being retyped. `enabled: false` keeps the attachment but stands the rule down here, leaving every other projec...4 params

Attach a library rule to a project, detach it, or switch it off for this project alone. Attaching is how one workspace rule comes to hold for several projects without being retyped. `enabled: false` keeps the attachment but stands the rule down here, leaving every other projec...

Parameters* required
attachedboolean
False detaches the rule from this project. Defaults to true (attach).
enabledboolean
This project's own switch on the rule, only meaningful while attached. Defaults to true for a new attachment and leaves an existing one unchanged when omitted.
guideline_id*string
Library guideline UUID from list_workspace_guidelines. Must belong to the same workspace as the project.
project_id*string
Project UUID, from list_projects.
list_actorsList active actors (persistent AI user personas) in a workspace, oldest first. Prefer reusing an existing actor over creating a new one; pass an id from here to get_actor, interviews and checklists.1 params

List active actors (persistent AI user personas) in a workspace, oldest first. Prefer reusing an existing actor over creating a new one; pass an id from here to get_actor, interviews and checklists.

Parameters* required
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
get_actorGet an actor's details: description, system prompt, capabilities, and status. list_actor_knowledge has the knowledge it carries into runs.1 params

Get an actor's details: description, system prompt, capabilities, and status. list_actor_knowledge has the knowledge it carries into runs.

Parameters* required
actor_id*string
Actor (persona) UUID, from list_actors.
create_actorCreate an actor: a persistent AI user persona with its own browser, email inbox (for OTP and magic-link flows), and memory. The description shapes who the persona is, so describe a person (background, goals, tech comfort), not a job title. Call list_actors first and reuse a ma...3 params

Create an actor: a persistent AI user persona with its own browser, email inbox (for OTP and magic-link flows), and memory. The description shapes who the persona is, so describe a person (background, goals, tech comfort), not a job title. Call list_actors first and reuse a ma...

Parameters* required
descriptionstring
Who this persona is: background, goals, and tech comfort, e.g. "Runs a small bakery, shops on her phone, impatient with long forms." Omit to create the actor without one and add it later with updat...
name*string
Display name for the persona, ideally its role rather than a human name, e.g. "First-time visitor" or "Busy finance manager". Also seeds its email inbox address.
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
update_actorUpdate an actor's name, description, system prompt, capabilities, or status. Only the fields you pass change; at least one is required. Set status to "archived" to soft-delete.6 params

Update an actor's name, description, system prompt, capabilities, or status. Only the fields you pass change; at least one is required. Set status to "archived" to soft-delete.

Parameters* required
actor_id*string
Actor (persona) UUID, from list_actors.
capabilitiesobject
Full capabilities object, which REPLACES the stored one rather than merging, so read it with get_actor and send it back with your changes, e.g. {"model": "...", "useBrowser": true, "memory": true,...
descriptionstring
New persona description (background, goals, tech comfort). Replaces the old one entirely; omit to keep it.
namestring
New display name. Omit to keep the current one.
statusstring
Set to "archived" to soft-delete, or "active" to restore. Omit to keep the current status.one of active · archived
system_promptstring
Extra instructions layered on the persona, replacing any existing ones, at most 1000 characters. Put facts, processes and expertise in actor knowledge instead. Omit to keep the current prompt.
list_actor_knowledgeList what an actor knows, oldest first. Each entry has a kind: expertise and process entries are listed by title in every run and the actor reads one when the task calls for it; reference and account entries are found by search. Check here before add_actor_knowledge to avoid d...1 params

List what an actor knows, oldest first. Each entry has a kind: expertise and process entries are listed by title in every run and the actor reads one when the task calls for it; reference and account entries are found by search. Check here before add_actor_knowledge to avoid d...

Parameters* required
actor_id*string
Actor (persona) UUID, from list_actors.
add_actor_knowledgeAdd knowledge to an actor. Choose the kind: expertise for a skill or standard it judges by in every run (brand, tone of voice, design system, compliance, accessibility), process for steps it follows, reference for facts it looks up when relevant (product docs, FAQs, policies),...4 params

Add knowledge to an actor. Choose the kind: expertise for a skill or standard it judges by in every run (brand, tone of voice, design system, compliance, accessibility), process for steps it follows, reference for facts it looks up when relevant (product docs, FAQs, policies),...

Parameters* required
actor_id*string
Actor (persona) UUID, from list_actors.
content*string
The knowledge itself as plain text or Markdown, at most 8,000 characters; split longer material into several entries. Be specific and observable, e.g. "Headlines use sentence case; never say 'lever...
kindstring
What the entry is for. Defaults to reference.one of expertise · process · reference · account
title*string
Short label for the entry, e.g. "Pricing rules" or "Brand tone of voice". The actor sees titles in every run and opens an entry by its title, so make it say what the entry covers.
remove_actor_knowledgeRemove a knowledge entry from an actor permanently, so future runs no longer use it. Find the entry's id with list_actor_knowledge.1 params

Remove a knowledge entry from an actor permanently, so future runs no longer use it. Find the entry's id with list_actor_knowledge.

Parameters* required
knowledge_id*string
Knowledge entry UUID, from list_actor_knowledge or add_actor_knowledge.
list_conversationsList chat conversations with actors in a workspace, most recently active first, optionally filtered to one actor. Excludes the workspace assistant's conversations. Pass an id to get_conversation to read the messages.2 params

List chat conversations with actors in a workspace, most recently active first, optionally filtered to one actor. Excludes the workspace assistant's conversations. Pass an id to get_conversation to read the messages.

Parameters* required
actor_idstring
Actor (persona) UUID, from list_actors, to list only conversations with that actor. Omit to list conversations with every actor.
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
get_conversationGet an actor conversation with its full message history, oldest message first. Find conversation ids with list_conversations.1 params

Get an actor conversation with its full message history, oldest message first. Find conversation ids with list_conversations.

Parameters* required
conversation_id*string
Conversation UUID, from list_conversations.
list_checklistsList the checklists in a workspace, with their target URL, actor, check count and a recent run. Check here before creating a new checklist: re-running an existing one keeps its history as a regression signal. Use get_checklist for the checks themselves.1 params

List the checklists in a workspace, with their target URL, actor, check count and a recent run. Check here before creating a new checklist: re-running an existing one keeps its history as a regression signal. Use get_checklist for the checks themselves.

Parameters* required
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
get_checklistGet a checklist: its target URL, instructions, run settings, every check (with the `id` update_checklist needs to edit one in place) and its 10 most recent runs. Call get_checklist_run with a run id for per-check results and evidence.1 params

Get a checklist: its target URL, instructions, run settings, every check (with the `id` update_checklist needs to edit one in place) and its 10 most recent runs. Call get_checklist_run with a run id for per-check results and evidence.

Parameters* required
checklist_id*string
Checklist UUID, from list_checklists or create_checklist.
get_checklist_runGet a checklist run: per-check results with evidence, score, verdict and the change since the previous run. Poll after run_checklist every 30 to 60 seconds until `status` is terminal; `outcome` is the verdict on the experience. `comparison.changes` (what got better or worse) i...1 params

Get a checklist run: per-check results with evidence, score, verdict and the change since the previous run. Poll after run_checklist every 30 to 60 seconds until `status` is terminal; `outcome` is the verdict on the experience. `comparison.changes` (what got better or worse) i...

Parameters* required
run_id*string
Checklist run UUID, from run_checklist or the recent_runs of get_checklist.
flag_check_verdictCorrect a wrong passed or failed verdict on one check: pass the result_id from get_checklist_run and a note on what was actually true. Later runs use it as calibration and re-record any code-run script; the run's own score is unchanged. Set clear to withdraw a correction.4 params

Correct a wrong passed or failed verdict on one check: pass the result_id from get_checklist_run and a note on what was actually true. Later runs use it as calibration and re-record any code-run script; the run's own score is unchanged. Set clear to withdraw a correction.

Parameters* required
clearboolean
Withdraw an existing correction instead.
notestring
What was actually true on the page. Later runs read this, so be specific: where the evidence is, or what is wrong.
result_id*string
The check result to correct: `results[].result_id` from get_checklist_run.
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
run_checklistRun a checklist (async): the actor drives a real browser through the product and judges each check, and may use the project's attached MCP servers (list_project_mcp_servers). Returns a run_id; poll get_checklist_run (runs take a few minutes). Counts against the workspace's pla...2 params

Run a checklist (async): the actor drives a real browser through the product and judges each check, and may use the project's attached MCP servers (list_project_mcp_servers). Returns a run_id; poll get_checklist_run (runs take a few minutes). Counts against the workspace's pla...

Parameters* required
checklist_id*string
Checklist UUID, from list_checklists or create_checklist.
retain_memoryboolean
Save this run's check results to the actor's knowledge so it can recall them later. Off by default; only set it when the actor should remember this particular run.
create_checklistCreate a browser checklist: an actor exercises the product at a URL and judges each check with evidence. Checks can verify flows ("a new user can complete signup") or assert standards ("headlines use sentence case"), for brand, compliance and design-system audits. Any reachabl...13 params

Create a browser checklist: an actor exercises the product at a URL and judges each check with evidence. Checks can verify flows ("a new user can complete signup") or assert standards ("headlines use sentence case"), for brand, compliance and design-system audits. Any reachabl...

Parameters* required
actor_id*string
Actor (persona) that runs the checklist, from list_actors. Must belong to this workspace.
checks*array
Conditions to evaluate, in the order they run. A plain string is a pass/fail check; pass an object to make one weighted or informational, to have it run only when the check before it passed or fail...
instructions*string
How the actor should exercise the product: where to start, what to do and any test data to use, e.g. "Sign up with a new email, then create a first project".
name*string
Checklist name, up to 200 characters, e.g. "Signup and onboarding".
pass_thresholdnumber
Weighted score a run must reach to be judged passed, in score_type's unit (a percent at most 100, or points). Only has an effect when the checklist has weighted checks; defaults to every point (100...
project_idstring
Project UUID (from list_projects) to attach the checklist to. When omitted, url is used to find or create a project.
record_sessionboolean
Record a video of the browser session for each run. Defaults to true.
run_modestring
How runs execute (default 'code'). 'code' drives the agent once, records what it did, and replays that recording on later runs with no model calls, falling back to the agent when the recording stop...one of agentic · code
score_bandsarray
Named ranges of the weighted score (e.g. "Optimal" from 75), each from its min to the next band; the lowest catches everything below. Labels only: pass_threshold decides the verdict. Replaces store...
score_typestring
What the weighted score is measured in, which also sets the unit of pass_threshold and score_bands. 'percent' (default): points earned over points available, 0 to 100. 'points': the points earned,...one of percent · points
score_unitvalue
What a points score counts, plural (e.g. "marks", "stars"). Null or omitted reads as "points". Ignored for percent.
urlstring
Target URL the actor opens, e.g. "https://staging.example.com/signup". Also used to find or create a project when project_id is omitted. When omitted, runs target the project's own address.
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
update_checklistUpdate a checklist. Only the fields you pass change. Pass `checks` to replace the full set of checks, sending each existing check with the `id` from get_checklist so it keeps its run history. Changing the checks, instructions or url retires the recorded script, so the next run...14 params

Update a checklist. Only the fields you pass change. Pass `checks` to replace the full set of checks, sending each existing check with the `id` from get_checklist so it keeps its run history. Changing the checks, instructions or url retires the recorded script, so the next run...

Parameters* required
actor_idstring
Actor (persona) UUID from list_actors to run the checklist instead. Must belong to the same workspace. Unchanged when omitted.
carry_over_notesboolean
Whether a finished run leaves notes for the next run of this checklist by the same actor: the route that worked, blockers and workarounds, and the account state it left behind. Notes never carry ve...
checklist_id*string
Checklist UUID, from list_checklists or create_checklist.
checksarray
Replaces the full set of checks. Send each one with the `id` get_checklist gave it: a check that keeps its id keeps its run history, so a reworded or retyped check is still comparable against previ...
instructionsstring
New instructions for how the actor exercises the product. Unchanged when omitted.
namestring
New checklist name, up to 200 characters. Unchanged when omitted.
pass_thresholdnumber
Weighted score a run must reach to be judged passed, in score_type's unit. Unchanged when omitted. When changing score_type, send pass_threshold and score_bands in the new unit too.
record_sessionboolean
Whether runs record a video of the browser session. Unchanged when omitted.
run_modestring
'code' replays a recorded run instead of driving the agent every time; 'agentic' judges each run afresh. Unchanged when omitted.one of agentic · code
score_bandsarray
Named ranges of the weighted score (e.g. "Optimal" from 75), each from its min to the next band; the lowest catches everything below. Labels only: pass_threshold decides the verdict. Replaces store...
score_typestring
What the weighted score is measured in, which also sets the unit of pass_threshold and score_bands. 'percent' (default): points earned over points available, 0 to 100. 'points': the points earned,...one of percent · points
score_unitvalue
What a points score counts, plural (e.g. "marks", "stars"). Null or omitted reads as "points". Ignored for percent.
urlstring
Target URL the actor opens. Pass null to clear it so runs target the project's own address; omit to leave it unchanged.
video_enabledboolean
Beta. Whether each finished run cuts a short narrated video of the outcome: every check with the steps that led to it, its verdict and its evidence screenshot. Off by default. Paid plans only; each...
delete_checklistDelete a checklist and its checks and runs. This permanently discards run history; prefer update_checklist, or simply not running a checklist, unless the user asks for deletion.1 params

Delete a checklist and its checks and runs. This permanently discards run history; prefer update_checklist, or simply not running a checklist, unless the user asks for deletion.

Parameters* required
checklist_id*string
Checklist UUID, from list_checklists or create_checklist.
list_feedbackList the comments stakeholders and users have left on a project through the feedback widget, newest first. Each one is pinned to a page position (often to a named element) and carries device info; filter by status "new" when triaging. Use summarise_feedback to turn a list of t...5 params

List the comments stakeholders and users have left on a project through the feedback widget, newest first. Each one is pinned to a page position (often to a named element) and carries device info; filter by status "new" when triaging. Use summarise_feedback to turn a list of t...

Parameters* required
limitinteger
Maximum comments to return, 1 to 200. Defaults to 50; total_matching reports how many matched.
page_pathstring
Only comments left on this exact page path (no host or query string), e.g. "/checkout". Omit for every page.
project_id*string
Project UUID, from list_projects.
sincestring
ISO 8601 timestamp, e.g. "2026-09-01T00:00:00Z"; only comments left at or after it. Omit for no lower bound.
statusstring
Only comments in this status: new (nobody has looked yet), reviewed (assessed, still open), resolved (confirmed fixed) or dismissed (will not act on it). Omit for every status.one of new · reviewed · resolved · dismissed
get_feedbackGet one feedback widget comment with its full reply thread, its page location and version, and a signed screenshot URL when one was captured. Find the id with list_feedback.1 params

Get one feedback widget comment with its full reply thread, its page location and version, and a signed screenshot URL when one was captured. Find the id with list_feedback.

Parameters* required
feedback_id*string
Comment (feedback) UUID, the `id` returned by list_feedback.
summarise_feedbackSummarise a project's comments into themes ranked by severity, open questions, and a self-contained implementation brief for a coding agent. Read the brief before proposing changes instead of reasoning over raw comments. The brief leaves out work an open question holds up; `an...3 params

Summarise a project's comments into themes ranked by severity, open questions, and a self-contained implementation brief for a coding agent. Read the brief before proposing changes instead of reasoning over raw comments. The brief leaves out work an open question holds up; `an...

Parameters* required
forceboolean
Regenerate even when the comments have not changed since the saved digest was written. Costs a model call; leave unset.
project_id*string
Project UUID, from list_projects.
scopestring
Which comments to cover: open (new + reviewed, the default), new, resolved (resolved + dismissed), or allone of open · new · resolved · all
update_feedback_statusUpdate a feedback widget comment's status: "reviewed" once assessed, "resolved" when confirmed fixed (ideally after a checklist run proves it), "dismissed" sparingly. The dashboard reflects the change immediately.2 params

Update a feedback widget comment's status: "reviewed" once assessed, "resolved" when confirmed fixed (ideally after a checklist run proves it), "dismissed" sparingly. The dashboard reflects the change immediately.

Parameters* required
feedback_id*string
Comment (feedback) UUID, the `id` returned by list_feedback.
status*string
The new status: new (nobody has looked yet), reviewed (assessed, still open), resolved (confirmed fixed) or dismissed (will not act on it).one of new · reviewed · resolved · dismissed
list_workflowsList workflows (multi-step automations) in a workspace, newest first, with their triggers, whether each is active, its step count and its last run. Call get_workflow on one for its steps and the order a run takes them.1 params

List workflows (multi-step automations) in a workspace, newest first, with their triggers, whether each is active, its step count and its last run. Call get_workflow on one for its steps and the order a run takes them.

Parameters* required
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
get_workflowGet a workflow with its steps, the edges connecting them, the order a run would reach them, and recent runs. Read this before editing steps: `execution_order` is what actually runs, and any id in `unreachable_step_ids` is a step no run will ever reach.1 params

Get a workflow with its steps, the edges connecting them, the order a run would reach them, and recent runs. Read this before editing steps: `execution_order` is what actually runs, and any id in `unreachable_step_ids` is a step no run will ever reach.

Parameters* required
workflow_id*string
Automation (workflow) UUID, from list_workflows or create_workflow.
run_workflowTrigger a workflow run now (async), whatever its trigger type: it executes the stored steps (see get_workflow), which can drive browsers, post PR comments and notify members. Returns a run ID; poll get_workflow_run. Refused over the plan limit or budget cap.1 params

Trigger a workflow run now (async), whatever its trigger type: it executes the stored steps (see get_workflow), which can drive browsers, post PR comments and notify members. Returns a run ID; poll get_workflow_run. Refused over the plan limit or budget cap.

Parameters* required
workflow_id*string
Automation (workflow) UUID, from list_workflows or create_workflow.
get_workflow_runGet a workflow run with step-level details. Poll this after run_workflow until status is terminal (completed, failed or cancelled).1 params

Get a workflow run with step-level details. Poll this after run_workflow until status is terminal (completed, failed or cancelled).

Parameters* required
run_id*string
Workflow run UUID, the run_id returned by run_workflow or a run id from get_workflow `recent_runs`.
create_workflowCreate a workflow (multi-step automation) that runs checks without anyone asking. Triggers: manual, schedule (cron), webhook, or vercel_event / github_event / cursor_event / linear_event / slack_event / figma_event so checklists re-run on deploys, pull requests, or design upda...6 params

Create a workflow (multi-step automation) that runs checks without anyone asking. Triggers: manual, schedule (cron), webhook, or vercel_event / github_event / cursor_event / linear_event / slack_event / figma_event so checklists re-run on deploys, pull requests, or design upda...

Parameters* required
descriptionstring
What the automation is for. Omit to leave it blank.
name*string
Display name, 1 to 200 characters, e.g. "Checkout smoke test on deploy".
project_idstring
Project UUID, from list_projects, to file the workflow under. Omit for a workspace-level workflow.
trigger_configobject
For schedule triggers include { cron, timezone } (timezone is an IANA name; when omitted it falls back to your get_me timezone, then UTC). For figma_event include { events: ["FILE_UPDATE" | "FILE_C...
trigger_typestring
What starts a run: manual (only run_workflow), schedule (cron), webhook (a signing secret is generated and shown only in the dashboard), or a provider event (vercel_event, github_event, cursor_even...one of manual · schedule · webhook · vercel_event · cursor_event · github_eventdefault: manual
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
update_workflowUpdate a workflow's name, description, or trigger. Only the fields you pass change. Syncs the Trigger.dev schedule when the cron or trigger type changes. The trigger fields edit the workflow's one trigger; a workflow with several triggers has them edited in the dashboard inste...5 params

Update a workflow's name, description, or trigger. Only the fields you pass change. Syncs the Trigger.dev schedule when the cron or trigger type changes. The trigger fields edit the workflow's one trigger; a workflow with several triggers has them edited in the dashboard inste...

Parameters* required
descriptionstring
New description, or null to clear it. Omit to keep the current one.
namestring
New display name, 1 to 200 characters. Omit to keep the current name.
trigger_configobject
Replaces the trigger config in full (not merged), same shape as create_workflow, e.g. { cron: "0 9 * * 1", timezone: "Australia/Sydney" }. A cron edit keeps the existing timezone unless you pass on...
trigger_typestring
New trigger type (manual, schedule, webhook, vercel_event, github_event, cursor_event, linear_event, slack_event, figma_event). Omit to keep the current one.one of manual · schedule · webhook · vercel_event · cursor_event · github_event
workflow_id*string
Automation (workflow) UUID, from list_workflows or create_workflow.
toggle_workflowActivate or pause a workflow. Scheduled workflows have their Trigger.dev schedule activated/deactivated to match. Activating a workflow that runs on a schedule, webhook or event needs the mcp:run scope, since it then starts runs on its own; pausing never does. Pausing keeps th...2 params

Activate or pause a workflow. Scheduled workflows have their Trigger.dev schedule activated/deactivated to match. Activating a workflow that runs on a schedule, webhook or event needs the mcp:run scope, since it then starts runs on its own; pausing never does. Pausing keeps th...

Parameters* required
is_active*boolean
true to activate the workflow so its trigger starts runs, false to pause it.
workflow_id*string
Automation (workflow) UUID, from list_workflows or create_workflow.
delete_workflowDelete a workflow and its steps and runs, and remove its schedule. This discards run history; prefer toggle_workflow to pause unless the user asks for deletion.1 params

Delete a workflow and its steps and runs, and remove its schedule. This discards run history; prefer toggle_workflow to pause unless the user asks for deletion.

Parameters* required
workflow_id*string
Automation (workflow) UUID, from list_workflows or create_workflow.
add_workflow_stepAdd a step to a workflow and connect it into the run. Only stores it: nothing executes until the workflow runs. Appends by default; `sort_order` splices it in at a position. In a run, run_checklist drives a real browser; notification emails or messages members on Slack; github...4 params

Add a step to a workflow and connect it into the run. Only stores it: nothing executes until the workflow runs. Appends by default; `sort_order` splices it in at a position. In a run, run_checklist drives a real browser; notification emails or messages members on Slack; github...

Parameters* required
config*value
Step configuration: the shape matching step_type. Any checklist, actor, topology or other id named here must belong to the same workspace.
sort_orderinteger
Zero-based position to insert at. Defaults to the end. Steps already at or after it move down.
step_type*string
What the step does: run_checklist, condition, notification, delay, github_comment, actor_pr_review, crawl_topology. Decides which config shape applies (see the description).one of run_checklist · condition · notification · delay · github_comment · actor_pr_review
workflow_id*string
Automation (workflow) UUID, from list_workflows or create_workflow.
update_workflow_stepChange a step's type or config in place, leaving its connections alone (move it with reorder_workflow_steps). Only stores the change. Config shapes are as in add_workflow_step.3 params

Change a step's type or config in place, leaving its connections alone (move it with reorder_workflow_steps). Only stores the change. Config shapes are as in add_workflow_step.

Parameters* required
configvalue
Replaces the step config in full: the shape matching the step type. Send every key the step needs, not a patch. Omit to keep the current config.
step_id*string
Workflow step UUID, from the `steps` array of get_workflow or the `id` returned by add_workflow_step.
step_typestring
New step type (run_checklist, condition, notification, delay, github_comment, actor_pr_review, crawl_topology). Omit to keep it. When changing type, also pass a config valid for the new type.one of run_checklist · condition · notification · delay · github_comment · actor_pr_review
remove_workflow_stepRemove a step and close the gap: whatever led into it is repointed at whatever it led to, so the rest of the automation still runs.1 params

Remove a step and close the gap: whatever led into it is repointed at whatever it led to, so the rest of the automation still runs.

Parameters* required
step_id*string
Workflow step UUID, from the `steps` array of get_workflow or the `id` returned by add_workflow_step.
reorder_workflow_stepsSet the order a workflow runs its steps in, as one linear sequence. Pass every step id: a list that leaves a step out is refused, since that step would be disconnected from the run (remove it with remove_workflow_step instead). This rewires the whole automation, so a branch bu...2 params

Set the order a workflow runs its steps in, as one linear sequence. Pass every step id: a list that leaves a step out is refused, since that step would be disconnected from the run (remove it with remove_workflow_step instead). This rewires the whole automation, so a branch bu...

Parameters* required
step_ids*array
Every step id in the workflow (from get_workflow `steps`), each exactly once, in the order they should run.
workflow_id*string
Automation (workflow) UUID, from list_workflows or create_workflow.
connect_workflow_stepsWire a step's output handle to another step, to build or repair a branch (adding and removing steps keeps the plain chain on their own). A condition's 'false' handle starts unconnected, so a failing condition ends the run. Connecting a connected handle replaces its edge; targe...4 params

Wire a step's output handle to another step, to build or repair a branch (adding and removing steps keeps the plain chain on their own). A condition's 'false' handle starts unconnected, so a failing condition ends the run. Connecting a connected handle replaces its edge; targe...

Parameters* required
branchvalue
Which handle the edge leaves. Only a condition has branches: 'true' is the path taken when it holds and 'false' the path when it does not. Everything else uses null, its single onward edge.
source_step_id*value
The step the edge leaves (a step id from get_workflow). null means the trigger, i.e. the workflow entry.
target_step_id*value
The step the edge arrives at (a step id from get_workflow), or null to leave the handle unconnected.
workflow_id*string
Automation (workflow) UUID, from list_workflows or create_workflow.
comment_on_prPost a comment on a GitHub pull request via the workspace GitHub connection. Use it to report checklist or interview results where engineers already look: a short verdict, then per-check outcomes with evidence highlights. Needs the Stunt Double GitHub App installed on the repo...5 params

Post a comment on a GitHub pull request via the workspace GitHub connection. Use it to report checklist or interview results where engineers already look: a short verdict, then per-check outcomes with evidence highlights. Needs the Stunt Double GitHub App installed on the repo...

Parameters* required
body*string
Comment body in GitHub-flavoured Markdown. Lead with a one-line verdict, then per-check outcomes, and link the run report rather than pasting full transcripts.
owner*string
GitHub repository owner (user or organisation), e.g. "vercel".
pr_number*integer
Pull request number, e.g. 42 for owner/repo#42.
repo*string
GitHub repository name without the owner, e.g. "next.js".
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
list_pull_requestsList pull requests for a GitHub repository via the workspace GitHub connection, most recently created first (up to 30). Use it to find the PR number to pass to get_pull_request or comment_on_pr.4 params

List pull requests for a GitHub repository via the workspace GitHub connection, most recently created first (up to 30). Use it to find the PR number to pass to get_pull_request or comment_on_pr.

Parameters* required
owner*string
GitHub repository owner (user or organisation), e.g. "vercel".
repo*string
GitHub repository name without the owner, e.g. "next.js".
statestring
Filter by PR state: open, closed (including merged) or all. Defaults to open.one of open · closed · all
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
get_pull_requestGet details for a GitHub pull request (title, description, author, branches, change stats) via the workspace GitHub connection. Read it before writing a checklist for the change, then report back with comment_on_pr.4 params

Get details for a GitHub pull request (title, description, author, branches, change stats) via the workspace GitHub connection. Read it before writing a checklist for the change, then report back with comment_on_pr.

Parameters* required
owner*string
GitHub repository owner (user or organisation), e.g. "vercel".
pr_number*integer
Pull request number, e.g. 42 for owner/repo#42.
repo*string
GitHub repository name without the owner, e.g. "next.js".
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
list_interviewsList the user interviews in a workspace, newest first, optionally filtered to one project. Returns summary rows; call get_interview for the discussion guide and participants, or get_interview_report for the findings.2 params

List the user interviews in a workspace, newest first, optionally filtered to one project. Returns summary rows; call get_interview for the discussion guide and participants, or get_interview_report for the findings.

Parameters* required
project_idstring
Project UUID, from list_projects. Only interviews in this project are returned; omit to list every interview in the workspace.
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
get_interviewGet an interview with its discussion guide (sections and their items, in order) and participants with their run status. Also useful for polling progress after launch_interview; call get_interview_report for the synthesised findings.1 params

Get an interview with its discussion guide (sections and their items, in order) and participants with their run status. Also useful for polling progress after launch_interview; call get_interview_report for the synthesised findings.

Parameters* required
interview_id*string
Interview UUID, from list_interviews or create_interview.
create_interviewCreate a user interview: AI persona participants complete tasks and answer questions against target_url, and results are synthesised into a report. target_url can be any reachable URL, including prototypes (Figma Make publish links, Claude design artifacts, v0) and preview dep...6 params

Create a user interview: AI persona participants complete tasks and answer questions against target_url, and results are synthesised into a report. target_url can be any reachable URL, including prototypes (Figma Make publish links, Claude design artifacts, v0) and preview dep...

Parameters* required
name*string
Interview name shown in the dashboard, 1 to 200 characters, e.g. "Pricing page comprehension".
project_id*string
Project UUID, from list_projects. The interview is filed under this project.
research_briefstring
What the team wants to learn; steers both the interviewer and the report. Omit to leave it blank.
target_url*string
Full URL participants start from, including the scheme, e.g. "https://staging.example.com/pricing".
usability_scalestring
Standardized usability questionnaire each participant answers after the guide: "umux" (four statements, comparable with SUS), "umux_lite" (two statements) or "none". get_interview_report then retur...one of none · umux · umux_lite
workspace_id*string
Workspace UUID, from list_workspaces. Every read and write is scoped to it.
update_interviewUpdate an interview’s name, target_url, research brief, status or usability questionnaire. Only the fields you pass change; pass at least one. To start a round use launch_interview rather than setting status to running.6 params

Update an interview’s name, target_url, research brief, status or usability questionnaire. Only the fields you pass change; pass at least one. To start a round use launch_interview rather than setting status to running.

Parameters* required
interview_id*string
Interview UUID, from list_interviews or create_interview.
namestring
New interview name, 1 to 200 characters. Omit to keep the current one.
research_briefstring
New research brief; pass null to clear it, omit to keep the current one.
statusstring
New interview status, e.g. "ready" once the guide is built. Omit to keep the current one.one of draft · ready · running · completed · failed
target_urlstring
New full URL participants start from, including the scheme. Omit to keep the current one.
usability_scalestring
Standardized usability questionnaire each participant answers after the guide: "umux" (four statements, comparable with SUS), "umux_lite" (two statements) or "none". get_interview_report then retur...one of none · umux · umux_lite
add_interview_sectionAdd a section to an interview’s discussion guide. Sections group related items (e.g. "First impressions", "Checkout"); add questions and tasks to it next with add_interview_item, using the returned id as section_id.4 params

Add a section to an interview’s discussion guide. Sections group related items (e.g. "First impressions", "Checkout"); add questions and tasks to it next with add_interview_item, using the returned id as section_id.

Parameters* required
interview_id*string
Interview UUID, from list_interviews or create_interview.
intro_scriptstring
What the interviewer says to open the section, setting context for its items. Omit for no introduction.
sort_orderinteger
Zero-based position in the guide (non-negative integer). Omit to append after the last section.
title*string
Section heading, 1 to 200 characters, e.g. "First impressions".
add_interview_itemAdd a question or task to an interview section (create the section first with add_interview_section). Tasks are concrete jobs to attempt in the product ("Find the annual plan price and compare it with monthly"); questions probe comprehension and sentiment. Set expected_evidenc...5 params

Add a question or task to an interview section (create the section first with add_interview_section). Tasks are concrete jobs to attempt in the product ("Find the annual plan price and compare it with monthly"); questions probe comprehension and sentiment. Set expected_evidenc...

Parameters* required
expected_evidencestring
What success looks like, so the report can judge the outcome, e.g. "States the annual price and how it compares with paying monthly". Recommended for tasks; omit for open questions.
prompt_text*string
What the interviewer asks or instructs, e.g. "Find the annual plan price and compare it with monthly".
section_id*string
Interview section UUID, from add_interview_section or the sections in get_interview.
sort_orderinteger
Zero-based position within the section (non-negative integer). Omit to append after the last item.
type*string
"task" for a job the participant attempts in the product, "question" for something they answer in their own words.one of question · task
add_interview_participantAttach a participant to an interview. Provide either actor_id (existing actor) or persona_spec (ad-hoc persona: name, bio, traits), not both. Vary personas and devices across participants (expertise, motivation, scepticism, mobile vs desktop) for richer findings, and use behav...6 params

Attach a participant to an interview. Provide either actor_id (existing actor) or persona_spec (ad-hoc persona: name, bio, traits), not both. Vary personas and devices across participants (expertise, motivation, scepticism, mobile vs desktop) for richer findings, and use behav...

Parameters* required
actor_idstring
Actor UUID from list_actors, to run an existing actor (with its knowledge) as the participant. Must belong to the interview’s workspace. Provide this or persona_spec.
behaviourobject
Optional behavioural sliders, each 0 to 100. They shape how the participant answers and how long it persists with a task, on top of its persona. Omit a trait to leave it to the persona.
devicestring
Browser viewport the participant uses: desktop, tablet or mobile. Defaults to "desktop".one of desktop · tablet · mobile
interview_id*string
Interview UUID, from list_interviews or create_interview.
localestring
BCP 47 locale for the browser and language, e.g. "en-US" or "fr-FR". Defaults to "en-AU".
persona_specobject
An ad-hoc persona for this interview only, with name, bio and traits. Provide this or actor_id.
get_interview_participantGet an interview participant including their full transcript from the interview run. Use this for verbatim evidence behind a report finding.1 params

Get an interview participant including their full transcript from the interview run. Use this for verbatim evidence behind a report finding.

Parameters* required
participant_id*string
Participant UUID, from the participants in get_interview or from add_interview_participant.
get_interview_reportGet an interview's synthesised report (summary, themes, recommendations, per-question rollup), plus `usability` (UMUX or UMUX-Lite scores when asked). Poll after launch_interview until report_status is completed or failed; report is null until generated.1 params

Get an interview's synthesised report (summary, themes, recommendations, per-question rollup), plus `usability` (UMUX or UMUX-Lite scores when asked). Poll after launch_interview until report_status is completed or failed; report is null until generated.

Parameters* required
interview_id*string
Interview UUID, from list_interviews or create_interview.
launch_interviewLaunch an interview round (async): every participant runs the discussion guide against the target URL in a real browser, and may call the allowed tools of MCP servers attached to the project (list_project_mcp_servers); then a report is synthesised. Requires at least one sectio...1 params

Launch an interview round (async): every participant runs the discussion guide against the target URL in a real browser, and may call the allowed tools of MCP servers attached to the project (list_project_mcp_servers); then a report is synthesised. Requires at least one sectio...

Parameters* required
interview_id*string
Interview UUID, from list_interviews or create_interview.
regenerate_interview_reportRegenerate the synthesized report from existing participant transcripts (async), e.g. after adding participants. Returns the trigger run ID; poll get_interview_report until report_status is completed or failed.1 params

Regenerate the synthesized report from existing participant transcripts (async), e.g. after adding participants. Returns the trigger run ID; poll get_interview_report until report_status is completed or failed.

Parameters* required
interview_id*string
Interview UUID, from list_interviews or create_interview.
get_index_reportGet a site's Stunt Double Index report: how well AI agents (ChatGPT, Claude, Gemini and others) can find, understand and act on it. Returns the score out of 100, band, rank, category and provider scores, frictions, failing checks and when it was scored. A blocked or opted-out...2 params

Get a site's Stunt Double Index report: how well AI agents (ChatGPT, Claude, Gemini and others) can find, understand and act on it. Returns the score out of 100, band, rank, category and provider scores, frictions, failing checks and when it was scored. A blocked or opted-out...

Parameters* required
domainstring
The site to read, e.g. "example.com". A full URL is fine: protocol, path and a leading www. are dropped. Pass this or project_id, not both.
project_idstring
Project UUID, from list_projects. Uses the Index domain linked to that project instead of naming one; fails if the project has no linked domain. Pass this or domain, not both.
list_index_sessionsList the agent sessions behind a site's Index score: one AI provider attempting one benchmark task in a real browser, with status, score, rubric evidence, a summary and the frictions it hit. Defaults to the latest run (pass run_id for another); filter by provider or category....6 params

List the agent sessions behind a site's Index score: one AI provider attempting one benchmark task in a real browser, with status, score, rubric evidence, a summary and the frictions it hit. Defaults to the latest run (pass run_id for another); filter by provider or category....

Parameters* required
categorystring
Only sessions for this category id, e.g. "checkout" or "discovery" (the category ids in get_index_report category_scores). Omit for every category.
domainstring
The site to read, e.g. "example.com". A full URL is fine: protocol, path and a leading www. are dropped. Pass this or project_id, not both.
limitinteger
Maximum sessions to return (default 50, max 100).
project_idstring
Project UUID, from list_projects. Uses the Index domain linked to that project instead of naming one; fails if the project has no linked domain. Pass this or domain, not both.
providerstring
Only sessions from this provider id, e.g. "claude" or "openai" (the provider ids in get_index_report provider_scores). Omit for every provider.
run_idstring
A specific scoring run UUID, e.g. the run_id request_index_rerun returned or one from an earlier call. Defaults to the newest run that has agent sessions.
search_index_domainsSearch the Stunt Double Index for sites by domain or name, or browse the leaderboard. Results are ordered by overall score, highest first, with rank, sector and when each was last scored; sites the Index could not score come last with a null score and an unscored_reason. Omit...3 params

Search the Stunt Double Index for sites by domain or name, or browse the leaderboard. Results are ordered by overall score, highest first, with rank, sector and when each was last scored; sites the Index could not score come last with a null score and an unscored_reason. Omit...

Parameters* required
limitinteger
Maximum results to return (default 20, max 50).
querystring
Part of a domain or site name, matched case-insensitively, e.g. "shop" or "stripe.com". Omit to browse the leaderboard from the top.
sectorstring
Only sites in this sector, e.g. "saas". Omit for every sector.one of ecommerce · saas · travel · finance · media · marketplace
request_index_rerunRe-score a site on the Index after it ships changes for agents: fresh probes, then about 24 agent sessions over a few minutes. Owner only (whoever claimed it, a work email on that domain while unclaimed, or a platform admin), once every 10 minutes. Poll list_index_sessions wit...2 params

Re-score a site on the Index after it ships changes for agents: fresh probes, then about 24 agent sessions over a few minutes. Owner only (whoever claimed it, a work email on that domain while unclaimed, or a platform admin), once every 10 minutes. Poll list_index_sessions wit...

Parameters* required
domainstring
The site to read, e.g. "example.com". A full URL is fine: protocol, path and a leading www. are dropped. Pass this or project_id, not both.
project_idstring
Project UUID, from list_projects. Uses the Index domain linked to that project instead of naming one; fails if the project has no linked domain. Pass this or domain, not both.
request_index_scoreAdd a site the Stunt Double Index does not track yet and give it a first score. Runs light HTTP probes (robots.txt, llms.txt, structured data, sitemaps) in under a minute; include_agent_sessions also starts live agent sessions, which may queue behind a shared daily budget. The...2 params

Add a site the Stunt Double Index does not track yet and give it a first score. Runs light HTTP probes (robots.txt, llms.txt, structured data, sitemaps) in under a minute; include_agent_sessions also starts live agent sessions, which may queue behind a shared daily budget. The...

Parameters* required
domain*string
The site to score, e.g. "docs.example.com". A full URL is fine: protocol, path and a leading www. are dropped.
include_agent_sessionsboolean
Also start the light set of live agent sessions after the probes. Defaults to false: probes only.

Sponsors

Readme

Stunt Double MCP server. Know where your users will get stuck, before they do. Beside it, Claude Code asks why the Parlour booking checklist failed on Monday and Stunt Double reports that nothing on the site changed: the earlier passes invented a phone number and card, and this time the agent followed its instructions and stopped at the Mobile field.

Stunt Double MCP Server

Deploy AI user personas to validate user journeys at scale. Find UX friction before real users do.

Stunt Double deploys AI agents with realistic user personas to validate user journeys at scale. Create actors, run automated workflows and checklists against any web app, and surface friction points before real users encounter them. Integrates with Claude, Linear, GitHub, and Slack.

Contents


View the full README on GitHub

Details

Repository
github.com/stunt-double/stuntdouble-mcp
Website
www.stuntdouble.io
Transport
HTTP
Registry
MCP registry, active
Resources
14
Prompts
10
Tools verified
Nov 6, 2026