MCP Server - Test Migration (WDIO to Playwright)
Analyzes WebDriverIO test files and migrates them to Playwright using AST-based transformations, including test structure analysis, selector conversion, command mapping, and Page Object Model refactoring.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP Server - Test Migration (WDIO to Playwright)analyze my WDIO tests and suggest modern Playwright selectors"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Server - Test Migration (WDIO to Playwright)
An MCP (Model Context Protocol) server that helps migrate test automation projects from WebDriverIO to Playwright test framework using AST-based transformations.
Features
This MCP server provides specialized tools for a complete migration workflow:
1. analyze_wdio_test
Analyzes WebDriverIO test files using AST parsing and extracts:
Import statements and dependencies
Test structure (describe blocks, test cases)
Selectors used (CSS, XPath, data-test-id, etc.)
WDIO commands and patterns
Assertions libraries
Hooks (before, after, etc.)
Page Object usage detection
Framework detection (WDIO, Playwright, or mixed)
Migration complexity assessment
Modern selector suggestions (getByTestId, getByRole, etc.)
2. migrate_to_playwright
Migrates WDIO tests to Playwright using AST transformation:
Converts WDIO syntax to Playwright syntax
Updates selectors to use Playwright locators
Suggests modern locators (getByTestId with
data-test-id)Replaces WDIO commands with Playwright equivalents
Uses latest Playwright v1.57 best practices
Removes unnecessary explicit waits (leverages auto-waiting)
Converts assertions to Playwright's expect
Preserves already-migrated code (supports partial migrations)
3. refactor_to_pom
Refactors migrated tests to use Page Object Model:
Extracts page interactions into page classes
Generates actual locator properties from test code
Creates reusable page object files
Applies Playwright POM patterns
Supports existing page objects
4. get_playwright_docs
Retrieves relevant Playwright documentation:
Selectors and locators (with data-test-id examples)
Assertions
Fixtures
Page Object Model
Auto-waiting behavior
Configuration
5. compare_frameworks
Provides side-by-side comparison:
50+ WDIO commands → Playwright equivalents
Syntax differences
Best practice recommendations
Related commands table
6. detect_project_state (NEW)
Analyzes project structure to detect:
Existing Playwright configuration
Existing WDIO configuration
Already migrated tests
Partially migrated tests
Existing page objects
Project directory structure
Recommendations for migration strategy
7. migrate_config
Migrates wdio.conf.js to playwright.config.ts:
Extracts baseUrl, specs, capabilities
Generates proper Playwright config
Sets
testIdAttribute: 'data-test-id'Merges with existing Playwright config if present
8. register_custom_commands (NEW)
Registers project-specific custom WDIO commands:
Add custom command → Playwright mappings
Commands are used in subsequent migrations
Persists during server session
9. generate_migration_report (NEW)
Generates comprehensive migration report as markdown:
Migration statistics (total, migrated, pending, failed)
Tags summary with Playwright grep commands
File-by-file status
Detailed test list with tags
Related MCP server: Browser Testing MCP Server
Tag Migration
The tool automatically migrates test tags from WDIO to Playwright format:
WDIO (tags in description):
it('should login successfully [SMOKE] [P1]', async () => { ... });
it('should validate form @regression', async () => { ... });Playwright (tag annotations):
test('should login successfully', { tag: ['@smoke', '@p1'] }, async ({ page }) => { ... });
test('should validate form', { tag: ['@regression'] }, async ({ page }) => { ... });Run tests by tag: npx playwright test --grep @smoke
Installation
npm installUsage
As MCP Server (stdio - Local)
Add to your MCP client configuration (e.g., Claude Desktop, GitHub Copilot):
{
"mcpServers": {
"tests-migration": {
"command": "node",
"args": ["/path/to/mcp-server-tests-migration/index.js"]
}
}
}Standalone (stdio)
npm startHTTP Server (Remote/Docker)
Run the HTTP server for remote access:
npm run start:httpThe server will be available at http://localhost:3000
Docker Deployment
Build and run with Docker:
# Build image
npm run docker:build
# or
docker build -t mcp-server-tests-migration:2.1.0 .
# Run container
npm run docker:run
# or
docker run -p 3000:3000 mcp-server-tests-migration:2.1.0
# Using docker-compose
npm run docker:compose
# or
docker-compose up -dHTTP API Endpoints
When running in HTTP mode, the following endpoints are available:
Endpoint | Method | Description |
| GET | API documentation |
| GET | Health check |
| POST | MCP Streamable HTTP (recommended) |
| GET | MCP SSE stream for responses |
| DELETE | Close MCP session |
| GET | Legacy SSE connection |
| POST | Analyze WDIO test |
| POST | Migrate to Playwright |
| POST | Refactor to Page Object Model |
| POST | Compare WDIO/Playwright commands |
| GET | Get Playwright documentation |
| POST | Detect project state |
| POST | Migrate wdio.conf.js |
| POST | Register custom commands |
| POST | Generate migration report |
HTTP API Examples
# Analyze a test
curl -X POST http://localhost:3000/api/analyze \
-H "Content-Type: application/json" \
-d '{"testContent": "const { expect } = require(\"chai\");\ndescribe(\"Test\", () => { it(\"works\", async () => { await $(\"#btn\").click(); }); });"}'
# Migrate a test
curl -X POST http://localhost:3000/api/migrate \
-H "Content-Type: application/json" \
-d '{"testContent": "...", "outputFormat": "typescript"}'
# Get Playwright docs
curl http://localhost:3000/api/docs/selectorsConnecting MCP Clients to HTTP Server
For MCP clients that support Streamable HTTP transport (recommended):
http://your-server:3000/mcpFor legacy clients using SSE transport:
http://your-server:3000/sseExample Configuration Files
See the examples/ directory for ready-to-use configuration files:
mcp-config-local.json- Local stdio modemcp-config-http-local.json- Local HTTP/SSE modemcp-config-http-remote.json- Remote HTTP/SSE modemcp-config-docker-stdio.json- Docker with stdio
For detailed configuration options, see docs/client-configuration.md
Migration Workflow
Step 0: Detect Project State (Recommended)
// Use detect_project_state tool to understand current migration status
// Provides insights on existing Playwright config, migrated tests, page objectsStep 1: Analyze
// Use analyze_wdio_test tool with your WDIO test content
// This provides insights into the test structure and complexity
// Detects if test is already partially migratedStep 2: Migrate Config (if needed)
// Use migrate_config tool to convert wdio.conf.js to playwright.config.ts
// Preserves existing Playwright config if presentStep 3: Migrate Tests
// Use migrate_to_playwright tool to convert to Playwright
// AST-based transformation preserves already-migrated code
// Tests will use direct page interactions (no POM yet)Step 4: Refactor to POM
// Use refactor_to_pom tool to apply Page Object Model
// This creates maintainable, reusable page classes
// Reuses existing page objects if presentStep 5: Verify
// Use get_playwright_docs and compare_frameworks for reference
// Review and adjust generated code as needed
// Run tests: npx playwright testExample
Original WDIO Test:
describe('Login Test', () => {
it('should login successfully', async () => {
await browser.url('https://example.com/login');
await $('#username').setValue('testuser');
await $('#password').setValue('testpass');
await $('#login-button').click();
await $('#dashboard').waitForDisplayed();
expect(await $('#welcome-message').getText()).to.equal('Welcome!');
});
});After Migration (Step 2):
import { test, expect } from '@playwright/test';
test.describe('Login Test', () => {
test('should login successfully', async ({ page }) => {
await page.goto('https://example.com/login');
await page.locator('#username').fill('testuser');
await page.locator('#password').fill('testpass');
await page.locator('#login-button').click();
await expect(page.locator('#dashboard')).toBeVisible();
await expect(page.locator('#welcome-message')).toHaveText('Welcome!');
});
});After POM Refactoring (Step 3):
// login.spec.js
import { test, expect } from '@playwright/test';
import { LoginPage } from './pages/LoginPage';
test.describe('Login Test', () => {
test('should login successfully', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login('testuser', 'testpass');
await expect(loginPage.dashboardSection).toBeVisible();
await expect(loginPage.welcomeMessage).toHaveText('Welcome!');
});
});
// pages/LoginPage.js
export class LoginPage {
constructor(page) {
this.page = page;
this.usernameInput = page.locator('#username');
this.passwordInput = page.locator('#password');
this.loginButton = page.locator('#login-button');
this.dashboardSection = page.locator('#dashboard');
this.welcomeMessage = page.locator('#welcome-message');
}
async goto() {
await this.page.goto('https://example.com/login');
}
async login(username, password) {
await this.usernameInput.fill(username);
await this.passwordInput.fill(password);
await this.loginButton.click();
}
}Key Migration Concepts
WDIO → Playwright Mapping
WDIO | Playwright |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Playwright Advantages
Auto-waiting: No need for explicit waits in most cases
Web-first assertions: Built-in retry logic
Modern selectors: getByRole, getByText, getByLabel, getByTestId
data-test-id support: Configure with
testIdAttribute: 'data-test-id'Better debugging: Playwright Inspector, trace viewer
Parallel execution: Built-in support
Multiple browsers: Chromium, Firefox, WebKit
AST-based migration: Accurate code transformation
Key Improvements in v2.0
AST-based parsing: Uses Babel parser for accurate code analysis and transformation
Complete command mappings: 50+ WDIO commands mapped to Playwright equivalents
Modern locator suggestions: Recommends getByTestId, getByRole, getByLabel
data-test-id support: Uses
data-test-idattribute (configurable)Partial migration support: Detects and preserves already-migrated code
Project state detection: Understands existing Playwright setup
Config migration: Converts wdio.conf.js to playwright.config.ts
Smart POM generation: Extracts actual selectors into page object classes
TypeScript output: Full TypeScript support with type annotations
Tag migration: Converts
[TAG],@tag,#tagto Playwright annotationsCustom commands: Register project-specific WDIO commands
Migration reports: Generate comprehensive markdown reports
Requirements
Node.js 18+
@modelcontextprotocol/sdk
@babel/parser, @babel/traverse, @babel/generator (for AST)
express (for HTTP server)
Project Structure
mcp-server-tests-migration/
├── index.js # CLI entry point
├── server-http.js # HTTP server (Docker/remote)
├── src/
│ ├── index.js # Module exports
│ ├── server.js # MCP server class
│ ├── constants/
│ │ └── mappings.js # WDIO→Playwright command mappings
│ ├── handlers/
│ │ ├── tools.js # Tool definitions (schema)
│ │ └── toolHandlers.js # Tool implementations
│ ├── transformers/
│ │ ├── migration.js # AST-based migration
│ │ ├── pom.js # Page Object Model
│ │ └── selectors.js # Selector transformation
│ └── utils/
│ ├── config.js # Config file parsing
│ ├── docs.js # Playwright documentation
│ ├── parser.js # AST parsing utilities
│ ├── report.js # Migration report generation
│ └── tags.js # Tag extraction utilities
├── examples/ # Example configs and tests
├── docs/ # Documentation
├── Dockerfile
└── docker-compose.ymlLicense
MIT
Author
Luca Donnaloia
Contributing
Contributions welcome! Please feel free to submit pull requests or open issues.
Roadmap
AST-based parsing and transformation
Complete command mappings (50+)
Modern locator suggestions
Project state detection
Config migration
Partial migration support
TypeScript output support
Custom WDIO commands handling
Migrate tests tag
[TAG],@tag,#tagto Playwright tag annotationsMigration report generation with tags summary
SOLID principles refactoring
WDIO services migration (custom services)
Visual comparison of test coverage by tags
Batch file processing
Available Tools
9 toolsanalyze_wdio_testA
Analyzes a WebDriverIO test file using AST parsing and extracts detailed information about its structure, selectors, commands, and dependencies. Detects if test is already partially migrated to Playwright.
| Name | Required | Description | Default |
|---|---|---|---|
| testContent | Yes | The complete content of the WDIO test file to analyze | |
| filePath | No | Optional file path for context |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full burden. It successfully discloses the implementation method (AST parsing) and specific extraction targets, but fails to explicitly confirm this is a read-only/safe operation or describe the return format/structure despite the absence of an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The first sentence front-loads the core action, method, and primary outputs. The second sentence adds the specific migration-detection capability that differentiates this from generic analysis tools. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description adequately covers the input processing logic but leaves gaps given the lack of annotations and output schema. It omits safety guarantees (read-only status), return value structure, and how this analysis feeds into the broader migration workflow suggested by sibling tools. Sufficient for basic invocation but incomplete for full context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with testContent and filePath fully documented. The description references 'WebDriverIO test file' which aligns with the testContent parameter, but adds no additional semantic context (e.g., expected file size limits, syntax requirements) beyond what the schema already provides, warranting the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description provides a specific verb ('Analyzes'), target resource ('WebDriverIO test file'), method ('AST parsing'), and detailed outputs ('structure, selectors, commands, and dependencies'). It distinguishes from siblings like detect_project_state by specifying single-file AST analysis and from migrate_to_playwright by clarifying this is analysis-only with a specific focus on detecting partial migration status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While the description clearly states what the tool does, it lacks explicit guidance on when to use it versus siblings like detect_project_state (project-wide analysis) or migrate_to_playwright (actual transformation). The usage is implied by the functionality but no explicit 'when-to-use' or workflow prerequisites are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_frameworksB
Compares WDIO and Playwright commands/concepts side by side. Helps understand equivalent functionality.
| Name | Required | Description | Default |
|---|---|---|---|
| wdioCommand | Yes | The WDIO command or pattern to find Playwright equivalent for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden but fails to disclose output format (table? JSON?), whether the operation is read-only/safe, or any limitations on which commands can be compared. It only describes functional intent, not behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences efficiently convey the core purpose. The second sentence ('Helps understand equivalent functionality') is slightly redundant with the comparison concept but acceptable. No unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter lookup tool, the description adequately covers the input purpose but lacks output description (what the side-by-side comparison looks like) and safety guarantees that would be necessary given the absence of annotations and output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage ('The WDIO command or pattern to find Playwright equivalent for'), so the description meets the baseline expectation. It does not add additional semantic context like example commands or input constraints beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs ('compares') and resources ('WDIO and Playwright commands/concepts') and clearly distinguishes from siblings like 'migrate_to_playwright' (which performs migration) and 'get_playwright_docs' (which retrieves documentation) by emphasizing side-by-side comparison functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'helps understand equivalent functionality' implies educational/lookup usage, but lacks explicit guidance on when to use this versus 'migrate_to_playwright' (for actual migration) or 'get_playwright_docs' (for general documentation). No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_project_stateA
Analyzes project structure to detect existing Playwright configuration, migrated tests, page objects, and WDIO setup. Helps understand current migration state.
| Name | Required | Description | Default |
|---|---|---|---|
| projectFiles | Yes | JSON string containing file paths and their contents to analyze |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. 'Analyzes' and 'detect' imply read-only behavior, but the description lacks explicit safety guarantees, side effect warnings, or output format disclosure despite having no output schema to reference.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences with zero waste. First sentence establishes capability, second establishes value proposition. Front-loaded with the action verb and appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description adequately lists detectable artifacts but omits return value description, error scenarios, or prerequisites. Sufficient for a single-parameter analysis tool but leaves gaps in behavioral contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (projectFiles is fully described in schema), establishing baseline 3. The description mentions 'analyzes project structure' which loosely implies the input, but adds no specific semantics about the JSON string format, size limits, or content expectations beyond the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear specific action ('Analyzes project structure') and resources detected (Playwright configuration, WDIO setup, page objects). The phrase 'Helps understand current migration state' distinguishes it from sibling migration tools like migrate_to_playwright, though it doesn't explicitly contrast with analyze_wdio_test.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage context through 'migration state' but lacks explicit when-to-use guidance (e.g., 'Use this before migrating to assess current state') or when-not-to-use (e.g., 'Do not use for analyzing individual test logic—use analyze_wdio_test instead').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_migration_reportB
Generates a comprehensive migration report as a markdown file. Includes test files, tags, migration status, and statistics.
| Name | Required | Description | Default |
|---|---|---|---|
| migratedTests | Yes | JSON string array of migrated test information with file paths, tags, and status | |
| projectName | No | Name of the project for the report header |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Mentions output format (markdown file) but omits critical behavioral traits: side effects (file system write location/overwrite behavior), return value format, and idempotency. 'Generates' implies mutation but lacks safety context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences with zero waste. First sentence establishes purpose and format; second details content. Front-loaded and appropriately sized for tool complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a 2-parameter tool with full schema coverage. However, lacking output schema, description should indicate what is returned (file path, content, or status) but only states 'generates... file' without specifying the return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage, establishing baseline of 3. Description mentions report contents ('test files, tags, migration status, and statistics') which aligns with migratedTests parameter, but adds no syntax guidance or examples beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'Generates' with clear resource 'migration report' and output format 'markdown file'. Distinct from sibling tools focused on analysis, migration, or refactoring—this is the only reporting tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use versus alternatives, or prerequisites (e.g., whether to run after migration completes). Lacks 'when-not' guidance despite multiple sibling migration tools where sequencing matters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_playwright_docsC
Retrieves relevant Playwright documentation for specific features, commands, or concepts. Useful for understanding migration patterns.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | The Playwright feature or concept to get documentation for (e.g., "selectors", "assertions", "fixtures", "page-object-model") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full disclosure burden. While 'Retrieves' implies a read-only operation, the description fails to specify output format (markdown, plain text, structured JSON?), whether results are cached, or any rate limiting concerns. It does not disclose what 'relevant' means algorithmically.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two efficient sentences totaling 12 words. The primary action is front-loaded in the first sentence, and the second sentence provides contextual usage hints. No redundant or filler text is present, though the second sentence could be more specific.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema provided, the description should ideally describe the return format (documentation text, code examples, links?). It fails to do so. For a single-parameter retrieval tool, the description covers the input side but leaves the output side completely undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with the 'topic' parameter fully described including examples. The description mentions 'specific features, commands, or concepts' which aligns with the schema but adds no additional semantic value beyond what the schema already provides. Baseline 3 is appropriate given comprehensive schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Retrieves relevant Playwright documentation' using a specific verb and resource. However, it does not explicitly differentiate from siblings like 'migrate_to_playwright' or 'compare_frameworks' beyond implicitly mentioning the 'migration' context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions the tool is 'Useful for understanding migration patterns,' which provides implied context, but lacks explicit guidance on when to use this versus alternatives (e.g., when to lookup docs vs. when to run the actual migration). No 'when-not' or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
migrate_configB
Migrates wdio.conf.js to playwright.config.ts. Preserves existing Playwright config if present.
| Name | Required | Description | Default |
|---|---|---|---|
| wdioConfig | Yes | Content of wdio.conf.js file | |
| existingPlaywrightConfig | No | Optional existing playwright.config.ts content to merge with |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full behavioral burden. It successfully discloses the merge/preservation behavior for existing Playwright configs. However, it omits critical safety context: whether this performs a disk write or returns content, error handling for invalid WDIO configs, and whether the operation is destructive or reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely efficient at two sentences. The first sentence front-loads the core action, and the second adds a crucial behavioral qualifier. Zero redundant words or tautologies; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a two-parameter tool, covering the core transformation and merge logic. However, given the lack of output schema and annotations, the description should ideally indicate the return format (generated config content) and clarify side effects (disk vs memory operation). As-is, it leaves operational ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3. The description mentions preservation behavior which maps to the existingPlaywrightConfig parameter, but this largely restates the schema's 'to merge with' semantics. No additional parameter constraints, format details, or syntax guidance is provided beyond the structured schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific transformation (wdio.conf.js → playwright.config.ts) using a concrete verb ('migrates'). It distinguishes from siblings like 'migrate_to_playwright' by specifying this is config-file-only migration, though it could more explicitly clarify the relationship to the broader migration tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to select this tool versus 'migrate_to_playwright' or other siblings. While the config-specific scope implies usage context, there is no 'when to use' or 'when not to use' instruction to help the agent decide between configuration migration versus full test migration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
migrate_to_playwrightA
Migrates a WebDriverIO test to Playwright syntax using AST transformation. Supports partial migrations and preserves already-migrated code. Uses modern Playwright locators (getByRole, getByLabel, getByTestId with data-test-id). Supports TypeScript output.
| Name | Required | Description | Default |
|---|---|---|---|
| testContent | Yes | The WDIO test content to migrate | |
| analysisResult | No | Optional JSON string of previous analysis result to use as context | |
| filePath | No | Original file path for naming reference | |
| outputFormat | No | Output format: javascript (default) or typescript |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden. It discloses key behavioral traits: AST transformation (implementation approach), preservation of existing code (safety/idempotency), and partial migration support. However, it fails to disclose critical operational details like whether the tool returns transformed content as a string or writes to disk, or what happens on parse errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with zero waste: core purpose (sentence 1), idempotency behavior (sentence 2), implementation specifics (sentence 3), and output format support (sentence 4). Front-loaded with the essential verb and resource, making it immediately scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 100% schema coverage and moderate complexity (4 parameters, no nested objects), the description provides adequate context about the migration approach and safety characteristics. However, lacking an output schema, it should ideally disclose the return format (transformed code string) and whether filePath is used for resolution or purely metadata.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema adequately documents all four parameters. The description reinforces the TypeScript output option and implies testContent should be parseable code via 'AST transformation,' but adds minimal semantic detail beyond what the structured schema already provides. Baseline score appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action (migrates), source (WebDriverIO test), target (Playwright syntax), and method (AST transformation). It distinguishes from siblings like migrate_config (tests vs config) and refactor_to_pom (syntax migration vs POM refactoring) by specifying AST-based code transformation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies iterative usage through 'supports partial migrations and preserves already-migrated code,' suggesting idempotent behavior. The optional analysisResult parameter hints at workflow integration with analyze_wdio_test. However, it lacks explicit when-to-use guidance versus alternatives like refactor_to_pom or prerequisites for the migration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refactor_to_pomA
Refactors a migrated Playwright test to use Page Object Model pattern. Extracts actual selectors and creates proper page object classes with methods.
| Name | Required | Description | Default |
|---|---|---|---|
| testContent | Yes | The migrated Playwright test content to refactor | |
| filePath | No | File path for generating appropriate page object names | |
| existingPageObjects | No | Optional JSON string of existing page objects to extend or reuse |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses behavioral mechanics ('Extracts actual selectors', 'creates proper page object classes') but omits critical operational details: whether it writes files or returns content, if it's destructive to existing code, or what the return format looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly constructed sentences with zero waste. Front-loaded with the primary action (refactoring to POM), followed by specific implementation details (extracting selectors, creating classes). Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a code-generation tool with 3 parameters and no annotations/output schema, the description adequately covers the transformation logic but leaves gaps regarding I/O behavior (returns code vs. writes files) and side effects. Complete enough for basic selection but missing operational safety details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all three parameters. The description adds minimal parameter-specific semantics beyond implying 'testContent' contains selectors to extract, meeting the baseline for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'Refactors' with clear resource 'migrated Playwright test' and specifies the pattern 'Page Object Model'. It clearly distinguishes from sibling 'migrate_to_playwright' (which handles migration) by targeting already-migrated tests for structural refactoring.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'migrated Playwright test' implies this is for post-migration scenarios, providing implicit context. However, it lacks explicit guidance on when to use versus siblings like 'analyze_wdio_test' or prerequisites like requiring a successful migration first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_custom_commandsB
Registers custom WDIO commands with their Playwright equivalents for migration. Allows handling project-specific custom commands.
| Name | Required | Description | Default |
|---|---|---|---|
| commands | Yes | JSON string of custom command mappings: { "customCommand": { "method": "playwrightMethod", "description": "..." } } |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden but provides only basic behavioral information. It states that registration occurs but omits critical details: whether registrations persist across sessions, whether they modify files or internal state, validation behavior for the JSON input, and how these mappings interact with the migration process.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately brief with two sentences. However, the second sentence ('Allows handling project-specific custom commands') is somewhat redundant, merely restating the purpose rather than adding new information. It is front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter registration tool, the description is minimally adequate. However, given the complexity of migration tooling and lack of output schema, it should clarify what 'registration' means (persistence scope, validation) and whether this is a prerequisite step for 'migrate_to_playwright'. It leaves ambiguity about side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, providing detailed structure for the 'commands' parameter (including example JSON format). The description itself adds no additional parameter semantics beyond the schema, so it meets the baseline score of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Registers') and the specific resource (custom WDIO commands with Playwright equivalents). It implicitly distinguishes from sibling 'migrate_to_playwright' by focusing on 'custom' commands versus general test migration, though it could be more explicit about this distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like 'migrate_to_playwright'. While 'project-specific custom commands' implies usage for user-defined extensions rather than built-in commands, there is no explicit 'when to use' or 'when not to use' instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
9 tool updates
v2.1.0- First observed
analyze_wdio_test - First observed
compare_frameworks - First observed
detect_project_state - First observed
generate_migration_report - First observed
get_playwright_docs - First observed
migrate_config - First observed
migrate_to_playwright - First observed
refactor_to_pom - First observed
register_custom_commands
TDQS
Each tool has a distinct, well-defined purpose within the migration workflow, with no overlap or ambiguity. For example, analyze_wdio_test focuses on test analysis, migrate_to_playwright handles syntax conversion, and refactor_to_pom deals with architectural refactoring, ensuring clear boundaries.
All tools follow a consistent verb_noun naming pattern (e.g., analyze_wdio_test, generate_migration_report, migrate_config). The naming is uniform, readable, and predictable across all nine tools, with no deviations in style or convention.
With 9 tools, the server is well-scoped for its purpose of migrating from WDIO to Playwright. Each tool earns its place by covering different aspects of the migration process, from analysis and comparison to actual migration and refactoring, without being overly sparse or bloated.
The tool set provides complete coverage of the migration domain, including analysis (analyze_wdio_test, detect_project_state), comparison (compare_frameworks), migration (migrate_to_playwright, migrate_config), refactoring (refactor_to_pom), documentation (get_playwright_docs), reporting (generate_migration_report), and customization (register_custom_commands). No obvious gaps exist, supporting end-to-end workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Playwright selector risk checks with healing suggestions and receipts.
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
Direct access to Cypress tests results and accessibility reports in your AI workflow.
AI-powered web automation. Navigate websites using AI agents for one page or a thousand
Related MCP Servers
- AlicenseAqualityDmaintenanceGenerates intelligent Playwright locators with reliability rankings, creates Page Object Models, and runs test automation scripts directly from your IDE or AI assistant.5161MIT
- FlicenseNot gradedqualityDmaintenanceEnables automated browser testing of web applications using Playwright, supporting user interactions, form submissions, console monitoring, network request inspection, and visual verification through screenshots.-
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to execute browser automation, perform QA tasks, and generate test code through natural language commands using Playwright.5-
- AlicenseNot gradedqualityDmaintenanceAutomates repository analysis, test planning, and generation of end-to-end tests with Playwright, acting as an intelligent quality assistant.16MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/lucad87/mcp-server-tests-migration'
If you have feedback or need assistance with the MCP directory API, please join our Discord server