
Uindow
@uindow
About Uindow
Real browser automation for AI agents. Uindow ships a local MCP server that drives a real, signed Chromium/Electron browser with genuine OS-level input (real cursor movement, real keystrokes, native file dialogs) entirely on the user's own machine.
Config
Add this server to your MCP-compatible client using the configuration below.
{
"mcpServers": {
"uindow": {
"command": "npx",
"args": [
"-y",
"@uindow/cli",
"mcp"
]
}
}
}Tools
37Query SDK documentation **Never attempt to guess arguments!** Always call the `app_docs` tool again with **query** set to the method or property you're about to use to retrieve its full argument details and available code examples, which are usually complete Uindow modules exported in YAML format. Get the full list of available dollar sign ($) object properties and methods, or search for a particular method. Results are sorted in ascending order based on how close the query string is to the beginning of the paragraph. Use dollar sign ($) object properties and methods in pure JavaScript **code** blocks when calling `agents_execute` or `src_code_set`. Returns: Documentation for a dollar sign ($) object property or method in Markdown format, OR a list of all available dollar sign ($) object properties and methods in Markdown format.
Get application status Check whether Uindow was installed and started on this computer. Returns: `True` if the app was started, `false` otherwise
Start application If Uindow is already running, silently return `false`. Otherwise, download the required version of Electron.js and Uindow as needed, launch the Uindow application, and return `true`. Returns: `True` if the app was launched, `false` if it was already running
Stop application If Uindow was already stopped, or the quit signal could not be delivered, return `false`. Otherwise, issue a quit signal, wait for the app to exit gracefully, and return `true`. Returns: `True` if the app was stopped, `false` otherwise
List agents Get the list of agents that can perform tasks on this machine. Each agent is assigned a unique `index` from 1 to 9, which is used to identify the agent when issuing commands. You may use this list to map an agent's name to its `index` when a user refers to an agent by name, and to check whether the agent is currently executing a task. Returns: List of agents
Create agent Add a new agent with the specified name. A maximum of 9 agents can exist at a time; creating a 10th agent will fail. The name is trimmed and truncated to 64 characters. Use the `agents_list` tool to fetch all available agents and their indexes. Returns: A unique `index` from 1 to 9, which is used to identify this agent with various tools.
Update agent Update an agent's name. The name is trimmed and truncated to 64 characters. Use the `agents_list` tool to fetch all available agents and their indexes. Returns: `True` on success
Delete agent Delete an agent from the list. Use the `agents_list` tool to fetch all available agents and their indexes. Returns: `True` on success, `false` on failure
Get agent status Check whether the agent is currently executing a task. Use the `agents_logs` tool to get the agent status object and the latest logs. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `agents_start` tool to start or unpause the agent as needed. Use the `agents_stop` tool to stop the agent as needed. Returns: Agent status object
Start agent Start or unpause the agent and run the source code (to which users may refer to as a module) as defined using the `src_*` tools. The purpose of the source code is to provide permanence and safe transferability for automations. If you wish to execute SDK methods on the fly (without saving them), call the `agents_execute` tool instead. Use the `agents_list` tool to fetch all available agents and their indexes. Call the `agents_status` tool from time to time or use the `agents_logs` tool to check execution progress. Use the `src_export` tool to review the complete module source code before executing it. Use the `agents_settings_set` tool to set the values for all inputs before running this tool. Use the `agents_results_get` tool to fetch the captured outputs after running this tool. Returns: `True` if the agent was started (it had previously been stopped or paused), `false` if it was already running.
Stop agent Stop the agent and return control back to the user or AI assistant. Use the `agents_list` tool to fetch all available agents and their indexes. Returns: `True` if the agent was stopped (it had been running or paused), `false` if it was already stopped.
Grab agent screenshot Capture a PNG screenshot of the current web page directly as a Base64-encoded string. No need to set up a file output for this agent. It works even if the agent is already executing another task. Use the `agents_list` tool to fetch all available agents and their indexes. Returns: PNG screenshot
Execute code in an agent Execute asynchronous JavaScript code in the agent and forward the returned value. Remember to use `return` as your last statement; for example: `return await $.navGetTitle();`. The code runs safely outside the browser, so it has no access to window, document, cookies, or other DOM APIs. It can only use plain JavaScript and the dollar sign ($) object to perform the kinds of actions a regular user can perform - navigate, click, scroll, read text, save files, and so on. **Before running this tool, you must first make sure the agent has been stopped using the `agents_status` and `agents_stop` tools**. **Never run this tool without first using the `app_docs` tool twice**: once to list all SDK methods, and again to query the specific methods you intend to use, including their detailed arguments and examples. **You must never wrap your code in an async IIFE** because all code blocks in Uindow (both functions and finite-state machine states) are asynchronous. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `app_docs` tool to query the available dollar sign ($) methods and properties for use in the `code` argument of this tool. Returns: Any value returned by the executed code.
Get agent logs Calling this tool outputs the agent logs generated since the last tool call. The structured content is an object representing the current agent status: either `stopped`, `paused`, or `running`. It only makes sense to call this tool again to fetch new logs if the agent is still running. Logs are output as lines of text with the following structure: `[info/success/warning/error] {text} ({date and time})`. Example: `[info] state: Testing $.sleep (12/12/2020, 10:10:00 PM)` Use the `agents_status` tool to get only the agent status object (without the latest logs). Use the `agents_list` tool to fetch all available agents and their indexes. Use the `agents_start` tool to start or unpause the agent as needed. Use the `agents_stop` tool to stop the agent as needed. Returns: Agent status object
Get settings Fetch the settings that will be used by the `$.ioInput*()` SDK methods when starting this agent with `agent_start`. The inputs declared using `src_input_*` tools are rendered as form elements in the Settings tab. Use this tool to get all input keys and their current values as configured by the user. At most 5000 rows will be returned for *table* inputs. Use the `agents_list` tool to fetch all available agents and their indexes. Returns: List of inputs and their values
Update settings Set the value of an input declared with the `src_input_set_*` tools. The value type is resolved from the input's own definition, so pass the natural value for that input: - boolean -> `true` or `false` - int -> `42`, or `[1, 2, 3]` if *isList* is `true` - string -> `"foo"`, or `["foo", "bar"]` if *isList* is `true` - files -> array of **absolute file paths** - table -> array of row objects keyed by the input's *columns* Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcInputs* to get all input keys. Use the `src_input_get` tool to inspect an input's declared type. Returns: Extended list of inputs and their values
Get results Fetch the results that will be saved by the `$.ioInput*()` and `$.ioSave*()` SDK methods when the agent is started with `agent_start`. Outputs declared using `src_output_*` tools are rendered as form elements in the Results tab. Use the `agents_list` tool to fetch all available agents and their indexes. Returns: List of outputs and their values
Module: get sample (yaml) Get a fully functional Uindow module in YAML format. The module is always an object with these keys: *srcStateMachine*, *srcFunctions*, *srcInputs*, and *srcOutputs*. The sample illustrates the interactions between finite-state machine (FSM) states, functions, inputs, and outputs. It also shows how the *$.args* property can be used when passing arguments to FSM states and functions. Use the `app_docs` tool to look up any dollar sign ($) methods used in the returned code. Use the other `src_*` tools to author your own automation, which users may refer to as a module. Returns: Sample source code in YAML format
Module: get source (yaml) Export the agent's source as a YAML string. The source is always an object with these keys: *srcStateMachine*, *srcFunctions*, *srcInputs*, and *srcOutputs*. To edit these properties, you must use the appropriate tool: - *srcStateMachine* and *srcFunctions*: use the `src_code_*` tools - *srcInputs*: use the `src_input_*` tools - *srcOutputs*: use the `src_output_*` tools Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_sample` tool to better understand how the FSM, states and IO interact. If the user asks to save this automation/module as a file, please use the ".js.yaml" extension. Returns: Agent source code in YAML format
Module: get state or function code Fetch the source code for this finite-state machine (FSM) state, or function. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcStateMachine* to get all state keys. Use the `src_keys_list` tool with section *srcFunctions* to get all function keys. Use the `app_docs` tool to look up any dollar sign ($) methods used in the returned code. Returns: Source code object
Module: set state or function code Set the source code for a finite-state machine (FSM) state (*srcStateMachine*) or a function (*srcFunctions*). **You must never wrap your code in an async IIFE** because all code blocks in Uindow (both functions and finite-state machine states) are asynchronous. For *srcStateMachine*: When using the `agents_start` tool, the first defined state is executed. Jump to another state by returning an object with the `next` and `args` keys. Example: `return { next: "another-state-key", args: ["foo", "bar"] }` The new state can access the passed arguments through the `$.args` property. The FSM stops when the last executed state no longer returns an object with a *next* property. A maximum of 64 states can be defined. For *srcFunctions*: Call a function from a state or another function using the *$.fn* SDK method. To learn more about *$.fn*, use the `app_docs` tool with "$.fn" as *query*. Pass arguments as an array; for example: `await $.fn("function-key", ["foo", "bar"])`. The function reads them through the `$.args` property, which is always an array. Unlike FSM states, a function's return value has no special role and does not trigger any state transition. A maximum of 128 functions can be defined. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with the same *section* to get all existing keys. Use the `app_docs` tool to view available SDK methods for the *code* argument. Use the `src_sample` tool to better understand how the FSM, states and IO interact. Returns: Updated state or function
Module: list item keys Get a list of all keys defined in a module section. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_export` tool to review the complete module source code. Returns: List of keys in this section
Module: reorder item keys Reorder the items in a module *section*. - For *srcStateMachine*: order matters - the first state is executed when the agent starts. - For *srcFunctions*: the item order does not matter; reorder for ease of debugging. - For *srcInputs*: each input item generates a UI element in the agent Settings tab; reorder for improved UX. - For *srcOutputs*: each output item generates a UI element in the agent Results tab; reorder for improved UX. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with the corresponding section to list all available items. Use the `src_export` tool to review the complete module source code. Returns: Updated list of keys in this section
Module: update item key Change this item's key to make the source code easier to understand. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with the corresponding section to list all available items. Use the `src_export` tool to review the complete module source code. Returns: Updated key
Module: delete item Delete this item, but first make sure it is no longer used by reading the full source code exported with the `src_export` tool. - For the *srcStateMachine* section, no state should still call `return { next: "this-state" }` - For the *srcFunctions* section, no state or function should still call `$.fn("this-function-key")` - For the *srcInputs* section, no state or function should still use `$.ioInput*("this-input-key")` - For the *srcOutputs* section, no state or function should still use `$.ioOutput*("this-output-key")` Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with the corresponding section to list all available items. Returns: Returns `true` if the item was found and removed, `false` otherwise
Module: get input Fetch the definition for this input. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcInputs* to get all input keys. Returns: Input definition
Module: set boolean input Define a boolean input that users can configure in the *Settings* tab. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcInputs* to get all input keys. Use the `src_sample` tool to better understand how the FSM, states and IO interact. Use the `agents_settings_set` tool to set the value for this and other inputs before using the `agents_start` tool. A maximum of 128 inputs can be defined. Returns: Input definition
Module: set integer input Define an integer input that users can configure in the *Settings* tab. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcInputs* to get all input keys. Use the `src_sample` tool to better understand how the FSM, states and IO interact. Use the `agents_settings_set` tool to set the value for this and other inputs before using the `agents_start` tool. A maximum of 128 inputs can be defined. Returns: Input definition
Module: set string input Define a string input that users can configure in the *Settings* tab. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcInputs* to get all input keys. Use the `src_sample` tool to better understand how the FSM, states and IO interact. Use the `agents_settings_set` tool to set the value for this and other inputs before using the `agents_start` tool. A maximum of 128 inputs can be defined. Returns: Input definition
Module: set files input Define a files input that users can configure in the *Settings* tab. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcInputs* to get all input keys. Use the `src_sample` tool to better understand how the FSM, states and IO interact. Use the `agents_settings_set` tool to set the value for this and other inputs before using the `agents_start` tool. A maximum of 128 inputs can be defined. Returns: Input definition
Module: set table input Define a table input that users can configure in the *Settings* tab. You can use a maximum of 6 input tables. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcInputs* to get all input keys. Use the `src_sample` tool to better understand how the FSM, states and IO interact. Use the `agents_settings_set` tool to set the value for this and other inputs before using the `agents_start` tool. A maximum of 128 inputs can be defined. Returns: Input definition
Module: get output Fetch the definition for this output. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcOutputs* to get all output keys. Returns: Output definition
Module: set boolean output Define a boolean output that users see in the *Results* tab. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcOutputs* to get all output keys. Use the `src_sample` tool to better understand how the FSM, states and IO interact. A maximum of 128 outputs can be defined. Returns: Output definition
Module: set integer output Define an integer output that users see in the *Results* tab. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcOutputs* to get all output keys. Use the `src_sample` tool to better understand how the FSM, states and IO interact. A maximum of 128 outputs can be defined. Returns: Output definition
Module: set string output Define a string output that users see in the *Results* tab. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcOutputs* to get all output keys. Use the `src_sample` tool to better understand how the FSM, states and IO interact. A maximum of 128 outputs can be defined. Returns: Output definition
Module: set files output Define a files output that users see in the *Results* tab. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcOutputs* to get all output keys. Use the `src_sample` tool to better understand how the FSM, states and IO interact. A maximum of 128 outputs can be defined. Returns: Output definition
Module: set table output Define a table output that users see in the *Results* tab. You can use a maximum of 6 output tables. Use the `agents_list` tool to fetch all available agents and their indexes. Use the `src_keys_list` tool with section *srcOutputs* to get all output keys. Use the `src_sample` tool to better understand how the FSM, states and IO interact. A maximum of 128 outputs can be defined. Returns: Output definition
Overview
What is Uindow?
Uindow drives a real, signed Chromium/Electron browser with genuine OS-level input—actual cursor movement, real keystrokes, and native file dialogs—running entirely on your own machine and network. It provides an MCP server so AI agents can create and control web-automation agents that are immune to prompt injections.
How to use Uindow?
Launch the MCP server with npx -y @uindow/cli mcp and configure your MCP‑compatible client (Claude Desktop, Cursor, VS Code, etc.) to use that stdio command. Alternatively, use the integrated no‑code recorder or write automations in pure JavaScript inside the built‑in IDE.
Key features of Uindow
- Real Chromium browser with genuine OS‑level input
- Immune to prompt injections
- MCP server for AI agent control
- No‑code recorder for automation without programming
- Full CLI for managing agents and app lifecycle
- Runs completely locally on your machine
Use cases of Uindow
- Control browser automation from Claude or Cursor via MCP
- Record and replay web workflows without coding
- Automate CI/CD browser testing pipelines
- Write custom browser scripts using the integrated IDE
FAQ from Uindow
What makes Uindow immune to prompt injections?
It uses genuine OS‑level input (actual cursor movement, real keystrokes) rather than synthetic page events, so injected JavaScript in web pages cannot affect the automation.
How do I run the MCP server?
Run npx -y @uindow/cli mcp in your terminal. Then configure your MCP client (Claude Desktop, Cursor, VS Code, etc.) with the same command as shown in the README.
What are the system requirements?
Uindow runs on your own machine. The npx command fetches the signed Electron binary if not present, or you can use prebuilt binaries for macOS, Windows, and Linux from the Releases page. A free Uindow account
Frequently asked questions
What makes Uindow immune to prompt injections?
It uses genuine OS‑level input (actual cursor movement, real keystrokes) rather than synthetic page events, so injected JavaScript in web pages cannot affect the automation.
How do I run the MCP server?
Run `npx -y @uindow/cli mcp` in your terminal. Then configure your MCP client (Claude Desktop, Cursor, VS Code, etc.) with the same command as shown in the README.
What are the system requirements?
Uindow runs on your own machine. The `npx` command fetches the signed Electron binary if not present, or you can use prebuilt binaries for macOS, Windows, and Linux from the Releases page. A free Uindow account
Basic information
More Browser Automation MCP servers
mcp-browser-use: MCP server for browser-use
vinayak-mehtaMCP server for browser-use
Browser Control MCP
eyalzhMCP server paired with a browser extension that enables AI agents to control the user's browser.

HTML/CSS to Image
An MCP server for generating images from HTML & CSS or screenshots of URLs using htmlcsstoimage.com.
Fastcrw
usFast, lightweight Firecrawl/Tavily alternative in Rust. Web scraper, crawler & search API with MCP server for AI agents. Drop-in Firecrawl-compatible API (/scrape, /crawl, /search). 2.3x faster than Tavily, 1.5x faster than Firecrawl in 1K-URL benchmarks. 6 MB RAM, single binary.
Screenshot Scout
screenshotscoutCapture screenshots of webpages as images or PDFs with Screenshot Scout.
Comments