A Model Context Protocol (MCP) server for Robot Framework test automation, with two interchangeable browser-automation backends: SeleniumLibrary and Playwright (Robot Framework Browser library).
Alongside the original SeleniumLibrary tooling, this server now ships a Playwright-powered backend using Robot Framework's Browser library — the modern, actively-developed, high-demand choice for browser automation (auto-wait, multi-browser support for Chromium/Firefox/WebKit, faster and more reliable than Selenium for most workflows).
Switch backends with a single flag — no separate install to manage, it's bundled in this package:
npx -y robotframework-mcp-server --library=browser # Playwright / Browser library
npx -y robotframework-mcp-server --library=selenium # SeleniumLibrary (default)First run with --library=browser bootstraps its own environment automatically (installs deps + rfbrowser init, one-time, a couple of minutes). Because that can exceed an MCP client's startup timeout, it's best to run the setup once from a terminal first:
npx -y robotframework-mcp-server --library=browser --setup # prepare the backend, then exitSee "Browser Library (Playwright) Tools" below for the full tool list.
- 🎭 Playwright / Browser library backend — modern, auto-waiting, multi-browser (Chromium/Firefox/WebKit) automation, selectable with
--library=browser - 🤖 Generate Robot Framework test cases with SeleniumLibrary
- 📄 Create page object models for web testing
- ⚡ Advanced Selenium keywords for common web interactions
- 📸 Screenshot capabilities and performance monitoring
- 🎯 Input validation and configurable selectors
- 📊 Performance monitoring and metrics collection
- 🔄 Data-driven testing templates
- 🌐 API integration testing capabilities
- 🖥️ Live browser control — launch, click, type, screenshot without writing
.robotfiles - 🚀 CI/CD pipeline generation for GitHub Actions
RobotFrameworkMCP.mp4
- Python 3.10 or higher
- Node.js 14.0 or higher (for npx method)
- UV (for UV method - optional but recommended)
- Git (for installation from repository)
This server has two interchangeable backends, selected with --library:
selenium(default) — SeleniumLibrary-based code generation + live browser control tools.browser— Playwright-based Robot Framework Browser library tools. Self-contained: on first run it creates its own.venvunderbrowser/and runsrfbrowser initautomatically (downloads Playwright browsers, one-time, a couple of minutes).
--librarysupport by install method: works with Method 1 (npx), Method 2 (PyPI, with the[browser]extra) and the Node-wrapper variant of Method 4. Method 3 (UV) and the plainpython mcp_server.pyvariant of Method 4 run the Selenium backend only.
Add to your MCP client configuration (e.g., mcp.json) in your VS code or VS code insider:
{
"servers": {
"robotframework-mcp": {
"command": "npx",
"args": [
"-y",
"robotframework-mcp-server",
"--project-dir=/path/to/your/project", //Optional- If you want to run the mcp for local virtual environment or specific project only
"--library=browser" //Optional- "selenium" (default) or "browser" (Playwright)
],
"type": "stdio"
}
}
}# SeleniumLibrary backend (default)
pip3 install robotframework-mcp
robotframework-mcp
# Playwright / Browser library backend
pip3 install "robotframework-mcp[browser]"
robotframework-mcp --library=browser --setup # one-time: downloads Playwright browsers
robotframework-mcp --library=browserpip3 install robotframework-mcp installs only the Selenium dependencies. The [browser] extra adds the Playwright-based Browser library. If you installed without the extra, robotframework-mcp --library=browser --setup installs the Browser library into the same environment for you, then runs rfbrowser init. Run --setup once from a terminal before adding the server to your MCP client, because the first-time download can exceed the client's startup timeout.
For MCP Clients (VS code or VS code inside, etc.):
{
"mcpServers": {
"robotframework-mcp": {
"command": "robotframework-mcp",
"args": ["--library=browser"], //Optional- "selenium" (default) or "browser" (needs the [browser] extra)
"type": "stdio"
}
}
}Selenium backend only —
--libraryis not supported here.
First install UV:
# Install UV (choose one method)
curl -LsSf https://astral.sh/uv/install.sh | sh # Unix/macOS
# OR
pip install uv # Any platform
# OR on Windows PowerShell (as Administrator)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"Then add to your MCP configuration:
{
"servers": {
"robotframework-mcp": {
"command": "uv",
"args": [
"run",
"--with",
"git+https://github.com/sourcefuse/robotframework-MCP.git",
"python",
"-c",
"import mcp_server; mcp_server.main()"
],
"type": "stdio"
}
}
}For development or when you want to modify the source code:
# Clone the repository
git clone https://github.com/sourcefuse/robotframework-MCP.git
cd robotframework-MCP
# Create virtual environment
python3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Run the MCP server directly (Selenium backend only)
python mcp_server.pyFor MCP Clients (VS Code, Claude Desktop, etc.) — Selenium backend only, --library not supported:
{
"servers": {
"robotframework-mcp": {
"command": "python",
"args": ["/path/to/cloned/robotframework-MCP/mcp_server.py"],
"type": "stdio"
}
}
}Or using the Node.js wrapper from cloned repo — this variant supports --library=selenium|browser:
{
"servers": {
"robotframework-mcp": {
"command": "node",
"args": [
"/path/to/cloned/robotframework-MCP/bin/robotframework-mcp.js",
"--project-dir=/path/to/your/project",
"--library=browser"
],
"type": "stdio"
}
}
}The MCP server provides the following comprehensive tools for Robot Framework test automation:
Available only when the server is started with --library=browser. Each tool is a thin wrapper around a real Robot Framework Browser library keyword, run against a single persistent session.
| Tool | Description |
|---|---|
open_browser(url, browser="chromium", headless=True) |
Launch a browser (chromium, firefox, or webkit) |
new_page(url) / close_page() / close_browser() |
Manage pages and the browser session |
session_status() |
Real current state: browser open?, open pages, active URL and title |
reset_session(url=None) |
Close everything and optionally start a fresh browser on url — recover from an unreliable state |
go_to(url, timeout_s=None), get_url(), get_title() |
Navigation |
click(selector), fill_text, type_text, clear_text, press_keys |
Interactions |
check_checkbox / uncheck_checkbox / select_options_by |
Form controls |
get_text, get_attribute, get_element_count |
Reading page content |
wait_for_elements_state(selector, state="visible") |
Wait for an element state |
take_screenshot, evaluate_javascript |
Screenshots & JS |
run_keyword(name, args) |
Escape hatch — run any Browser-library keyword by name |
export_robot_test(test_name, path=None, overwrite=False) |
Export the steps that ran and passed as a draft .robot test for review |
clear_recording() |
Drop the steps recorded so far, so the export starts from now |
Turning an exploration into a reviewable test. While the assistant drives the browser, every keyword that passes is recorded exactly as it ran. export_robot_test writes those steps into a draft .robot file. Failed attempts are left out, and values the assistant only read (get_text, get_url, …) appear as commented assertions holding the value it saw, so a reviewer chooses which checks to keep:
*** Test Cases ***
Login Works
New Browser browser=chromium headless=True
New Page https://example.com/login
Fill Text id=user meenu
Fill Text id=pw ${PASSWORD} # typed values are recorded as-is: replace secrets
Click id=go
# Get Text id=h == Welcome meenureset_session also clears the recording. Use reset_session(url) before the clean run you want to keep, so the test starts from a fresh browser.
When a step fails (navigation timeout, missing element, bad argument…), the tool returns a proper MCP error (isError: true) containing Browser library's real message plus a snapshot of the page state after the failure, so the model re-plans from where the browser actually is instead of assuming the step worked:
'Go To' failed: TimeoutError: page.goto: Timeout 3000ms exceeded.
Page state after the failure (the page may be partially loaded or unchanged -- verify before continuing):
- url: https://example.com/
- title: Loading http://127.0.0.1:50315/
- open pages: 1
If the server itself stops waiting on a keyword, the error says the state is unknown (the keyword may still be running) and points the model to session_status / reset_session.
The following tools are available with the default --library=selenium backend:
create_login_test_case(url, username, password, template_type="appLocator")- Generate validated login test with configurable selectorscreate_page_object_login(template_type="appLocator")- Generate login page object model with validationcreate_data_driven_test(test_data_file="test_data.csv")- Generate data-driven test templatescreate_api_integration_test(base_url, endpoint, method="GET")- Generate API + UI integration tests
create_advanced_selenium_keywords()- Generate advanced SeleniumLibrary keywords (dropdowns, checkboxes, file uploads, alerts, etc.)create_extended_selenium_keywords()- Generate extended keywords with screenshots, performance monitoring, and window management
create_performance_monitoring_test()- Generate comprehensive performance testing with metrics collection
validate_robot_framework_syntax(robot_code)- Validate Robot Framework syntax and provide improvement suggestions
Drive a real browser directly — no .robot file needed. All tools share a persistent session and support Robot Framework-style selector prefixes (id=, css=, xpath=, name=, class=, tag=, link=, partial_link=).
| Tool | Description |
|---|---|
browser_launch(url, browser="Chrome", headless=False) |
Open Chrome or Firefox and navigate to a URL |
browser_navigate(url) |
Go to a new URL in the active session |
browser_click(selector, timeout=10) |
Click an element, waits until it is clickable |
browser_send_keys(selector, text, clear_first=True, timeout=10) |
Type into an input field |
browser_get_text(selector, timeout=10) |
Read visible text from an element |
browser_wait_for_element(selector, state="visible", timeout=10) |
Wait for visible, present, clickable, or hidden |
browser_screenshot(filename="") |
Save a PNG screenshot, returns the file path |
browser_close() |
Quit the browser and clean up the session |
Example — AI-driven login flow:
browser_launch("https://example.com")
browser_send_keys("id=username", "admin")
browser_send_keys("id=password", "secret")
browser_click("css=button[type='submit']")
browser_screenshot("results/after_login.png")
browser_close()Note: ChromeDriver must match your installed Chrome version. Update with
brew upgrade chromedriver(macOS) or download from googlechromelabs.github.io/chrome-for-testing.
create_cicd_pipeline(project_name, python_version, test_directory, trigger_branches, schedule, output_dir, requirements_file)- Generate a GitHub Actions workflow file ready to drop into.github/workflows/
The generated workflow:
- Triggers on push and pull requests to specified branches
- Supports optional cron schedule (e.g.
"0 9 * * 1-5"for weekdays at 09:00 UTC) - Auto-detects the Python version from the current environment (can be overridden)
- Sets up Chrome in headless mode on the runner
- Installs from
requirements.txtif present, falls back to core packages - Uploads the full
results/folder as a build artifact (30-day retention) - Parses
output.xmland reports pass/fail counts; fails the job if any test fails
Example:
create_cicd_pipeline(
project_name="my-rf-tests",
trigger_branches="main, develop",
schedule="0 9 * * 1-5", # weekdays 09:00 UTC
test_directory="tests/",
)Save the output to .github/workflows/robot-tests.yml in your repository.
The server supports multiple selector templates for different applications:
appLocator(default) - For web appsgeneric- Generic web application selectorsbootstrap- Bootstrap-based applications
All tools include comprehensive input validation:
- URL validation with protocol checking
- Credential sanitization and length limits
- Selector format validation
- Safe variable substitution in templates
Contributions are welcome! To contribute:
- Fork the repository
- Create a new branch
- Submit a pull request with a detailed description
Name: Meenu Rani Email: meenu.rani@sourcefuse.com GitHub: meenurani1
This project is licensed under the MIT License - see the LICENSE file for details.
Copyright (c) 2026 Sourcefuse