
Stunt Double
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 stuntdoubleRun 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/mcpRun in your terminal. Add --scope user to make it available in every project.
Tools
Verified live · 69 toolsVerified 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.
idstringslugstringlist_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.
workspace_id*stringsearchSearch 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...
limitintegerproject_idstringquerystringtypesarrayworkspace_id*stringlist_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.
workspace_id*stringget_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.
project_id*stringcreate_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.
audiencestringcolorstringdescriptionstringname*stringproduct_descriptionstringurlstringworkspace_id*stringlist_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...
project_id*stringlist_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...
include_disabledbooleanworkspace_id*stringadd_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...
apply_to_design_reviewsbooleancategory*stringdesign_system · tone_of_voice · brand · content · accessibility · compliancecontent*stringproject_idsarraytitlestringworkspace_id*stringupdate_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.
apply_to_design_reviewsbooleancategorystringdesign_system · tone_of_voice · brand · content · accessibility · compliancecontentstringenabledbooleanguideline_id*stringtitlestringworkspace_id*stringremove_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.
guideline_id*stringworkspace_id*stringlist_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...
include_disabledbooleanproject_id*stringadd_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...
category*stringdesign_system · tone_of_voice · brand · content · accessibility · compliancecontent*stringproject_id*stringtitlestringset_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...
attachedbooleanenabledbooleanguideline_id*stringproject_id*stringlist_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.
workspace_id*stringget_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.
actor_id*stringcreate_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...
descriptionstringname*stringworkspace_id*stringupdate_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.
actor_id*stringcapabilitiesobjectdescriptionstringnamestringstatusstringactive · archivedsystem_promptstringlist_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...
actor_id*stringadd_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),...
actor_id*stringcontent*stringkindstringexpertise · process · reference · accounttitle*stringremove_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.
knowledge_id*stringlist_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.
actor_idstringworkspace_id*stringget_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.
conversation_id*stringlist_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.
workspace_id*stringget_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.
checklist_id*stringget_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...
run_id*stringflag_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.
clearbooleannotestringresult_id*stringworkspace_id*stringrun_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...
checklist_id*stringretain_memorybooleancreate_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...
actor_id*stringchecks*arrayinstructions*stringname*stringpass_thresholdnumberproject_idstringrecord_sessionbooleanrun_modestringagentic · codescore_bandsarrayscore_typestringpercent · pointsscore_unitvalueurlstringworkspace_id*stringupdate_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...
actor_idstringcarry_over_notesbooleanchecklist_id*stringchecksarrayinstructionsstringnamestringpass_thresholdnumberrecord_sessionbooleanrun_modestringagentic · codescore_bandsarrayscore_typestringpercent · pointsscore_unitvalueurlstringvideo_enabledbooleandelete_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.
checklist_id*stringlist_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...
limitintegerpage_pathstringproject_id*stringsincestringstatusstringnew · reviewed · resolved · dismissedget_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.
feedback_id*stringsummarise_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...
forcebooleanproject_id*stringscopestringopen · new · resolved · allupdate_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.
feedback_id*stringstatus*stringnew · reviewed · resolved · dismissedlist_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.
workspace_id*stringget_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.
workflow_id*stringrun_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.
workflow_id*stringget_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).
run_id*stringcreate_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...
descriptionstringname*stringproject_idstringtrigger_configobjecttrigger_typestringmanual · schedule · webhook · vercel_event · cursor_event · github_eventdefault: manualworkspace_id*stringupdate_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...
descriptionstringnamestringtrigger_configobjecttrigger_typestringmanual · schedule · webhook · vercel_event · cursor_event · github_eventworkflow_id*stringtoggle_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...
is_active*booleanworkflow_id*stringdelete_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.
workflow_id*stringadd_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...
config*valuesort_orderintegerstep_type*stringrun_checklist · condition · notification · delay · github_comment · actor_pr_reviewworkflow_id*stringupdate_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.
configvaluestep_id*stringstep_typestringrun_checklist · condition · notification · delay · github_comment · actor_pr_reviewremove_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.
step_id*stringreorder_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...
step_ids*arrayworkflow_id*stringconnect_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...
branchvaluesource_step_id*valuetarget_step_id*valueworkflow_id*stringcomment_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...
body*stringowner*stringpr_number*integerrepo*stringworkspace_id*stringlist_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.
owner*stringrepo*stringstatestringopen · closed · allworkspace_id*stringget_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.
owner*stringpr_number*integerrepo*stringworkspace_id*stringlist_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.
project_idstringworkspace_id*stringget_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.
interview_id*stringcreate_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...
name*stringproject_id*stringresearch_briefstringtarget_url*stringusability_scalestringnone · umux · umux_liteworkspace_id*stringupdate_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.
interview_id*stringnamestringresearch_briefstringstatusstringdraft · ready · running · completed · failedtarget_urlstringusability_scalestringnone · umux · umux_liteadd_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.
interview_id*stringintro_scriptstringsort_orderintegertitle*stringadd_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...
expected_evidencestringprompt_text*stringsection_id*stringsort_orderintegertype*stringquestion · taskadd_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...
actor_idstringbehaviourobjectdevicestringdesktop · tablet · mobileinterview_id*stringlocalestringpersona_specobjectget_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.
participant_id*stringget_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.
interview_id*stringlaunch_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...
interview_id*stringregenerate_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.
interview_id*stringget_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...
domainstringproject_idstringlist_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....
categorystringdomainstringlimitintegerproject_idstringproviderstringrun_idstringsearch_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...
limitintegerquerystringsectorstringecommerce · saas · travel · finance · media · marketplacerequest_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...
domainstringproject_idstringrequest_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...
domain*stringinclude_agent_sessionsbooleanSponsors
Readme
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
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