A Model Context Protocol server for Testplane, which enables LLMs to "see" and interact with any web app.
- Automate generation of integration/e2e tests with LLM-based agents
- AI Agents no longer have to take guesses as to how your app works — they can truly see what's happening inside a browser and write quality tests for you
- Let LLMs use text-based or visual-based snapshots, depending on what works better for your app
-
You need Node 18+ and a compatible MCP host (like Claude Desktop, Cursor or Windsurf).
-
Add Testplane MCP to MCP host of your choice. This is a typical configuration:
{ "command": "npx", "args": ["@testplane/mcp@latest"], }
Set up in Cursor
Open Cursor
Settings
(button at the top right corner of the screen), findMCP
section, click on theAdd new global MCP server
button, edit the config to include Testplane MCP as seen below.{ "mcpServers": { "testplane-mcp": { "command": "npx", "args": ["@testplane/mcp@latest"] } } }
Set up in VS Code
Open VS Code
Settings
, search forMCP
, clickEdit in settings.json
, edit the config to include Testplane MCP as seen below.{ "mcp": { "inputs": [], "servers": { "testplane-mcp": { "command": "npx", "args": ["@testplane/mcp@latest"] } } } }
Set up in Claude Desktop
Use official docs to open config, then edit the config to include Testplane MCP as seen below.
{ "mcpServers": { "testplane-mcp": { "command": "npx", "args": ["@testplane/mcp@latest"] } } }
Set up in Windsurf
Follow the official docs to open MCP settings, then edit the config to include Testplane MCP as seen below.
{ "mcpServers": { "testplane-mcp": { "command": "npx", "args": ["@testplane/mcp@latest"] } } }
Set up in Jetbrains IDE
Follow the official docs to open MCP settings, then edit the config to include Testplane MCP as seen below.
{ "mcpServers": { "testplane-mcp": { "command": "npx", "args": ["@testplane/mcp@latest"] } } }
Navigation
Navigate to URL in the browser.
- Parameters:
url
(string, required): The URL to navigate to
Element Interaction
Click an element on the page using semantic queries (testing-library
-style) or CSS selectors.
-
Semantic Queries:
- Parameters:
queryType
(string, optional): Semantic query type. One of:"role"
- Find by ARIA role (e.g., "button", "link", "heading")"text"
- Find by visible text content"labelText"
- Find form inputs by their label text"placeholderText"
- Find inputs by placeholder text"altText"
- Find images by alt text"testId"
- Find by data-testid attribute"title"
- Find by title attribute"displayValue"
- Find inputs by their current value
queryValue
(string, required when using queryType): The value to search forqueryOptions
(object, optional): Additional options:name
(string): Accessible name for role queriesexact
(boolean): Whether to match exact text (default: true)hidden
(boolean): Include hidden elements (default: false)level
(number): Heading level for role="heading" (1-6)
-
CSS Selectors:
- Parameters:
selector
(string, optional): CSS selector or XPath when semantic queries cannot locate the element
Examples:
// Semantic queries (preferred)
{ queryType: "role", queryValue: "button", queryOptions: { name: "Submit" } }
{ queryType: "text", queryValue: "Click here" }
{ queryType: "labelText", queryValue: "Email Address" }
// CSS selector fallback
{ selector: ".submit-btn" }
{ selector: "#unique-element" }
Note: Provide either semantic query parameters OR selector, not both.
Type text into an input element on the page using semantic queries (testing-library
-style) or CSS selectors.
-
Semantic Queries:
- Parameters:
queryType
(string, optional): Semantic query type. One of:"role"
- Find by ARIA role (e.g., "textbox", "searchbox")"text"
- Find by visible text content"labelText"
- Find form inputs by their label text"placeholderText"
- Find inputs by placeholder text"altText"
- Find images by alt text"testId"
- Find by data-testid attribute"title"
- Find by title attribute"displayValue"
- Find inputs by their current value
queryValue
(string, required when using queryType): The value to search fortext
(string, required): The text to type into the elementqueryOptions
(object, optional): Additional options:name
(string): Accessible name for role queriesexact
(boolean): Whether to match exact text (default: true)hidden
(boolean): Include hidden elements (default: false)
-
CSS Selectors:
- Parameters:
selector
(string, optional): CSS selector or XPath when semantic queries cannot locate the elementtext
(string, required): The text to type into the element
Examples:
// Semantic queries (preferred)
{ queryType: "labelText", queryValue: "Email Address", text: "[email protected]" }
{ queryType: "placeholderText", queryValue: "Enter your name", text: "John Smith" }
{ queryType: "role", queryValue: "textbox", queryOptions: { name: "Username" }, text: "john_doe" }
// CSS selector fallback
{ selector: "#username", text: "john_doe" }
{ selector: "input[name='email']", text: "[email protected]" }
Note: Provide either semantic query parameters OR selector, not both.