MCP.so
Sign In

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

37

Query 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

Comments

More Browser Automation MCP servers