Stunt Double

io.stuntdoublePublished by stuntdouble.ioOfficial publisherv1.17.0Updated Nov 5, 2026

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

Overview

AI-generated overview

Stunt Double runs AI user personas in real browsers against any URL, letting an assistant create and run QA checklists, interviews and workflows and read…

What you can do
  • Find and manage workspaces, projects, members and standing guidelines
  • Create and edit AI personas (actors) and the knowledge they carry into runs
  • Create, run and inspect browser checklists with per-check results, evidence and verdict corrections
  • Build and trigger multi-step workflows, and read their step graphs and runs
  • Run structured user interviews with personas and read synthesised reports
  • Triage feedback widget comments, summarise themes, and read or comment on GitHub pull requests
When to use it
Useful when a design, prototype or preview deploy needs user-style validation before real users see it, when critical flows should be re-checked on a schedule or on deploy, when brand, design-system or compliance standards must be enforced with evidence, or when stakeholder feedback needs triage into a brief.
Requirements
A remote Streamable HTTP endpoint with OAuth 2.1 with PKCE sign-in; no API keys. A Stunt Double account with at least one workspace, and granted scopes (mcp:read, mcp:write, mcp:run) that decide which tools appear. Clients that only run local stdio servers need a bridge such as mcp-remote.
Before you install
Runs consume the workspace plan and run allowance and are refused over the budget cap. Write tools create, edit and permanently delete projects, checklists, workflows, guidelines and knowledge; deleting a checklist or workflow discards its run history. Runs drive real browsers against reachable URLs and may post PR comments and notify members. The connection acts as your account within your workspaces only.

Installation

In SourceWeft

  1. Open Stunt Double in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.stuntdouble%2Fmcp-server/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "stunt-double": {
      "type": "http",
      "url": "https://app.stuntdouble.io/api/mcp"
    }
  }
}

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

[stuntdouble on npm]

[A Claude Code session asking why the Parlour booking checklist failed on Monday. Claude calls Stunt Double, compares the failing run with the two passing runs before it and explains that the agent stopped at the required Mobile field, and that the earlier passes only got through by inventing a phone number and card.]

This repository

This repo holds plugin and MCP configuration (.claude-plugin/plugin.json and .mcp.json for Claude, .cursor-plugin/plugin.json, marketplace.json and root mcp.json for Cursor, server.json for the MCP registry), plus skills, agents, and Cursor rules. There is no package.json and no server code here: the MCP endpoint is hosted at https://app.stuntdouble.io/api/mcp from the main Stunt Double codebase, and the Claude plugin's local server is the published stuntdouble npm package from StuntKit. See CONTRIBUTING.md for how to validate edits and avoid confusing this folder with a Node package.

Quick Start

Claude Code

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

Claude Code plugin

The repository is also a Claude plugin: it bundles the hosted MCP server and the Stunt Double Studio server (.mcp.json) with the skills in skills/, the agents in agents/ and the Studio hooks in hooks/.

bash
claude plugin marketplace add stunt-double/stuntdouble-mcpclaude plugin install stuntdouble@stuntdouble

Type /stuntdouble: to list the plugin's skills. The Studio ones are /stuntdouble:setup, /stuntdouble:run, /stuntdouble:open, /stuntdouble:cloud and /stuntdouble:doctor.

Skills (any agent)

The skills in skills/ install into Claude Code, Cursor, Codex, OpenCode and other agents that read SKILL.md files, using the skills CLI. They drive the MCP server above, so connect that too.

bash
npx skills add stunt-double/stuntdouble-mcp                          # pick from the listnpx skills add stunt-double/stuntdouble-mcp --skill verify-change     # just one
SkillWhat it does
check-agent-readinessCheck how well AI agents (ChatGPT, Claude, Gemini, Perplexity and others) can find, understand and act on a website using the Stunt Double Index, explain the score from real agent sessions, compare against peers, and re-score after fixes
check-brandAudit a product or site against brand and tone-of-voice guidelines
check-complianceCheck a product against legal and compliance requirements on Stunt Double (cookie consent, privacy and terms access, required disclosures, claim substantiation, unsubscribe flows) and collect evidence for counsel to review
check-continuityCheck continuity across surfaces on Stunt Double
check-design-systemAudit a live product against its design system on Stunt Double
cloud/stuntdouble:cloud <checklist>: push a Studio checklist to a workspace, run it there and pull it back. Needs the Claude Code plugin
create-actor-panelCreate and configure a Stunt Double actor (AI persona) with knowledge entries for realistic user simulation
design-reviewRun a design review session by gathering feedback from multiple Stunt Double actors on a proposed design or flow
doctor/stuntdouble:doctor: check Node, Chrome, the viewer port and how local runs are billed. Needs the Claude Code plugin
maintain-automationsChange an existing Stunt Double automation or checklist without losing run history: retime triggers, edit and rewire workflow steps, build condition branches, update checks in place, and pause or retire what is no longer needed
open/stuntdouble:open: open the Studio viewer over every run. Needs the Claude Code plugin
run/stuntdouble:run <checklist> [resume]: run a Studio checklist in a local Chrome. Needs the Claude Code plugin
run-qa-suiteRun the full Stunt Double QA suite
run-user-interviewPlan, configure, and launch a structured user interview with AI participants on Stunt Double, then read back the synthesised report
run-ux-validationValidate a user journey by running Stunt Double workflows or checklists and reporting the results
setup/stuntdouble:setup for Stunt Double Studio: ready the project for local runs (dev server, actor and checklists, CLAUDE.md notes, permission and hooks). Needs the Claude Code plugin
setup-guardrailsStand up continuous guardrails on Stunt Double
triage-feedbackReview, categorize, and manage Stunt Double feedback submissions across projects
verify-changeVerify a shipped or previewed code change by running a Stunt Double actor through the affected user flows, and optionally report results on the pull request

Claude (web, Desktop, mobile)

Go to Settings → Connectors → Add custom connector and paste:

https://app.stuntdouble.io/api/mcp

ChatGPT and Codex

The repository also carries an OpenAI plugin manifest (.openai-plugin/plugin.json, in the Agent Plugins format) with the directory listing, review test cases and release notes. node scripts/build-openai-plugin.mjs checks it against OpenAI's limits and writes dist/stuntdouble-openai-plugin.zip (in the Codex layout the portal accepts: the manifest as .codex-plugin/plugin.json, a .mcp.json for the hosted server, the skills and the logos), which is what goes into the plugin submission portal.

Until it is published in the directory, connect it in ChatGPT developer mode (Settings → Apps → Advanced) as a custom connector with:

https://app.stuntdouble.io/api/mcp

The checklist run and Index report tools render as cards in ChatGPT (and in other MCP Apps hosts, Claude among them).

Codex CLI

bash
codex mcp add stuntdouble --url https://app.stuntdouble.io/api/mcpcodex mcp login stuntdouble

Or add it to ~/.codex/config.toml by hand and then run codex mcp login stuntdouble:

toml
[mcp_servers.stuntdouble]url = "https://app.stuntdouble.io/api/mcp"

Gemini CLI

bash
gemini mcp add --transport http stuntdouble https://app.stuntdouble.io/api/mcp

Or add it to ~/.gemini/settings.json (or .gemini/settings.json in a project):

json
{  "mcpServers": {    "stuntdouble": {      "httpUrl": "https://app.stuntdouble.io/api/mcp"    }  }}

Run /mcp auth stuntdouble inside Gemini CLI to sign in.

VS Code (GitHub Copilot)

bash
code --add-mcp '{"name":"stuntdouble","type":"http","url":"https://app.stuntdouble.io/api/mcp"}'

Or add it to .vscode/mcp.json in a workspace (or run MCP: Open User Configuration for every workspace):

json
{  "servers": {    "stuntdouble": {      "type": "http",      "url": "https://app.stuntdouble.io/api/mcp"    }  }}

The tools appear in Copilot Chat's agent mode.

OpenCode

Add it to opencode.json in a project (or ~/.config/opencode/opencode.json), then run opencode mcp auth stuntdouble:

json
{  "$schema": "https://opencode.ai/config.json",  "mcp": {    "stuntdouble": {      "type": "remote",      "url": "https://app.stuntdouble.io/api/mcp"    }  }}

Windsurf

Add it to ~/.codeium/windsurf/mcp_config.json (or Windsurf Settings → Cascade → MCP Servers → View raw config):

json
{  "mcpServers": {    "stuntdouble": {      "serverUrl": "https://app.stuntdouble.io/api/mcp"    }  }}

Other clients

Any client that speaks Streamable HTTP and OAuth can connect to https://app.stuntdouble.io/api/mcp directly. For a client that only runs local (stdio) servers, bridge it with mcp-remote, which handles the OAuth sign-in:

json
{  "mcpServers": {    "stuntdouble": {      "command": "npx",      "args": ["-y", "mcp-remote", "https://app.stuntdouble.io/api/mcp"]    }  }}

Cursor

This repository is a Cursor plugin: .cursor-plugin/plugin.json and .cursor-plugin/marketplace.json, root mcp.json (the hosted MCP server), plus the skills in skills/, rules in rules/, and agents in agents/. The plugin logo is assets/logo.png. Auth is OAuth 2.1 with PKCE; no API keys.

Install as a plugin (recommended): once published, install Stunt Double from the Cursor marketplace. For a team marketplace or local clone, add this repo as a marketplace and install the stuntdouble plugin; Cursor discovers the MCP server, skills, rules and agents from the default folders.

MCP only (no skills, rules or agents): add the block below to a Cursor MCP config:

  • Project-local: .cursor/mcp.json at the root of your project.
  • Global (all projects): ~/.cursor/mcp.json on macOS/Linux (see Cursor MCP docs for your OS).
json
{  "mcpServers": {    "stuntdouble": {      "url": "https://app.stuntdouble.io/api/mcp"    }  }}

Use only url for remote servers (Streamable HTTP is negotiated automatically). Extra keys such as "type": "streamable-http" are not part of Cursor's documented mcp.json shape and can break plugin validation.

The server.json file is the separate MCP registry manifest for mcp-publisher and directory listings; Cursor's installer does not use it.

Stunt Double Studio

Run checklists against localhost, staging or production from Claude Code, free and with no account. Your own Claude Code session is the actor: the plugin's local server drives a local Chrome, keeps each run as files in your project and serves a viewer where you watch a run live or stop it. Local runs count against your Claude plan, or your API key when Claude Code uses one; Stunt Double makes no model calls.

Install the Claude Code plugin, then:

CommandWhat it does
/stuntdouble:setupReadies the project: finds the dev server, drafts an actor and checklists from your routes, and adds the CLAUDE.md notes, tool permission and hooks, each change shown before it is written
/stuntdouble:run <checklist> [resume]Runs the checklist in a local Chrome and reports each failed check with its evidence
/stuntdouble:openOpens the viewer: every run with its verdicts, screenshots and activity
/stuntdouble:cloud <checklist>Pushes the same actor and checklist to a Stunt Double workspace, runs it there and pulls it back
/stuntdouble:doctorChecks Node, Chrome, the viewer port and how local runs are billed

A run is carried out by the stuntdouble:stuntdouble-actor subagent, whose only tools are the local browser and run tools, so page text and screenshots stay out of your main conversation. Those tools are navigate, read_page, find, get_page_text, click, type, form_input, key, scroll, screenshot, start_run, evaluate_check and finish_run; the server's open_ui returns the viewer link. The local server is npx [email protected] mcp (source), pinned to an exact version in each plugin release. Claude Code starts it with each session (npx adds about 1.5 seconds), and the browser and viewer start only on the first run. It needs Node 22.18 or later and Google Chrome (or Playwright's Chromium). On native Windows the server does not start yet, since Claude Code needs cmd /c npx there: use WSL.

Everything lives in .stuntdouble/: stuntdouble.json, hooks.json, actors/, checklists/ and runs/, each run with its run.json, an activity.jsonl of every action and a screenshot per verdict. Actors and checklists are the hosted create_actor and create_checklist inputs, so /stuntdouble:cloud pushes them unchanged (except browser_config, which the cloud does not take yet, so cloud runs use the default desktop browser) and writes the cloud ids back. Commit the folder (its .gitignore leaves out .live/) and your team gets the same checklists and run history; npx stuntdouble view opens the viewer over it without Claude Code.

Hooks

/stuntdouble:setup also writes .stuntdouble/hooks.json, which switches on two Claude Code hooks that ship in the plugin (hooks/hooks.json). Without that file they do nothing, in well under 100 ms.

HookWhenWhat it adds to the session
session_summarySession startThe project's checklists, the latest run's outcome and pass count, and that /stuntdouble:run is there
suggest_after_editAfter an Edit, Write or MultiEdit to a UI fileA note to offer the checklists that cover the file before finishing, once per checklist per session. Never starts a run
json
{  "format": "stuntdouble.hooks/1",  "session_summary": true,  "suggest_after_edit": true,  "ui_globs": ["app/**/*.{tsx,jsx,css}", "components/**/*.{tsx,jsx}"],  "checklists_for": { "checkout": ["app/checkout/**", "components/cart/**"] }}

ui_globs decides which edits count as UI changes; checklists_for maps a checklist to the files it covers, and an edit no entry matches suggests the rest once per session. Edits made inside a subagent are skipped. Globs are relative to the project root and take **, *, ? and {a,b}. To switch a hook off for the project, set it to false; to switch both off, delete the file. The file is committed with the rest of .stuntdouble/, so to switch the hooks off for yourself only, set STUNTDOUBLE_HOOKS=off in your shell or under env in .claude/settings.local.json. The hooks are Claude Code only: the Cursor plugin and the ChatGPT and Codex package leave them out.

Local or cloud

Local (free, no account)Cloud
ModelYour Claude Code session and planStunt Double's managed models; your plan untouched
BrowserLocal Chrome, a fresh profile per run, logins kept only if opted inHosted browsers with proxies, locations, recording, live view and person-steered assists
TargetsLocalhost, intranet, staging, productionPublic URLs; private ones through devices on Startup
WhenOne run at a time while your session is openParallel, unattended and scheduled; deploy, PR and Figma triggers; workflows
VerdictsSelf-judged by the actor, citation-checked, scored as in the cloudAn independent result judge, carry-over notes, corrections, comparison and alerts
TeamGit, with the cloud ids in the filesSeats, shared reports, Slack, Linear and GitHub PR comments
ResearchChecklistsInterviews, design reviews, synthesis and Index scoring

See pricing for the cloud plans. The local server runs only in Claude Code for now: the Cursor mcp.json and the ChatGPT and Codex package carry the hosted server alone.

Authentication

Authentication is handled automatically via OAuth 2.1 with PKCE. The first time your AI client connects, a browser window will open for you to sign in and authorise access to your Stunt Double account. No API keys or tokens required.

For Cursor, the OAuth redirect URI is fixed to cursor://anysphere.cursor-mcp/oauth/callback (docs).

What a connection can reach

The server acts as you, never more. Every tool resolves the workspace it is being asked about and checks your membership of it before doing anything, so a connection reaches exactly the workspaces list_workspaces returns for you, and an archived workspace reaches nothing. A workspace you are not a member of answers the same way one that does not exist does: "not found".

That holds for ids too, not just the workspace_id you pass. A tool that takes another object's id (a checklist for an automation step, an actor for an interview participant) checks that object belongs to the same workspace before storing or running it, and refuses with "not found in this workspace" otherwise. Refusals never say which workspace an id does belong to.

Scopes narrow this further, never widen it. The consent screen names what the connection asked for, and a token granted mcp:read is not shown the write or run tools at all: they are absent from tools/list rather than present and failing.

ScopeWhat it allows
mcp:readRead your workspaces and their contents
mcp:writeCreate and edit content in your workspaces
mcp:runStart checklist runs, automation runs and interviews, which consume the workspace run allowance, re-run Stunt Double Index scores for domains you own, and add sites the Index does not track yet

Available Tools

Account

ToolDescription
get_meThe account this connection acts as: id, email, name, timezone, notification channel

Notification channel and timezone are account settings rather than workspace ones, so they are the same answer in every workspace. Pass the timezone when creating a scheduled workflow, or "every weekday at 9" becomes nine in UTC.

Workspaces

ToolDescription
list_workspacesList your workspaces
get_workspaceGet workspace details by ID or slug, including its admin-set controls (settings)
list_workspace_membersList members of a workspace

get_workspace reports the workspace security controls under settings: public sharing, the feedback widget, self-hosted workers, and the network policy. They are ceilings set by an admin, so a feature switched off there cannot be switched back on for a single project.

Search

ToolDescription
searchSearch a workspace across projects, actors, checklists, interviews, automations, issues, goals, feedback, actor knowledge, insights, design reviews, project resources and conversations. Ranked, with optional filters

search takes a workspace_id plus an optional query, types filter, project_id filter and limit (max 50). Terms are matched as prefixes, so a partial word is enough. Omit query to browse the most recently updated items. Results carry the id you need for the matching getter, so it is usually cheaper than listing an entity type and filtering the list yourself. Reach for it before creating anything, to find the actor or checklist that already covers the job.

Projects

ToolDescription
list_projectsList projects in a workspace
get_projectGet a project (the product tracked by checklists, workflows, feedback)
create_projectCreate a project (a product to track with checklists, workflows, feedback)
list_project_mcp_serversThe MCP servers this project's runs can reach

A project is archived, never deleted, and an archived project reads as missing from every tool here. Registering an MCP server and attaching it to a project are workspace-admin actions in the dashboard; list_project_mcp_servers is how you check what tools a run will actually have before writing a checklist that depends on one.

Guidelines

Standing rules the team holds the product to: design system, tone of voice, brand, content, accessibility, compliance, security, performance, or shared knowledge. A guideline is owned by the workspace and attached to the projects it applies to, so one rule can hold for every project without being retyped. Whatever is in force is rendered into every checklist run, design review, interview and triage for that project.

ToolDescription
list_workspace_guidelinesThe workspace library, with how many projects hold each rule
add_workspace_guidelineAdd a rule to the library, optionally attaching it to projects
update_workspace_guidelineEdit a rule, switch it off, or apply it to every design review in the workspace
remove_workspace_guidelineRemove a rule from the library, detaching it from every project
list_project_guidelinesThe rules this project is held to
add_project_guidelineRecord a rule and hold this project to it
set_project_guidelineAttach a library rule to a project, detach it, or switch it off there

Two switches decide whether a rule is in force for a project: the library's enabled and the attachment's. list_project_guidelines folds them into one enabled so you never have to reason about both. A rule with apply_to_design_reviews set also holds for design reviews raised from Slack or Linear, which carry no project to attach it through.

Codify a standard as a guideline rather than repeating it in each checklist, and search the library before writing a new rule: attaching the one that already exists keeps the team's standard in a single place to edit.

Actors

ToolDescription
list_actorsList active actors in a workspace
get_actorGet actor details including system prompt and capabilities
create_actorCreate a new actor in a workspace
update_actorUpdate actor name, description, system prompt, capabilities, or status. Set status to "archived" to soft-delete

Knowledge

ToolDescription
list_actor_knowledgeList knowledge entries for an actor
add_actor_knowledgeAdd a knowledge entry to an actor
remove_actor_knowledgeRemove a knowledge entry

Conversations

ToolDescription
list_conversationsList conversations, optionally filtered by actor
get_conversationGet a conversation with its messages

Checklists

ToolDescription
list_checklistsList checklists in a workspace
get_checklistGet checklist details, checks, and recent runs
get_checklist_runGet a checklist run with per-check results
run_checklistTrigger a checklist run (async). Returns run ID
create_checklistCreate a browser-based QA checklist (host via project or URL, actor, instructions, checks)
update_checklistUpdate a checklist (pass checks to replace the full set)
delete_checklistDelete a checklist and its checks and runs

Workflows

A workflow is a graph, not a list: its steps run by following the connections between them. The step tools maintain those connections, so adding, removing and reordering steps is enough to build one. connect_workflow_steps is only needed to branch.

ToolDescription
list_workflowsList workflows in a workspace
get_workflowGet a workflow with its steps, edges, the order a run takes, and recent runs
run_workflowTrigger a workflow run (async). Returns run ID
get_workflow_runGet a workflow run with step-level details
create_workflowCreate a workflow (multi-step automation)
update_workflowUpdate a workflow's name, description, or trigger
toggle_workflowActivate or pause a workflow
delete_workflowDelete a workflow and its steps and runs
add_workflow_stepAdd a step and connect it into the run
update_workflow_stepChange a step's type or config in place
remove_workflow_stepRemove a step and close the gap it leaves
reorder_workflow_stepsSet the order the steps run in
connect_workflow_stepsWire one step to another, for a condition's True and False paths

Feedback

ToolDescription
list_feedbackList feedback for a project, newest first
get_feedbackGet a feedback submission with its replies
update_feedback_statusUpdate feedback status

GitHub

ToolDescription
list_pull_requestsList pull requests for a GitHub repository
get_pull_requestGet details for a GitHub pull request (title, author, branches, stats)
comment_on_prPost a comment on a GitHub pull request

Interviews

Structured user interviews: actors or generated personas run through a discussion guide (sections + questions/tasks) against a target URL, then Stunt Double synthesises themes and recommendations.

ToolDescription
list_interviewsList interviews in a workspace, optionally filtered by project
get_interviewGet an interview with its discussion guide (sections + items) and participants
create_interviewCreate a new interview in a project (name, target URL, research brief)
update_interviewUpdate an interview's name, target URL, research brief, or status
add_interview_sectionAdd a section to the discussion guide
add_interview_itemAdd a question or task to a section
add_interview_participantAttach a participant, either an existing actor or an ad-hoc persona_spec
get_interview_participantGet a participant including their full transcript from the run
get_interview_reportGet the current synthesised report (summary, themes, recommendations, per-question rollup)
launch_interviewLaunch the interview round (async). Returns the trigger run ID
regenerate_interview_reportRe-run synthesis on existing transcripts (async). Returns the trigger run ID

Prompts

Most MCP clients (Claude, Claude Code, Cursor) surface these as slash commands. Each is a self-contained recipe: which tools to call, in what order, and how to report back.

PromptDescription
validate_designValidate a live design, prototype, or preview URL (Figma Make, Claude artifact, v0, staging) with AI personas
verify_changeVerify a shipped or previewed code change by running an actor through the affected flows, optionally commenting on the PR
run_user_researchRun a structured multi-persona interview study and synthesise themes and recommendations
triage_feedbackTriage user feedback on a project: cluster it, reproduce issues with an actor, and update statuses
setup_guardrailsStand up checklists for critical flows plus a workflow that re-runs them on a schedule or on deploy/PR events
check_brandAudit a product against brand and tone-of-voice guidelines, flagging deviations with evidence
check_design_systemAudit a live product against its design system (typography, colour, spacing, components) on rendered pages
check_complianceCheck a product against legal and compliance requirements and collect evidence for counsel to review
check_continuityCheck continuity across surfaces (pricing, terminology, promises) between marketing, product, docs, and emails
stuntdouble_guideOrientation for Stunt Double: what it does, when to reach for it, and the full tool catalogue

Resources

Read-only context a client can attach without calling a tool. The guide and the connection are always listed; the workspace resources need mcp:read, the same as the tools that return that data.

URIMIME typeDescription
stuntdouble://guidetext/markdownWhat Stunt Double does, when to reach for it, the full tool catalogue and how to poll a run
stuntdouble://connectionapplication/jsonWho the connection acts as, the scopes it holds, the tools each unlocks and any it lacks
stuntdouble://workspacesapplication/jsonThe workspaces the connection can reach, with your role (same data as list_workspaces)
stuntdouble://workspaces/{workspace_id}/projectsapplication/jsonThe live projects in one workspace, most recently opened first (same data as list_projects)

resources/list includes one projects entry per workspace, so a client can browse them without expanding the template.

Stunt Double Index

The Stunt Double Index is a public ranking of how AI agents experience websites: each tracked domain is scored out of 100 from HTTP probes plus live agent sessions, one per AI provider and benchmark task. Index data is public rather than workspace data, so the read tools reach any tracked site.

ToolDescription
get_index_reportA site's score, band, rank, category and provider scores, frictions, failing probe checks and when it was last scored. An unscored site says why
list_index_sessionsThe agent sessions behind a score (newest run by default, or pass run_id), with status, score, evidence, a summary and frictions. Filter by provider or category
search_index_domainsFind a site by domain or name (query), or browse the leaderboard, optionally by sector
request_index_rerunRe-score a domain you own (mcp:run). Fresh probes now, about 24 agent sessions over a few minutes
request_index_scoreAdd a site the Index does not track yet and give it a first score (mcp:run). Light HTTP probes by default; include_agent_sessions also starts live agent sessions

get_index_report, list_index_sessions and request_index_rerun take a domain, or a project_id to use the Index domain linked to that project (which checks your membership like any project read). A full URL is fine as a domain: the protocol, path and a leading www. are dropped.

Only the domain's owner can re-run it: whoever claimed it or, while it is unclaimed, an account with a work email on that domain. A domain can be re-run once every 10 minutes. After a re-run, poll list_index_sessions with the returned run_id about every 60 seconds until the sessions finish, then read get_index_report.

request_index_score is open to any signed-in account. It scores public web domains only, respects robots.txt and X-Robots-Tag opt-outs, and never rescores a site the Index already tracks (it answers already_tracked; use request_index_rerun for that). The site becomes public on the leaderboard. The probes finish in under a minute; agent sessions asked for with include_agent_sessions draw on a shared daily budget, so they may be queued to run later that day (agent_sessions is then deferred or retrying). Read get_index_report for the probe score straight away, and poll list_index_sessions with the run_id if sessions started.

No account needed for the read tools: search_index_domains, get_index_report and list_index_sessions are also served, read-only and with no sign-in, at https://app.stuntdouble.io/api/mcp/index. Connect any MCP client to that URL and leave the OAuth fields empty. It carries only those three tools, and project_id does not resolve there, so pass a domain. request_index_rerun and request_index_score need the signed-in server.

Example prompts

Four prompts that exercise the core of the server once it is connected:

  1. Verify a flow: "Create a checklist that completes the checkout on https://checkout.demo.stuntdouble.io and reaches the confirmation page, then run it and tell me which checks failed."
  2. Run a user interview: "Set up an interview with three personas (a first-time diner, a regular and a screen reader user) about booking a table on https://parlour.demo.stuntdouble.dev, launch it, and summarise the report."
  3. Check agent readiness: "How well can AI agents use stripe.com according to the Stunt Double Index, and which categories are dragging its score down?"
  4. Triage feedback: "Summarise the open feedback on my main project, group it into themes, and mark anything already fixed as resolved."

Demo targets

Try the server without pointing it at your own product. These public demo apps have deliberate defects for actors to find, so runs never touch real customers:

AppWhat
checkout.demo.stuntdouble.ioTrailhead Outfitters: a one-page checkout
flights.demo.stuntdouble.ioSkyline Fares: one-way flight search, results, booking and confirmation
parlour.demo.stuntdouble.devOndine, on Parlour: a restaurant booking flow with a deposit

Privacy Policy

The server is hosted by Stunt Double and acts as the signed-in user. It reads and writes only the workspaces that user belongs to, within the OAuth scopes they grant (mcp:read, mcp:write, mcp:run). It does not read your conversation with the AI client beyond the arguments passed to each tool call, and it does not access the client's memory, chat history or files.

Data created through the server (projects, actors, checklists, runs, interviews, feedback) is stored in your Stunt Double workspace and handled under the Stunt Double Privacy Policy, which covers collection, use, storage, sub-processors, retention and your rights. Revoke a connection at any time by disconnecting it in your AI client.

Support

Transport

This server uses Streamable HTTP transport. The endpoint is:

https://app.stuntdouble.io/api/mcp

MCP Registry

The server is listed in the official MCP Registry as io.stuntdouble/mcp-server, so registry-backed clients and directories can find it by name:

bash
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.stuntdouble/mcp-server"

Each version merged to main is published there automatically (see CONTRIBUTING.md).

Links

Verifying changes

From the repo root:

bash
node scripts/validate-json.mjsnpx --yes [email protected] --check README.md CONTRIBUTING.md SECURITY.md CHANGELOG.md mcp.json .mcp.json server.json .cursor-plugin/plugin.json .cursor-plugin/marketplace.json .claude-plugin/plugin.json .claude-plugin/marketplace.json

More context in CONTRIBUTING.md. GitHub Actions runs the same checks on push and pull requests.

License

MIT

Source: README.md at commit 81027e9

Tools

69

get_me

Get current user

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 user ids.

Takes no parameters.

list_workspaces

List workspaces

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

Takes no parameters.

get_workspace

Get workspace

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.

Parametersidslug

list_workspace_members

List workspace members

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.

Parametersworkspace_idrequired

list_projects

List projects

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.

Parametersworkspace_idrequired

get_project

Get project

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.

Parametersproject_idrequired

create_project

Create project

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.

Parametersurlnamerequiredcoloraudiencedescriptionworkspace_idrequiredproduct_description

list_project_mcp_servers

List project MCP servers

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 and attached by workspace admins in the dashboard.

Parametersproject_idrequired

list_workspace_guidelines

List workspace guidelines

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 typing a second copy of it.

Parametersworkspace_idrequiredinclude_disabled

add_workspace_guideline

Add workspace guideline

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 the workspace is held to it, including the Slack and Linear ones that have no project. Codify a standard here once rather than repeating it in each checklist.

Parameterstitlecontentrequiredcategoryrequiredproject_idsworkspace_idrequiredapply_to_design_reviews

update_workspace_guideline

Update workspace guideline

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.

Parameterstitlecontentenabledcategoryguideline_idrequiredworkspace_idrequiredapply_to_design_reviews

remove_workspace_guideline

Remove workspace guideline

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.

Parametersguideline_idrequiredworkspace_idrequired

list_project_guidelines

List project guidelines

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's copy of the rule; `id` is the library rule shared with every other project holding it.

Parametersproject_idrequiredinclude_disabled

add_project_guideline

Add project guideline

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 check list_workspace_guidelines first and attach an existing rule with `set_project_guideline` rather than adding a second copy.

Parameterstitlecontentrequiredcategoryrequiredproject_idrequired

set_project_guideline

Set project guideline

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 project untouched. Safe to repeat: setting the state the project is already in changes nothing.

Parametersenabledattachedproject_idrequiredguideline_idrequired

list_actors

List actors

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.

Parametersworkspace_idrequired

get_actor

Get actor

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

Parametersactor_idrequired

create_actor

Create actor

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 matching actor; afterwards, add_actor_knowledge gives it context or standards to enforce. Fails when the plan's actor limit is reached.

Parametersnamerequireddescriptionworkspace_idrequired

update_actor

Update actor

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.

Parametersnamestatusactor_idrequireddescriptioncapabilitiessystem_prompt

list_actor_knowledge

List actor knowledge

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 duplicates; pass an entry id to remove_actor_knowledge.

Parametersactor_idrequired

add_actor_knowledge

Add actor knowledge

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), account for test account details. Never pass real passwords, API keys or one-time codes; actors sign in with email codes. Check list_actor_knowledge first to avoid duplicates.

Parameterskindtitlerequiredcontentrequiredactor_idrequired

remove_actor_knowledge

Remove actor knowledge

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

Parametersknowledge_idrequired

list_conversations

List conversations

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.

Parametersactor_idworkspace_idrequired

get_conversation

Get conversation

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

Parametersconversation_idrequired

list_checklists

List checklists

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.

Parametersworkspace_idrequired

get_checklist

Get checklist

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.

Parameterschecklist_idrequired

get_checklist_run

Get checklist run

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) is usually the answer worth reporting. Pass a result's `result_id` to flag_check_verdict when the user says a verdict was wrong.

Parametersrun_idrequired

flag_check_verdict

Flag a wrong verdict

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.

Parametersnoteclearresult_idrequiredworkspace_idrequired

run_checklist

Run checklist

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 plan and budget. Results reach the actor's knowledge only with retain_memory.

Parameterschecklist_idrequiredretain_memory

create_checklist

Create checklist

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 reachable URL works, including previews and prototypes; actors handle email sign-in (OTP, magic links) through their own inboxes, but not other auth walls. Needs project_id or url, an actor (list_actors), instructions and at least one check. Search or list_checklists first to reuse one; run with run_checklist.

Parametersurlnamerequiredchecksrequiredactor_idrequiredrun_modeproject_idscore_typescore_unitscore_bandsinstructionsrequiredworkspace_idrequiredpass_threshold+1 more

update_checklist

Update checklist

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 drives the agent afresh.

Parametersurlnamechecksactor_idrun_modescore_typescore_unitscore_bandschecklist_idrequiredinstructionsvideo_enabledpass_threshold+2 more

delete_checklist

Delete checklist

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.

Parameterschecklist_idrequired

list_feedback

List comments

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 these into themes and an implementation brief, and get_feedback for one comment's replies and screenshot.

Parameterslimitsincestatuspage_pathproject_idrequired

get_feedback

Get comment

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.

Parametersfeedback_idrequired

summarise_feedback

Summarise comments

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; `answers` says which are answered, so ask the user the rest. Shared with the dashboard: an unchanged comment set returns the saved digest instantly.

Parametersforcescopeproject_idrequired

update_feedback_status

Update comment status

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.

Parametersstatusrequiredfeedback_idrequired

list_workflows

List workflows

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.

Parametersworkspace_idrequired

get_workflow

Get workflow

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.

Parametersworkflow_idrequired

run_workflow

Run workflow

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.

Parametersworkflow_idrequired

get_workflow_run

Get workflow run

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

Parametersrun_idrequired

create_workflow

Create workflow

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 updates. Add steps with add_workflow_step (each one is wired to the step before it). A workflow with any trigger but manual starts runs on its own, so a connection without the mcp:run scope creates it paused; activate it with toggle_workflow over a connection holding mcp:run, or from the dashboard.

Parametersnamerequiredproject_iddescriptiontrigger_typeworkspace_idrequiredtrigger_config

update_workflow

Update workflow

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 instead. Changing the trigger of an active workflow that runs on a schedule, webhook or event needs the mcp:run scope; pause it first otherwise. To change steps use the step tools; to pause or resume use toggle_workflow.

Parametersnamedescriptionworkflow_idrequiredtrigger_typetrigger_config

toggle_workflow

Toggle workflow

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 the steps and run history; prefer it to delete_workflow.

Parametersis_activerequiredworkflow_idrequired

delete_workflow

Delete workflow

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.

Parametersworkflow_idrequired

add_workflow_step

Add workflow step

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_comment and actor_pr_review post on the triggering pull request; crawl_topology crawls a topology in a real browser to make a new version of its map; condition and delay only steer or pause. Config per step type: run_checklist: { checklist_id, use_deployment_url? } runs a checklist and passes its pass/fail counts to the next step. condition: { field, operator, value } continues down its True branch when it holds and ends the run otherwise. `field` is 'previous_step.status', another 'previous_step.<key>' off the last step's output, or 'trigger.<key>' off the event that started the run. `operator` is eq, neq, gt or lt. notification: { channel, recipients, template, subject?, body?, slack_channel_id? }. channel is 'email' or 'slack'; recipients is { type: 'all_members' } or { type: 'members', member_ids: [...] }; template is 'completed', 'failed' or 'custom' (custom uses subject and body). delay: { duration_seconds } waits before the next step. Waits are checkpointed, so a long one is free. github_comment: { body_template } comments on the pull request that triggered the run (GitHub App or Cursor Origin, depending on the trigger). The template may use {{passed}}, {{failed}} and {{summary}}. actor_pr_review: { actor_id, review_focus? } has an actor review the triggering pull request. crawl_topology: { topology_id } crawls a topology again and passes the new version's status, page count and what changed since the last version (added, changed, removed) to the next step.

Parametersconfigrequiredstep_typerequiredsort_orderworkflow_idrequired

update_workflow_step

Update workflow step

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.

Parametersconfigstep_idrequiredstep_type

remove_workflow_step

Remove workflow step

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.

Parametersstep_idrequired

reorder_workflow_steps

Reorder workflow steps

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 built on the canvas (a condition with both a True and a False path) does not survive it; use connect_workflow_steps to rebuild a fork.

Parametersstep_idsrequiredworkflow_idrequired

connect_workflow_steps

Connect workflow steps

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; target_step_id: null disconnects it.

Parametersbranchworkflow_idrequiredsource_step_idrequiredtarget_step_idrequired

comment_on_pr

Comment on pull request

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 repository; call get_pull_request first to confirm the PR is reachable.

Parametersbodyrequiredreporequiredownerrequiredpr_numberrequiredworkspace_idrequired

list_pull_requests

List pull requests

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.

Parametersreporequiredownerrequiredstateworkspace_idrequired

get_pull_request

Get pull request

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.

Parametersreporequiredownerrequiredpr_numberrequiredworkspace_idrequired

list_interviews

List interviews

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.

Parametersproject_idworkspace_idrequired

get_interview

Get interview

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.

Parametersinterview_idrequired

create_interview

Create interview

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 deployments. Build the guide with add_interview_section / add_interview_item, add participants, then launch_interview.

Parametersnamerequiredproject_idrequiredtarget_urlrequiredworkspace_idrequiredresearch_briefusability_scale

update_interview

Update interview

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.

Parametersnamestatustarget_urlinterview_idrequiredresearch_briefusability_scale

add_interview_section

Add interview section

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.

Parameterstitlerequiredsort_orderinterview_idrequiredintro_script

add_interview_item

Add interview item

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_evidence on tasks so the report can judge success.

Parameterstyperequiredsection_idrequiredsort_orderprompt_textrequiredexpected_evidence

add_interview_participant

Add interview participant

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 behaviour to dial scepticism, technical literacy and frustration up or down. Call once per participant, then launch_interview.

Parametersdevicelocaleactor_idbehaviourinterview_idrequiredpersona_spec

get_interview_participant

Get interview participant

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

Parametersparticipant_idrequired

get_interview_report

Get interview report

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.

Parametersinterview_idrequired

launch_interview

Launch interview

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 section with items and one participant. Poll get_interview / get_interview_report for progress (runs take several minutes).

Parametersinterview_idrequired

regenerate_interview_report

Regenerate interview report

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.

Parametersinterview_idrequired

get_index_report

Get Index report

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 site has a null score with unscored_reason. Pass a domain, or a project_id for its linked domain. Use list_index_sessions to see why a category or provider scored low.

Parametersdomainproject_id

list_index_sessions

List Index sessions

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. Use it to explain a low score.

Parameterslimitdomainrun_idcategoryproviderproject_id

search_index_domains

Search Index domains

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 query to read the top of the leaderboard; add sector to compare a site against its peers. Follow up with get_index_report for the full breakdown of any result.

Parameterslimitquerysector

request_index_rerun

Request Index re-run

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 with the run_id about every 60 seconds, then read get_index_report.

Parametersdomainproject_id

request_index_score

Request Index score

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 site becomes public on the leaderboard. Public domains only; robots.txt opt-outs are respected; a tracked site is not rescored (use request_index_rerun). Then read get_index_report, and poll list_index_sessions with the run_id if sessions started.

Parametersdomainrequiredinclude_agent_sessions

Version history

7
  1. v1.17.0LatestNov 5, 2026
  2. v1.16.0Nov 3, 2026
  3. v1.15.0Oct 15, 2026
  4. v1.14.1Oct 12, 2026
  5. v1.14.0Oct 1, 2026
  6. v1.13.0Oct 1, 2026
  7. v1.1.0Sep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts