MCP Tauri Automation
MCP Tauri Automation
A small local MCP server for testing Tauri desktop apps. Connect to a test app, inspect a bounded UI snapshot, click/type/wait, and capture a screenshot.
2.0.0-rc.1 requires Node.js 22 or newer. It supports an already running embedded WebDriver server (including macOS) and the external tauri-driver flow. This is a release candidate; see CHANGELOG.md for compatibility changes and the distinction between automated protocol tests and native proof. The embedded flow passed a native macOS arm64 smoke on September 7, 2026, including click/type, screenshot capture, and session reconnection. Linux and Windows native acceptance remains unverified; see the validation receipt.
Install
From source:
git clone https://github.com/Radek44/mcp-tauri-automation.git
cd mcp-tauri-automation
npm ci
npm testThe server uses stdio. Start it with Node and an absolute path:
node /absolute/path/to/mcp-tauri-automation/dist/index.jsRegister with Codex (official configuration guide):
codex mcp add tauri-automation -- node /absolute/path/to/mcp-tauri-automation/dist/index.jsOr Claude Code:
claude mcp add --transport stdio tauri-automation --scope user -- node /absolute/path/to/mcp-tauri-automation/dist/index.jsAny stdio MCP client can use the same command and arguments. No provider API key or additional model service is needed. Restart/reconnect the MCP client after changing its configuration.
Connect a test app
Embedded WebDriver — macOS, Linux, Windows
Build your app with the optional tauri-plugin-wdio-webdriver test plugin. Launch that build yourself with a dedicated port and isolated test data:
TAURI_WEBDRIVER_PORT=4445 WDIO_EMBEDDED_SERVER=true /absolute/path/to/test-appThen call connect_app with {"port":4445}. It creates a new session on 127.0.0.1; it does not discover apps, take over an existing session, or launch a process. close_app deletes that session; your externally launched app remains running. The launcher remains responsible for stopping the exact process.
The WebDriver plugin belongs in test builds, and visible UI tests need an unlocked desktop. See the Tauri WebDriver guide and plugin setup.
External tauri-driver — Linux and Windows
Install and run the platform driver as described in Tauri's manual setup. Then call launch_app with {"appPath":"/absolute/path/to/app"}. The driver owns launching the app; deleting its session requests teardown. Native process behavior ultimately belongs to that driver.
Tools
Tool | Inputs / behavior |
connect_app | Optional port; create a session on a running embedded server. |
launch_app | Optional appPath, args, env; use TAURI_APP_PATH when path is omitted. |
close_app | Delete the owned session. |
get_app_state | Session metadata and a live title/location probe; reports failed health checks. |
inspect_ui | Optional CSS selector, limit (1–100, default 20), maxTextLength (0–1000, default 160). |
click_element | CSS selector; standard WebDriver click. |
type_text | selector, text, optional clear (false appends, true clears then types). |
wait_for_element | selector, optional timeout and state: attached (default), visible, or hidden. |
get_element_text | CSS selector; maximum 12,000 characters, otherwise use a narrower selector. |
capture_screenshot | Native MCP PNG by default; returnBase64:false saves a local file. Optional basename filename. |
execute_tauri_command | Compatibility/debug tool: command, optional args; requires an enabled global Tauri invoke bridge. |
inspect_ui returns bounded text, role/name hints, enabled/visible state, viewport intersection, rectangles, and own/effective opacity. Truncation flags disclose omitted results. It does not return HTML, input values, application stores, or an accessibility-tree conformance claim. A screenshot is still needed for visual judgment; geometry does not prove appearance or interaction.
Start with inspect_ui, narrow the selector if necessary, perform the action, then use wait_for_element or a targeted read to confirm the result. Capture images when they answer a visual question. This reduces repetitive diagnostic calls and large DOM dumps; no measured model-token saving is claimed.
All calls execute in order. Action requests are never automatically retried. If an action times out, it may already have happened: inspect before retrying. If session creation has an unknown outcome, restart the isolated app/driver and this MCP server before creating another session. A failed session deletion retains ownership so close_app can retry cleanup.
Configuration
All variables are optional. Invalid numeric configuration fails startup.
Variable | Default |
TAURI_APP_PATH | No default |
TAURI_WEBDRIVER_PORT | 4444; connect_app.port overrides it |
TAURI_DEFAULT_TIMEOUT | 5000 ms, range 1–60,000; per WebDriver request |
TAURI_SCREENSHOT_DIR | ./screenshots, resolved when the MCP process starts |
Only 127.0.0.1 is used; redirects are rejected. Responses are capped at 1 MiB, or 16 MiB for screenshot JSON. Screenshot filenames cannot include directories; existing files are never overwritten. TAURI_DRIVER_PATH was never used to spawn a driver and remains unnecessary.
UI text, names, titles, and images can contain user content. Use disposable test data and expose only the tools appropriate to the task. Page locations omit credentials, query strings, and fragments; this is not a general secret scanner.
For Saga/Vuea, use this server for native UI evidence with a test-owned data directory. Use SagaDoc's own validated MCP tools for document authoring and its normal review controls for human decisions. Exclude execute_tauri_command from that automation profile; it must not become a shortcut around the document service or human Finish Session boundary. See the local example and Saga smoke recipe.
Development
npm ci
npm run verifyThe gate builds TypeScript, runs Node's test runner against local fake WebDriver servers and real MCP transports, audits runtime dependencies, and checks the package contents. It does not require a desktop session. Native testing is separate and must identify the app build, isolated data, platform, and results.
The runtime uses Node fetch for the narrow W3C command set; it does not download browsers or require WebdriverIO. Diagnostics go to stderr; stdout carries MCP. The package contains the compiled runtime, docs/examples, and native probe.
MIT license. Contributions welcome; keep additions tied to a demonstrated workflow and include a deterministic failure/success oracle.
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/Radek44/mcp-tauri-automation'
If you have feedback or need assistance with the MCP directory API, please join our Discord server