@testdriverai/mcp 7.10.0-canary.0 → 7.10.1-test

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/.claude-plugin/marketplace.json +17 -0
  2. package/agent/index.js +116 -71
  3. package/agent/interface.js +13 -1
  4. package/agent/lib/commands.js +35 -15
  5. package/agent/lib/provision-commands.js +92 -11
  6. package/agent/lib/sandbox.js +263 -30
  7. package/agent/lib/sdk.js +16 -12
  8. package/agent/lib/system.js +107 -31
  9. package/ai/.claude-plugin/plugin.json +89 -4
  10. package/ai/agents/testdriver.md +4 -8
  11. package/ai/skills/testdriver-assert/SKILL.md +0 -1
  12. package/ai/skills/testdriver-aws-setup/SKILL.md +1 -1
  13. package/ai/skills/testdriver-caching/SKILL.md +13 -6
  14. package/ai/skills/testdriver-ci-cd/SKILL.md +57 -14
  15. package/ai/skills/testdriver-client/SKILL.md +10 -6
  16. package/ai/skills/testdriver-customizing-devices/SKILL.md +7 -5
  17. package/ai/skills/testdriver-dashcam/SKILL.md +36 -3
  18. package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +28 -4
  19. package/ai/skills/testdriver-device-config/SKILL.md +5 -5
  20. package/ai/skills/testdriver-find/SKILL.md +50 -11
  21. package/ai/skills/testdriver-generating-tests/SKILL.md +163 -8
  22. package/ai/skills/testdriver-hosted/SKILL.md +1 -1
  23. package/ai/skills/testdriver-machine-setup/SKILL.md +331 -0
  24. package/ai/skills/testdriver-making-assertions/SKILL.md +78 -2
  25. package/ai/skills/testdriver-mcp-workflow/SKILL.md +2 -2
  26. package/ai/skills/testdriver-parse/SKILL.md +1 -1
  27. package/ai/skills/testdriver-performing-actions/SKILL.md +97 -3
  28. package/ai/skills/testdriver-provision/SKILL.md +0 -20
  29. package/ai/skills/testdriver-quickstart/SKILL.md +299 -21
  30. package/ai/skills/testdriver-reusable-code/SKILL.md +3 -3
  31. package/ai/skills/testdriver-running-tests/SKILL.md +1 -1
  32. package/ai/skills/testdriver-screenshot/SKILL.md +5 -5
  33. package/ai/skills/testdriver-scroll/SKILL.md +30 -160
  34. package/ai/skills/testdriver-test-writer/SKILL.md +3 -5
  35. package/ai/skills/testdriver-testdriver/SKILL.md +3 -7
  36. package/ai/skills/testdriver-wait/SKILL.md +1 -1
  37. package/{docs/v7/ai.mdx → ai/skills/testdriver:ai/SKILL.md} +3 -4
  38. package/ai/skills/testdriver:assert/SKILL.md +315 -0
  39. package/ai/skills/testdriver:aws-setup/SKILL.md +448 -0
  40. package/ai/skills/testdriver:cache/SKILL.md +221 -0
  41. package/ai/skills/testdriver:caching/SKILL.md +124 -0
  42. package/ai/skills/testdriver:captcha/SKILL.md +158 -0
  43. package/ai/skills/testdriver:ci-cd/SKILL.md +659 -0
  44. package/ai/skills/testdriver:click/SKILL.md +286 -0
  45. package/ai/skills/testdriver:client/SKILL.md +477 -0
  46. package/ai/skills/testdriver:customizing-devices/SKILL.md +319 -0
  47. package/ai/skills/testdriver:dashcam/SKILL.md +451 -0
  48. package/ai/skills/testdriver:debugging-with-screenshots/SKILL.md +415 -0
  49. package/{docs/v7/device-config.mdx → ai/skills/testdriver:device-config/SKILL.md} +8 -8
  50. package/ai/skills/testdriver:double-click/SKILL.md +102 -0
  51. package/ai/skills/testdriver:elements/SKILL.md +605 -0
  52. package/ai/skills/testdriver:enterprise/SKILL.md +7 -0
  53. package/ai/skills/testdriver:errors/SKILL.md +246 -0
  54. package/ai/skills/testdriver:events/SKILL.md +356 -0
  55. package/ai/skills/testdriver:exec/SKILL.md +317 -0
  56. package/ai/skills/testdriver:find/SKILL.md +860 -0
  57. package/ai/skills/testdriver:focus-application/SKILL.md +293 -0
  58. package/ai/skills/testdriver:generating-tests/SKILL.md +25 -0
  59. package/ai/skills/testdriver:hosted/SKILL.md +156 -0
  60. package/ai/skills/testdriver:hover/SKILL.md +278 -0
  61. package/{docs/v7/locating-elements.mdx → ai/skills/testdriver:locating-elements/SKILL.md} +3 -3
  62. package/ai/skills/testdriver:making-assertions/SKILL.md +32 -0
  63. package/ai/skills/testdriver:mcp/SKILL.md +7 -0
  64. package/ai/skills/testdriver:mouse-down/SKILL.md +161 -0
  65. package/ai/skills/testdriver:mouse-up/SKILL.md +164 -0
  66. package/ai/skills/testdriver:parse/SKILL.md +236 -0
  67. package/ai/skills/testdriver:performing-actions/SKILL.md +53 -0
  68. package/ai/skills/testdriver:press-keys/SKILL.md +348 -0
  69. package/ai/skills/testdriver:provision/SKILL.md +331 -0
  70. package/ai/skills/testdriver:quickstart/SKILL.md +172 -0
  71. package/ai/skills/testdriver:redraw/SKILL.md +214 -0
  72. package/ai/skills/testdriver:reusable-code/SKILL.md +249 -0
  73. package/ai/skills/testdriver:right-click/SKILL.md +123 -0
  74. package/{docs/v7/running-tests.mdx → ai/skills/testdriver:running-tests/SKILL.md} +4 -4
  75. package/ai/skills/testdriver:screenshot/SKILL.md +248 -0
  76. package/ai/skills/testdriver:screenshots/SKILL.md +184 -0
  77. package/ai/skills/testdriver:scroll/SKILL.md +205 -0
  78. package/ai/skills/testdriver:secrets/SKILL.md +115 -0
  79. package/ai/skills/testdriver:self-hosted/SKILL.md +147 -0
  80. package/ai/skills/testdriver:test-results-json/SKILL.md +257 -0
  81. package/ai/skills/testdriver:testdriver/SKILL.md +624 -0
  82. package/ai/skills/testdriver:type/SKILL.md +357 -0
  83. package/ai/skills/testdriver:variables/SKILL.md +111 -0
  84. package/ai/skills/testdriver:wait/SKILL.md +50 -0
  85. package/{docs/v7/waiting-for-elements.mdx → ai/skills/testdriver:waiting-for-elements/SKILL.md} +3 -3
  86. package/ai/skills/testdriver:what-is-testdriver/SKILL.md +54 -0
  87. package/debugger/index.html +12 -0
  88. package/docs/_data/examples-manifest.json +54 -46
  89. package/docs/_data/examples-manifest.schema.json +12 -2
  90. package/docs/_scripts/extract-example-urls.js +21 -3
  91. package/docs/_scripts/generate-examples.js +64 -16
  92. package/docs/changelog.mdx +29 -2
  93. package/docs/claude-mcp-plugin.mdx +65 -18
  94. package/docs/docs.json +16 -33
  95. package/docs/snippets/tests/scroll-yaml.mdx +2 -2
  96. package/docs/v6/commands/scroll-until-image.mdx +1 -1
  97. package/docs/v6/commands/scroll-until-text.mdx +2 -2
  98. package/docs/v6/commands/scroll.mdx +2 -2
  99. package/docs/v7/_drafts/agents.mdx +0 -4
  100. package/docs/v7/_drafts/best-practices.mdx +0 -12
  101. package/docs/v7/_drafts/commands/scroll-until-image.mdx +1 -1
  102. package/docs/v7/_drafts/commands/scroll-until-text.mdx +2 -2
  103. package/docs/v7/_drafts/commands/scroll.mdx +1 -1
  104. package/docs/v7/_drafts/configuration.mdx +0 -12
  105. package/docs/v7/_drafts/faq.mdx +2 -10
  106. package/docs/v7/_drafts/readme.mdx +0 -1
  107. package/docs/v7/_drafts/troubleshooting.mdx +1 -4
  108. package/docs/v7/assert.mdx +0 -1
  109. package/docs/v7/aws-setup.mdx +1 -1
  110. package/docs/v7/caching.mdx +14 -10
  111. package/docs/v7/ci-cd.mdx +98 -14
  112. package/docs/v7/client.mdx +10 -6
  113. package/docs/v7/copilot/auto-healing.mdx +167 -18
  114. package/docs/v7/copilot/running-tests.mdx +915 -54
  115. package/docs/v7/customizing-devices.mdx +7 -5
  116. package/docs/v7/dashcam.mdx +36 -3
  117. package/docs/v7/debugging-with-screenshots.mdx +31 -7
  118. package/docs/v7/examples/ai.mdx +13 -8
  119. package/docs/v7/examples/assert.mdx +1 -1
  120. package/docs/v7/examples/chrome-extension.mdx +30 -13
  121. package/docs/v7/examples/element-not-found.mdx +1 -1
  122. package/docs/v7/examples/findall-coffee-icons.mdx +3 -2
  123. package/docs/v7/examples/formatted-logging.mdx +74 -0
  124. package/docs/v7/examples/hover-image.mdx +1 -1
  125. package/docs/v7/examples/hover-text-with-description.mdx +2 -2
  126. package/docs/v7/examples/hover-text.mdx +1 -1
  127. package/docs/v7/examples/installer.mdx +1 -1
  128. package/docs/v7/examples/launch-vscode-linux.mdx +27 -27
  129. package/docs/v7/examples/match-image.mdx +1 -1
  130. package/docs/v7/examples/parse.mdx +3 -2
  131. package/docs/v7/examples/press-keys.mdx +2 -2
  132. package/docs/v7/examples/scroll-keyboard.mdx +2 -2
  133. package/docs/v7/examples/scroll-until-text.mdx +1 -1
  134. package/docs/v7/examples/scroll.mdx +1 -1
  135. package/docs/v7/examples/type.mdx +1 -1
  136. package/docs/v7/find.mdx +50 -11
  137. package/docs/v7/generating-tests.mdx +166 -10
  138. package/docs/v7/hosted.mdx +1 -1
  139. package/docs/v7/making-assertions.mdx +81 -4
  140. package/docs/v7/parse.mdx +1 -1
  141. package/docs/v7/performing-actions.mdx +100 -5
  142. package/docs/v7/provision.mdx +0 -20
  143. package/docs/v7/quickstart.mdx +299 -21
  144. package/docs/v7/reusable-code.mdx +3 -3
  145. package/docs/v7/screenshot.mdx +5 -5
  146. package/docs/v7/scroll.mdx +30 -160
  147. package/docs/v7/wait.mdx +1 -1
  148. package/examples/chrome-extension.test.mjs +29 -12
  149. package/examples/config.mjs +1 -1
  150. package/examples/launch-vscode-linux.test.mjs +25 -25
  151. package/interfaces/cli/commands/init.js +84 -2
  152. package/interfaces/vitest-plugin.mjs +51 -61
  153. package/lib/core/Dashcam.js +43 -2
  154. package/lib/core/index.d.ts +13 -1
  155. package/lib/github-comment.mjs +11 -5
  156. package/lib/init-project.js +98 -44
  157. package/lib/install-clients.js +470 -0
  158. package/lib/provision.js +749 -0
  159. package/lib/resolve-channel.js +2 -2
  160. package/lib/sentry.js +15 -2
  161. package/lib/vitest/hooks.mjs +44 -34
  162. package/mcp-server/README.md +32 -0
  163. package/mcp-server/dist/core/actions.d.ts +176 -0
  164. package/mcp-server/dist/core/actions.js +753 -0
  165. package/mcp-server/dist/env-utils.d.ts +45 -0
  166. package/mcp-server/dist/env-utils.js +63 -0
  167. package/mcp-server/dist/provision-types.d.ts +6 -2
  168. package/mcp-server/dist/provision-types.js +3 -1
  169. package/mcp-server/dist/server.mjs +449 -751
  170. package/mcp-server/package-lock.json +384 -1
  171. package/mcp-server/package.json +5 -2
  172. package/mcp-server/src/core/actions.ts +912 -0
  173. package/mcp-server/src/env-utils.test.ts +82 -0
  174. package/mcp-server/src/env-utils.ts +77 -0
  175. package/mcp-server/src/provision-types.ts +4 -1
  176. package/mcp-server/src/server.ts +533 -954
  177. package/mcp-server/tsconfig.json +1 -1
  178. package/mcp-server/vitest.config.ts +7 -0
  179. package/package.json +15 -3
  180. package/sdk.d.ts +11 -9
  181. package/sdk.js +116 -746
  182. package/setup/aws/spawn-runner.sh +24 -3
  183. package/docs/v7/_drafts/caching-ai.mdx +0 -215
  184. package/docs/v7/_drafts/caching.mdx +0 -366
  185. package/docs/v7/_drafts/prompt-cache.mdx +0 -200
  186. package/docs/v7/copilot/creating-tests.mdx +0 -156
  187. package/docs/v7/copilot/github.mdx +0 -143
  188. package/docs/v7/copilot/setup.mdx +0 -143
  189. package/docs/v7/examples/exec-output.mdx +0 -84
  190. package/docs/v7/examples/exec-pwsh.mdx +0 -82
  191. package/docs/v7/examples/focus-window.mdx +0 -61
  192. package/docs/v7/examples/scroll-until-image.mdx +0 -82
  193. package/docs/v7/examples/windows-installer.mdx +0 -95
  194. package/examples/formatted-logging.test.mjs +0 -27
  195. package/examples/match-image.test.mjs +0 -55
  196. package/manual/exec-stream-logs.test.mjs +0 -25
@@ -10,6 +10,53 @@ TestDriver makes it easy to write automated computer-use tests for web browsers,
10
10
  <Tip><a href="https://discord.com/invite/cWDFW8DzPm" target="_blank" rel="noreferrer">Join our Discord</a> if you have any questions or need help getting started!</Tip>
11
11
 
12
12
  <Tabs>
13
+ <Tab title="Add to GitHub" icon="github">
14
+
15
+ Drop-in UI testing for any GitHub repository. Mention `@testdriverai` anywhere in your repo and it writes UI tests and catches regressions before they merge.
16
+
17
+ <Card
18
+ title="Add to GitHub"
19
+ icon="github"
20
+ href="https://go.testdriver.ai/github"
21
+ arrow
22
+ horizontal
23
+ >
24
+ Install the TestDriver GitHub app and start testing in minutes — no setup required.
25
+ </Card>
26
+
27
+ <Steps>
28
+ <Step title="Install the GitHub App">
29
+ Click **Add to GitHub** above and install TestDriver on the repositories you want to test.
30
+ </Step>
31
+
32
+ <Step title="Mention @testdriverai">
33
+ Open a pull request or issue and mention `@testdriverai` to have it write and run UI tests:
34
+
35
+ ```
36
+ @testdriverai Write a test that verifies the homepage loads and the signup button works.
37
+ ```
38
+
39
+ TestDriver spawns a sandbox, writes the test, and posts results right in the conversation.
40
+ </Step>
41
+
42
+ <Step title="Catch Regressions Automatically">
43
+ Once your tests are committed, TestDriver runs them on every pull request and flags regressions before they merge.
44
+ </Step>
45
+ </Steps>
46
+
47
+ Want to use TestDriver from GitHub Copilot or the GitHub Mobile app instead? See the full GitHub guide:
48
+
49
+ <Card
50
+ title="GitHub Integration Guide"
51
+ icon="arrow-right"
52
+ href="/v7/copilot/auto-healing#use-testdriver-in-github"
53
+ arrow
54
+ horizontal
55
+ >
56
+ Use TestDriver from GitHub web, Copilot chat, PR reviews, and mobile.
57
+ </Card>
58
+
59
+ </Tab>
13
60
  <Tab title="CLI" icon="terminal">
14
61
 
15
62
  Get started quickly with the TestDriver CLI.
@@ -40,32 +87,263 @@ TestDriver makes it easy to write automated computer-use tests for web browsers,
40
87
  </Step>
41
88
  </Steps>
42
89
  </Tab>
43
- <Tab title="GitHub Copilot" icon="github">
90
+ <Tab title="AI Setup" icon="robot">
44
91
 
45
- Use the TestDriver VS Code extension with GitHub Copilot for an AI-powered testing workflow.
92
+ Plug TestDriver into your AI client so you can write, run, and debug real end-to-end tests right from chat. There are three pieces, and `testdriverai init` installs all of them for you:
46
93
 
47
- <Card
48
- title="Install TestDriver for VS Code"
49
- icon="/images/content/extension/vscode.svg"
50
- href="vscode:extension/testdriver.testdriver"
51
- arrow
52
- horizontal
53
- >
54
- </Card>
94
+ - **The agent** — an expert test-creator that drives a live sandbox, writes code after each step, and reruns the test until it passes.
95
+ - **Skills** — small instruction files that teach the agent the exact syntax for each TestDriver capability (`find`, `click`, `type`, `assert`, …).
96
+ - **The MCP server** — exposes TestDriver's computer-use tools over the [Model Context Protocol](https://modelcontextprotocol.io) so any MCP-capable client can use them.
55
97
 
56
- The extension provides one-click sign-in, project initialization, a live preview panel for watching tests execute, and MCP server configuration for GitHub Copilot.
98
+ ### Quick install (recommended)
57
99
 
58
- Once installed, follow the full setup guide to configure MCP and start building tests with AI assistance:
100
+ `testdriverai init` wires up the agent, skills, and MCP server for you, writing each client's config in the exact format and location it expects:
59
101
 
60
- <Card
61
- title="VS Code + Copilot Setup Guide"
62
- icon="arrow-right"
63
- href="/v7/copilot/setup"
64
- arrow
65
- horizontal
66
- >
67
- Sign in, initialize your project, and configure MCP for GitHub Copilot.
68
- </Card>
102
+ ```bash
103
+ # interactive pick your client(s)
104
+ npx testdriverai init
105
+
106
+ # one client
107
+ npx testdriverai init --client claude-code
108
+
109
+ # several
110
+ npx testdriverai init --client claude-code,cursor,vscode
111
+
112
+ # everything
113
+ npx testdriverai init --client all
114
+ ```
115
+
116
+ <Info>
117
+ `init` detects clients already present in your project and pre-selects them in the picker. Re-running `init` is safe — it merges the TestDriver entry into existing config without overwriting your other servers.
118
+ </Info>
119
+
120
+ You'll need a TestDriver API key. Create one at [console.testdriver.ai/team](https://console.testdriver.ai/team) and `init` will save it to `.env` as `TD_API_KEY`.
121
+
122
+ ### The agent
123
+
124
+ The **TestDriver agent** is an expert test-creator that runs inside your AI client (Claude Code, Cursor, VS Code, and others). It writes, runs, and debugs real end-to-end tests by driving your app the same way a person would — using AI vision to find elements, click, type, and assert — through the TestDriver MCP server.
125
+
126
+ Unlike a chat assistant that only suggests code, the agent works **iteratively against a live sandbox**: it starts a session, performs each action, writes the generated code to your test file, verifies the result with a screenshot, and reruns the test until it passes.
127
+
128
+ During init you'll be asked which AI client(s) to install into. The agent is written to the location each client expects:
129
+
130
+ | Client | Agent location |
131
+ | --- | --- |
132
+ | Claude Code | `.claude/agents/testdriver.md` |
133
+ | VS Code (Copilot) | `.github/agents/testdriver.agent.md` |
134
+ | Cursor | `.cursor/rules/testdriver.mdc` |
135
+ | Windsurf | `.windsurf/rules/testdriver.md` |
136
+ | Codex | `AGENTS.md` |
137
+ | Zed | `.rules` |
138
+
139
+ Once installed, invoke it from your client's chat:
140
+
141
+ ```text
142
+ @testdriver write a test that logs in and verifies the dashboard loads
143
+ ```
144
+
145
+ The agent will spin up a sandbox, perform the steps live, write them into a test file under `tests/`, and run it for you.
146
+
147
+ ### Skills
148
+
149
+ **Skills** are small, focused instruction files — one per TestDriver capability — that teach your AI client exactly how to use each part of the TestDriver SDK and MCP tools. They follow the [Anthropic `SKILL.md` format](https://code.claude.com/docs/en/skills): a folder per skill, each containing a `SKILL.md` with YAML frontmatter and a markdown body.
150
+
151
+ There are **106 skills**, generated directly from the TestDriver documentation, covering every action and concept: `find`, `click`, `type`, `assert`, `check`, `scroll`, `press-keys`, `provision`, caching, secrets, CI/CD, and more. They're written to the directory each client expects:
152
+
153
+ | Client | Skills location |
154
+ | --- | --- |
155
+ | Claude Code | `.claude/skills/<name>/SKILL.md` |
156
+ | Zed | `.agents/skills/<name>/SKILL.md` |
157
+ | Codex | referenced from `AGENTS.md` |
158
+ | VS Code · Cursor · Windsurf | folded into the agent rules/instructions |
159
+
160
+ <Note>
161
+ Skills are **generated, not hand-edited** — each is built from a `.mdx` docs page and carries a `DO NOT EDIT` marker. To change a skill, edit the corresponding documentation page and run `node docs/_scripts/generate-skills.js`.
162
+ </Note>
163
+
164
+ ### MCP server
165
+
166
+ The **TestDriver MCP server** exposes TestDriver's computer-use tools — `session_start`, `find`, `click`, `type`, `assert`, `check`, `screenshot`, and more — over the [Model Context Protocol](https://modelcontextprotocol.io). It runs as a local stdio process:
167
+
168
+ ```bash
169
+ npx -p testdriverai testdriverai-mcp
170
+ ```
171
+
172
+ and authenticates with your `TD_API_KEY`. `testdriverai init` configures it for you, but you can also wire it up by hand:
173
+
174
+ | Client | Auto-install | MCP config file | Config key |
175
+ | --- | --- | --- | --- |
176
+ | Claude Code | ✅ | `.mcp.json` | `mcpServers` |
177
+ | Claude Desktop | ✅ | OS-specific | `mcpServers` |
178
+ | Cursor | ✅ | `.cursor/mcp.json` | `mcpServers` |
179
+ | VS Code (Copilot) | ✅ | `.vscode/mcp.json` | `servers` |
180
+ | Windsurf | ✅ | `~/.codeium/windsurf/mcp_config.json` | `mcpServers` |
181
+ | Codex | ✅ | `~/.codex/config.toml` | `[mcp_servers]` |
182
+ | Zed | ✅ | `.zed/settings.json` | `context_servers` |
183
+ | Lovable | ⚙️ partial | GitHub `AGENTS.md` + UI | — |
184
+ | Replit | ⚙️ partial | `replit.md` + UI | — |
185
+ | v0 (Vercel) | 📝 manual | web UI only | — |
186
+
187
+ <Note>
188
+ Each client uses a **different top-level key** for MCP servers. The most common mistake when configuring by hand is using `mcpServers` for VS Code (it wants `servers`), Codex (TOML `[mcp_servers]`), or Zed (`context_servers`).
189
+ </Note>
190
+
191
+ <Tabs>
192
+ <Tab title="Claude Code">
193
+ Add to `.mcp.json` at your project root (or `~/.claude.json` for all projects):
194
+
195
+ ```json
196
+ {
197
+ "mcpServers": {
198
+ "testdriver": {
199
+ "type": "stdio",
200
+ "command": "npx",
201
+ "args": ["-p", "testdriverai", "testdriverai-mcp"],
202
+ "env": { "TD_API_KEY": "${TD_API_KEY}" }
203
+ }
204
+ }
205
+ }
206
+ ```
207
+ </Tab>
208
+
209
+ <Tab title="Claude Desktop">
210
+ Edit the Claude Desktop config file:
211
+
212
+ - **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
213
+ - **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
214
+ - **Linux:** `~/.config/Claude/claude_desktop_config.json`
215
+
216
+ ```json
217
+ {
218
+ "mcpServers": {
219
+ "testdriver": {
220
+ "command": "npx",
221
+ "args": ["-p", "testdriverai", "testdriverai-mcp"],
222
+ "env": { "TD_API_KEY": "your_api_key" }
223
+ }
224
+ }
225
+ }
226
+ ```
227
+
228
+ Restart Claude Desktop after saving.
229
+ </Tab>
230
+
231
+ <Tab title="Cursor">
232
+ Add to `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global):
233
+
234
+ ```json
235
+ {
236
+ "mcpServers": {
237
+ "testdriver": {
238
+ "type": "stdio",
239
+ "command": "npx",
240
+ "args": ["-p", "testdriverai", "testdriverai-mcp"],
241
+ "env": { "TD_API_KEY": "${TD_API_KEY}" }
242
+ }
243
+ }
244
+ }
245
+ ```
246
+ </Tab>
247
+
248
+ <Tab title="VS Code">
249
+ Add to `.vscode/mcp.json`. VS Code uses the `servers` key and an `inputs` prompt for secrets:
250
+
251
+ ```json
252
+ {
253
+ "servers": {
254
+ "testdriver": {
255
+ "type": "stdio",
256
+ "command": "npx",
257
+ "args": ["-p", "testdriverai", "testdriverai-mcp"],
258
+ "env": { "TD_API_KEY": "${input:testdriver-api-key}" }
259
+ }
260
+ },
261
+ "inputs": [
262
+ {
263
+ "type": "promptString",
264
+ "id": "testdriver-api-key",
265
+ "description": "TestDriver API Key From https://console.testdriver.ai/team",
266
+ "password": true
267
+ }
268
+ ]
269
+ }
270
+ ```
271
+ </Tab>
272
+
273
+ <Tab title="Windsurf">
274
+ Windsurf reads MCP config globally. Add to `~/.codeium/windsurf/mcp_config.json`:
275
+
276
+ ```json
277
+ {
278
+ "mcpServers": {
279
+ "testdriver": {
280
+ "command": "npx",
281
+ "args": ["-p", "testdriverai", "testdriverai-mcp"],
282
+ "env": { "TD_API_KEY": "${TD_API_KEY}" }
283
+ }
284
+ }
285
+ }
286
+ ```
287
+ </Tab>
288
+
289
+ <Tab title="Codex">
290
+ Codex uses TOML. Add to `~/.codex/config.toml`:
291
+
292
+ ```toml
293
+ [mcp_servers.testdriver]
294
+ command = "npx"
295
+ args = ["-p", "testdriverai", "testdriverai-mcp"]
296
+ env = { TD_API_KEY = "${TD_API_KEY}" }
297
+ ```
298
+ </Tab>
299
+
300
+ <Tab title="Zed">
301
+ Zed calls them "context servers". Add to `.zed/settings.json` (project) or `~/.config/zed/settings.json` (global):
302
+
303
+ ```json
304
+ {
305
+ "context_servers": {
306
+ "testdriver": {
307
+ "command": "npx",
308
+ "args": ["-p", "testdriverai", "testdriverai-mcp"],
309
+ "env": { "TD_API_KEY": "${TD_API_KEY}" }
310
+ }
311
+ }
312
+ }
313
+ ```
314
+ </Tab>
315
+ </Tabs>
316
+
317
+ **Web-based clients** — Lovable, Replit, and v0 run in the browser, so the MCP server can't be launched as a local process. Configure them through each product's UI:
318
+
319
+ <AccordionGroup>
320
+ <Accordion title="Lovable">
321
+ 1. Connect your GitHub repo and run `npx testdriverai init --client lovable` — this writes `AGENTS.md` and the skills into the repo so Lovable's agent picks them up.
322
+ 2. In Lovable, open **Settings → MCP** and add the TestDriver server.
323
+ </Accordion>
324
+
325
+ <Accordion title="Replit">
326
+ 1. Run `npx testdriverai init --client replit` to write `replit.md` with the TestDriver agent guidance.
327
+ 2. In Replit, open **Tools → Integrations → MCP** and add a custom MCP server.
328
+ </Accordion>
329
+
330
+ <Accordion title="v0 (Vercel)">
331
+ v0 is fully UI-driven and does not read repo files.
332
+
333
+ 1. Open **[v0.app/chat/settings/mcp-connections](https://v0.app/chat/settings/mcp-connections)** and add the TestDriver MCP connection.
334
+ 2. Paste the agent guidance into **Instructions** (the **+** in the prompt bar).
335
+ </Accordion>
336
+ </AccordionGroup>
337
+
338
+ ### Verifying the install
339
+
340
+ Open your client's chat and ask the agent to write a test:
341
+
342
+ ```text
343
+ @testdriver write a test that opens the homepage and asserts the title
344
+ ```
345
+
346
+ If the MCP server is wired up correctly, the agent will start a session and you'll see screenshots come back as it works. If tools don't appear, check that `TD_API_KEY` is set and restart the client.
69
347
 
70
348
  </Tab>
71
349
  <Tab title="Manual" icon="wrench">
@@ -49,7 +49,7 @@ Now import and use these helpers in any test:
49
49
 
50
50
  ```javascript test/checkout.test.mjs
51
51
  import { describe, expect, it } from "vitest";
52
- import { TestDriver } from "testdriverai/lib/vitest/hooks.mjs";
52
+ import { TestDriver } from "testdriverai/vitest/hooks";
53
53
  import { login } from './helpers/auth.js';
54
54
 
55
55
  describe("Checkout", () => {
@@ -120,7 +120,7 @@ Use the page object in your tests:
120
120
 
121
121
  ```javascript test/auth.test.mjs
122
122
  import { describe, expect, it } from "vitest";
123
- import { TestDriver } from "testdriverai/lib/vitest/hooks.mjs";
123
+ import { TestDriver } from "testdriverai/vitest/hooks";
124
124
  import { LoginPage } from './pages/LoginPage.js';
125
125
 
126
126
  describe("Authentication", () => {
@@ -190,7 +190,7 @@ export async function setupAuthenticatedSession(testdriver, user = testUsers.reg
190
190
 
191
191
  ```javascript test/admin.test.mjs
192
192
  import { describe, expect, it } from "vitest";
193
- import { TestDriver } from "testdriverai/lib/vitest/hooks.mjs";
193
+ import { TestDriver } from "testdriverai/vitest/hooks";
194
194
  import { testUsers, testUrls, setupAuthenticatedSession } from './fixtures/index.js';
195
195
 
196
196
  describe("Admin Panel", () => {
@@ -10,7 +10,7 @@ icon: "camera"
10
10
  Capture a screenshot of the current screen and automatically save it to a local file. Screenshots are organized by test file for easy debugging and review.
11
11
 
12
12
  <Note>
13
- **Automatic Screenshots (Default: Enabled)**: TestDriver automatically captures screenshots before and after every command (click, type, find, etc.). These are saved with descriptive filenames like `001-click-before-L42-submit-button.png` that include the line number from your test file. You can disable this with `autoScreenshots: false` in your TestDriver options.
13
+ **Automatic Screenshots**: TestDriver can automatically capture screenshots before and after every command (click, type, find, etc.). These are saved with descriptive filenames like `001-click-before-L42-submit-button.png` that include the line number from your test file. Enable this with `autoScreenshots: true` in your TestDriver options.
14
14
  </Note>
15
15
 
16
16
  ## Syntax
@@ -51,7 +51,7 @@ Screenshots are automatically saved to `.testdriver/screenshots/<test-file-name>
51
51
 
52
52
  ### Automatic Screenshot Naming
53
53
 
54
- When `autoScreenshots` is enabled (default), filenames follow this format:
54
+ When `autoScreenshots` is enabled, filenames follow this format:
55
55
 
56
56
  `<seq>-<action>-<phase>-L<line>-<description>.png`
57
57
 
@@ -92,7 +92,7 @@ await testdriver.screenshot("after-click");
92
92
 
93
93
  ```javascript
94
94
  import { describe, expect, it } from "vitest";
95
- import { TestDriver } from "testdriverai/lib/vitest/hooks.mjs";
95
+ import { TestDriver } from "testdriverai/vitest/hooks";
96
96
 
97
97
  describe("Login Flow", () => {
98
98
  it("should log in successfully", async (context) => {
@@ -154,7 +154,7 @@ Automatic screenshots are taken around these commands:
154
154
  - `find()` / `findAll()`
155
155
  - `click()` / `hover()` / `doubleClick()` / `rightClick()`
156
156
  - `type()` / `pressKeys()`
157
- - `scroll()` / `scrollUntilText()` / `scrollUntilImage()`
157
+ - `scroll()`
158
158
  - `waitForText()` / `waitForImage()`
159
159
  - `focusApplication()`
160
160
  - `assert()` / `extract()` / `exec()`
@@ -189,7 +189,7 @@ If an error occurs, the phase will be `error` instead of `after`.
189
189
 
190
190
  <AccordionGroup>
191
191
  <Accordion title="Let automatic screenshots do the work">
192
- With `autoScreenshots: true` (default), you get comprehensive coverage without adding manual `screenshot()` calls. Only add manual screenshots for specific named checkpoints.
192
+ With `autoScreenshots: true`, you get comprehensive coverage without adding manual `screenshot()` calls. Only add manual screenshots for specific named checkpoints.
193
193
  </Accordion>
194
194
 
195
195
  <Accordion title="Use screenshots for debugging flaky tests">