Public log

munim-computer-use

Computer Use MCP server for any coding agent — accessibility-first desktop control on macOS, Windows and Linux, background input, agent pointer, zoom, your signed-in Chrome. Downloads the signed native binary from GitHub Releases on first run.

npm · fingerprint 46b1b82743a3c0470e3a0233 · repository · RSS

32tools
4recorded versions
24dtracked
last checked 21 Oct

What changed

Changed between 14 October 2026 and 20 October 2026 (first seen 2026-10-20 11:29 UTC)

4 descriptions rewritten, 1 schema or annotation change with the description left byte-identical.

--- pinned/activate_app
+++ observed/activate_app
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Bring an app's windows to the foreground and give it keyboard focus. Call it before press_key or type_text when the target app is not frontmost; element-id actions such as click and set_value do not need it. Side effect: the window the user was working in loses focus.",
+   "description": "Bring an app's windows to the foreground and give it keyboard focus. type_text, press_key and element-id actions such as click and set_value do not need it; use it only when the app itself must be in front. Side effect: the window the user was working in loses focus.",
    "inputSchema": {
      "properties": {
        "app": {
+       },
+       "window_id": {
+         "description": "Windows only: bring this one window forward instead of the app's frontmost window, for an app with several windows such as Chrome. Use the window_id from a get_app_state window line; it must belong to app. The result names the window in front afterwards.",
+         "type": "integer"
        }
      },
      "required": [
--- pinned/get_app_state
+++ observed/get_app_state
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Maximum elements to emit before the outline is truncated (default 800). Prefer `query` over raising this.",
+         "description": "Maximum elements to emit before the outline is truncated (default 800). With `query`, the maximum matches to list instead: a query searches past this cap. Prefer `query` over raising this.",
          "type": "integer"
        },
        "ocr": {
-         "description": "Only list elements whose role, label or value contains this text (case-insensitive). Ids stay valid. Use it instead of raising max_elements when you know what you are looking for.",
+         "description": "Only list elements whose role, label or value contains this text (case-insensitive). Ids stay valid. It searches the whole outline, not just the first max_elements elements, and says when the read stopped early. Use it instead of raising max_elements when you know what you are looking for.",
          "type": "string"
        }
      },
--- pinned/list_apps
+++ observed/list_apps
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "List running applications with their bundle id, pid, window count, and which one is frontmost. Call it first to learn the exact `app` value that get_app_state, screenshot and activate_app accept. One app can have several running instances and only some own windows, so prefer the instance that has windows. Read-only: no window or input is touched.",
+   "description": "List running applications with their bundle id, pid, window count, and which one is frontmost. Call it first to learn the exact `app` value that get_app_state, screenshot and activate_app accept. One app can have several running instances and only some own windows, so prefer the instance that has windows. Instances that share a name each show their main window title, and a closing note lists their pids: pass the pid to choose one. Read-only: no window or input is touched.",
    "inputSchema": {
      "properties": {},
      "type": "object"
--- pinned/press_key
+++ observed/press_key
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Press one named key, optionally with modifiers held, e.g. key='s' modifiers=['cmd'] to save or key='return' to submit. Use it for shortcuts and navigation keys; use type_text for literal text and browser_press_key inside the agent's Chrome tabs. The key goes to the focused app, so call activate_app or click first when focus is uncertain. Shortcuts can close windows or delete content, so confirm the target before pressing.",
+   "description": "Press one named key, optionally with modifiers held, e.g. key='s' modifiers=['cmd'] to save or key='return' to submit. Use it for shortcuts and navigation keys; use type_text for literal text and browser_press_key inside the agent's Chrome tabs. The key goes to the app you are working in (the one you last clicked or focused); on macOS and Windows the user can keep typing elsewhere meanwhile, so call activate_app only when nothing has targeted the app yet. Shortcuts can close windows or delete content, so confirm the target before pressing.",
    "inputSchema": {
      "properties": {
        "key": {
--- pinned/type_text
+++ observed/type_text
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Type literal text as keystrokes into the field that currently has focus, optionally focusing element_id first. Use it for short entries and for fields that reject set_value; use set_value to replace a long value in one step, and press_key for shortcuts or keys such as return and tab. Text is inserted at the caret without clearing what is already there. Typing into password fields is refused by default (see COMPUTER_USE_ALLOW_SECURE_FIELD_INPUT).",
+   "description": "Type literal text as keystrokes into the field that currently has focus, optionally focusing element_id first. Use it for short entries and for fields that reject set_value; use set_value to replace a long value in one step, and press_key for shortcuts or keys such as return and tab. Text is inserted at the caret without clearing what is already there. It does not take over the user's keyboard: on macOS and Windows the text goes to the app you are working in, not the window the user is typing in, so do not call activate_app first. Typing into password fields is refused by default (see COMPUTER_USE_ALLOW_SECURE_FIELD_INPUT).",
    "inputSchema": {
      "properties": {
        "element_id": {

Changed 2026-10-11 12:43 UTC

1 description rewritten, 9 schema or annotation changes with the description left byte-identical.

--- pinned/click
+++ observed/click
  {
    "annotations": {
      "destructiveHint": true,
-         "description": "After acting, wait briefly for the UI to settle and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
+         "description": "After acting, wait for the app to finish reacting (up to 2 s) and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
          "type": "boolean"
        },
        "state_query": {
--- pinned/drag
+++ observed/drag
  {
    "annotations": {
      "destructiveHint": true,
-         "description": "After acting, wait briefly for the UI to settle and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
+         "description": "After acting, wait for the app to finish reacting (up to 2 s) and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
          "type": "boolean"
        },
        "state_query": {
--- pinned/get_app_state
+++ observed/get_app_state
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Read an app's accessibility tree as an indented outline in which interactive elements carry ids like [e12] that click, type_text, set_value, scroll, hover and select_text accept. Use it instead of screenshot whenever you intend to act: it is far cheaper in tokens and gives exact targets. Call it before interacting and again after the UI changes, because ids are per-snapshot and a stale id fails. Read-only; it describes the app's visible windows and does not change focus.",
+   "description": "Read an app's accessibility tree as an indented outline in which interactive elements carry ids like [e12] that click, type_text, set_value, scroll, hover and select_text accept. Use it instead of screenshot whenever you intend to act: it is far cheaper in tokens and gives exact targets. Call it before interacting and again after the UI changes, because ids are per-snapshot. Each id is rechecked before an action: one whose element is gone or has changed fails instead of acting on something else. The outline lists what is on screen: rows of long lists and content scrolled out of view are skipped (scroll, or pass offscreen), and while a dialog, sheet or popover blocks a window only its controls are listed. When an app exposes little to accessibility, its on-screen text is read with OCR and listed with ids too. Read-only; it does not change focus.",
    "inputSchema": {
      "properties": {
        "app": {
+       "ocr": {
+         "description": "Read on-screen text with OCR and list it with ids that click, hover, right_click and drag accept: auto (default) only when the app exposes no labelled controls to accessibility, always, or never. macOS and Windows; macOS needs Screen Recording permission.",
+         "enum": [
+           "auto",
+           "always",
+           "never"
+         ],
+         "type": "string"
+       },
+       "offscreen": {
+         "description": "Also list elements scrolled out of view, such as every row of a long list (default false). Prefer scrolling or `query`: this can make the outline far larger.",
+         "type": "boolean"
+       },
        "query": {
          "description": "Only list elements whose role, label or value contains this text (case-insensitive). Ids stay valid. Use it instead of raising max_elements when you know what you are looking for.",
          "type": "string"
--- pinned/hover
+++ observed/hover
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "After acting, wait briefly for the UI to settle and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
+         "description": "After acting, wait for the app to finish reacting (up to 2 s) and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
          "type": "boolean"
        },
        "state_query": {
--- pinned/press_key
+++ observed/press_key
  {
    "annotations": {
      "destructiveHint": true,
-         "description": "After acting, wait briefly for the UI to settle and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
+         "description": "After acting, wait for the app to finish reacting (up to 2 s) and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
          "type": "boolean"
        },
        "state_query": {
--- pinned/right_click
+++ observed/right_click
  {
    "annotations": {
      "destructiveHint": true,
-         "description": "After acting, wait briefly for the UI to settle and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
+         "description": "After acting, wait for the app to finish reacting (up to 2 s) and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
          "type": "boolean"
        },
        "state_query": {
--- pinned/scroll
+++ observed/scroll
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "After acting, wait briefly for the UI to settle and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
+         "description": "After acting, wait for the app to finish reacting (up to 2 s) and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
          "type": "boolean"
        },
        "state_query": {
--- pinned/select_text
+++ observed/select_text
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "After acting, wait briefly for the UI to settle and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
+         "description": "After acting, wait for the app to finish reacting (up to 2 s) and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
          "type": "boolean"
        },
        "start": {
--- pinned/set_value
+++ observed/set_value
  {
    "annotations": {
      "destructiveHint": true,
-         "description": "After acting, wait briefly for the UI to settle and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
+         "description": "After acting, wait for the app to finish reacting (up to 2 s) and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
          "type": "boolean"
        },
        "state_query": {
--- pinned/type_text
+++ observed/type_text
  {
    "annotations": {
      "destructiveHint": true,
-         "description": "After acting, wait briefly for the UI to settle and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
+         "description": "After acting, wait for the app to finish reacting (up to 2 s) and append a fresh get_app_state of the app you last read, so you can check the result and pick the next target in the same call. Its ids replace every earlier id.",
          "type": "boolean"
        },
        "state_query": {

Changed 2026-10-09 13:17 UTC

4 descriptions rewritten, 2 schema or annotation changes with the description left byte-identical.

--- pinned/browser_click
+++ observed/browser_click
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Click in one of the agent's tabs, either an element by its index from browser_snapshot (preferred) or a point given in page coordinates. Pass index or x and y, not both. Works on a background tab. Use click for native app windows. A click can submit forms or follow links, so snapshot first.",
+   "description": "Click in one of the agent's tabs, either an element by its index from browser_snapshot (preferred) or a point given in page coordinates. Pass index or x and y, not both. Works on a background tab. A tab the click opens (a target=_blank link or a popup) becomes one of the agent's tabs; find it with browser_list_tabs. Use click for native app windows. A click can submit forms or follow links, so snapshot first.",
    "inputSchema": {
      "properties": {
        "index": {
-         "description": "After acting, wait for the page to settle (and finish loading, if the action navigated) and append a fresh browser_snapshot of this tab, so you can pick the next index in the same call. Its indices replace earlier ones.",
+         "description": "Append a current snapshot and readiness status after acting. Without wait_for_selector, only a short pause and bounded navigation wait are used; SPA readiness is not guaranteed. Snapshot indices replace earlier ones. A timeout does not mean the action failed: re-observe with browser_snapshot before repeating it.",
          "type": "boolean"
        },
        "session_id": {
+       "wait_for_selector": {
+         "description": "Wait for any visible element matching this CSS selector in the top-level document (not frames or shadow roots). On actions requires return_state=true. Returns readiness met, timeout or error; only this condition is checked, not general app readiness. Prefer a selector specific to the expected new UI.",
+         "maxLength": 2000,
+         "minLength": 1,
+         "type": "string"
+       },
+       "wait_timeout_ms": {
+         "description": "Bound for wait_for_selector in milliseconds (default 8000, maximum 10000; 0 checks once). Requires wait_for_selector. Timeout preserves action success and returns current state. Use browser_snapshot with the same wait to re-observe without repeating an action.",
+         "maximum": 10000,
+         "minimum": 0,
+         "type": "integer"
+       },
        "x": {
          "description": "Page x coordinate in CSS pixels, used together with y when no index is given",
          "type": "number"
--- pinned/browser_close_all_tabs
+++ observed/browser_close_all_tabs
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Close every tab the agent opened and remove its tab group. Tabs taken over with browser_use_tab are released back to the user, not closed. Call this when finished with the browser so no empty group is left in the user's tab strip. The MCP process also runs this automatically when the Computer Use session ends. Unsaved state in the agent's tabs is lost.",
+   "description": "Close every tab the agent opened, including tabs its clicks opened, and remove its tab group. Tabs taken over with browser_use_tab are released back to the user, not closed. Call this when finished with the browser so no empty group is left in the user's tab strip. The MCP process also runs this automatically when the Computer Use session ends. Unsaved state in the agent's tabs is lost.",
    "inputSchema": {
      "properties": {
        "session_id": {
--- pinned/browser_navigate
+++ observed/browser_navigate
  {
    "annotations": {
      "destructiveHint": true,
-         "description": "After acting, wait for the page to settle (and finish loading, if the action navigated) and append a fresh browser_snapshot of this tab, so you can pick the next index in the same call. Its indices replace earlier ones.",
+         "description": "Append a current snapshot and readiness status after acting. Without wait_for_selector, only a short pause and bounded navigation wait are used; SPA readiness is not guaranteed. Snapshot indices replace earlier ones. A timeout does not mean the action failed: re-observe with browser_snapshot before repeating it.",
          "type": "boolean"
        },
        "session_id": {
+       },
+       "wait_for_selector": {
+         "description": "Wait for any visible element matching this CSS selector in the top-level document (not frames or shadow roots). On actions requires return_state=true. Returns readiness met, timeout or error; only this condition is checked, not general app readiness. Prefer a selector specific to the expected new UI.",
+         "maxLength": 2000,
+         "minLength": 1,
+         "type": "string"
+       },
+       "wait_timeout_ms": {
+         "description": "Bound for wait_for_selector in milliseconds (default 8000, maximum 10000; 0 checks once). Requires wait_for_selector. Timeout preserves action success and returns current state. Use browser_snapshot with the same wait to re-observe without repeating an action.",
+         "maximum": 10000,
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/browser_press_key
+++ observed/browser_press_key
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Press Enter, Tab, Escape or Backspace in one of the agent's tabs, for example Enter to submit a form after browser_type. Only these four keys are supported; use browser_type for characters. Enter can submit forms and Backspace deletes, so check the page state with browser_snapshot first.",
+   "description": "Press Enter, Tab, Escape or Backspace in one of the agent's tabs, for example Enter to submit a form after browser_type. Only these four keys are supported; use browser_type for characters. Tab moves focus to the next field and says which element has it; it fails rather than leave focus where it was. Enter can submit forms and Backspace deletes, so check the page state with browser_snapshot first.",
    "inputSchema": {
      "properties": {
        "key": {
-         "description": "After acting, wait for the page to settle (and finish loading, if the action navigated) and append a fresh browser_snapshot of this tab, so you can pick the next index in the same call. Its indices replace earlier ones.",
+         "description": "Append a current snapshot and readiness status after acting. Without wait_for_selector, only a short pause and bounded navigation wait are used; SPA readiness is not guaranteed. Snapshot indices replace earlier ones. A timeout does not mean the action failed: re-observe with browser_snapshot before repeating it.",
          "type": "boolean"
        },
        "session_id": {
+       },
+       "wait_for_selector": {
+         "description": "Wait for any visible element matching this CSS selector in the top-level document (not frames or shadow roots). On actions requires return_state=true. Returns readiness met, timeout or error; only this condition is checked, not general app readiness. Prefer a selector specific to the expected new UI.",
+         "maxLength": 2000,
+         "minLength": 1,
+         "type": "string"
+       },
+       "wait_timeout_ms": {
+         "description": "Bound for wait_for_selector in milliseconds (default 8000, maximum 10000; 0 checks once). Requires wait_for_selector. Timeout preserves action success and returns current state. Use browser_snapshot with the same wait to re-observe without repeating an action.",
+         "maximum": 10000,
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/browser_snapshot
+++ observed/browser_snapshot
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "List the interactive elements (links, buttons, inputs) on the page in one of the agent's tabs, with the index each one has for browser_click, plus the page title and URL. Inputs show their type, such as input[password]. Works on a background tab, so the user can be looking at something else. Use it before every browser_click, because indices change when the page changes; use browser_read for the page's text. Read-only.",
+   "description": "List the interactive elements (links, buttons, inputs) on the page in one of the agent's tabs, with the index each one has for browser_click, plus the page title and URL. Inputs show their type, such as input[password]. Works on a background tab, so the user can be looking at something else. Use it before every browser_click, because indices change when the page changes; use browser_read for the page's text. Read-only. Automatically scopes to the topmost visible dialog when one is open, excluding hidden/inert controls but retaining reachable offscreen controls. Results report scope, total and truncation. Continue with offset and limit on the same tab/session; indices stay global across pages of an unchanged UI. Snapshot again after UI changes.",
    "inputSchema": {
      "properties": {
+       "limit": {
+         "description": "Maximum controls returned per page (default 250, maximum 250).",
+         "maximum": 250,
+         "minimum": 1,
+         "type": "integer"
+       },
+       "offset": {
+         "description": "Control offset for pagination (default 0). Use the continuation offset from the previous result on an unchanged UI.",
+         "maximum": 2147483647,
+         "minimum": 0,
+         "type": "integer"
+       },
        "session_id": {
          "description": "Stable task or thread ID. Pass the same value on every browser call for this task. Different IDs isolate tabs and cleanup within one MCP process. Omit for the default process session.",
          "maxLength": 128,
+       },
+       "wait_for_selector": {
+         "description": "Wait for any visible element matching this CSS selector in the top-level document (not frames or shadow roots). On actions requires return_state=true. Returns readiness met, timeout or error; only this condition is checked, not general app readiness. Prefer a selector specific to the expected new UI.",
+         "maxLength": 2000,
+         "minLength": 1,
+         "type": "string"
+       },
+       "wait_timeout_ms": {
+         "description": "Bound for wait_for_selector in milliseconds (default 8000, maximum 10000; 0 checks once). Requires wait_for_selector. Timeout preserves action success and returns current state. Use browser_snapshot with the same wait to re-observe without repeating an action.",
+         "maximum": 10000,
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/browser_type
+++ observed/browser_type
  {
    "annotations": {
      "destructiveHint": true,
-         "description": "After acting, wait for the page to settle (and finish loading, if the action navigated) and append a fresh browser_snapshot of this tab, so you can pick the next index in the same call. Its indices replace earlier ones.",
+         "description": "Append a current snapshot and readiness status after acting. Without wait_for_selector, only a short pause and bounded navigation wait are used; SPA readiness is not guaranteed. Snapshot indices replace earlier ones. A timeout does not mean the action failed: re-observe with browser_snapshot before repeating it.",
          "type": "boolean"
        },
        "session_id": {
+       },
+       "wait_for_selector": {
+         "description": "Wait for any visible element matching this CSS selector in the top-level document (not frames or shadow roots). On actions requires return_state=true. Returns readiness met, timeout or error; only this condition is checked, not general app readiness. Prefer a selector specific to the expected new UI.",
+         "maxLength": 2000,
+         "minLength": 1,
+         "type": "string"
+       },
+       "wait_timeout_ms": {
+         "description": "Bound for wait_for_selector in milliseconds (default 8000, maximum 10000; 0 checks once). Requires wait_for_selector. Timeout preserves action success and returns current state. Use browser_snapshot with the same wait to re-observe without repeating an action.",
+         "maximum": 10000,
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [

Current tools

Show all 32 tool fingerprints
activate_app
586fb2806d997059
browser_click
710890306e1184a5
browser_close_all_tabs
0effd4a85646cdb0
browser_close_tab
7cc3bae04dfd81f1
browser_list_tabs
c507aecbab0dac3e
browser_navigate
f21c9ab5a23802fe
browser_open_tab
01c71056695df0b8
browser_press_key
4d61da6b05dbf4ec
browser_read
52a33f674ae7a6f5
browser_release_tab
b1423dac2a5e70b5
browser_request_credentials
3b50839f006d86c1
browser_select_tab
dc5cf96a8125833e
browser_snapshot
61a733c4d4c18270
browser_type
e395d176bbece9dd
browser_use_tab
85e2e3a257664b52
click
19f5ed2faef1e63a
clipboard_read
219351c1065f8de4
clipboard_write
899b75c0324abef7
drag
3052d94092899e75
get_app_state
a7bef9d2a3c27399
hover
dd1a71964d4bbf5b
list_apps
f780ccd4c526884b
list_displays
720efbb1735485ca
press_key
9dd717b8e2faa0c7
right_click
012d468360e960aa
screenshot
8847577810d80f14
scroll
c43f59e10252f002
select_text
0c8d935952311740
set_value
35f7dc7eb36c1910
type_text
2f029104740d3a74
wait
a6b724d827cf6888
zoom
1acc5b4fd6564e7a

Watch this server yourself

If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.

npx -y mcp-pin@0.2.3 -- <your munim-computer-use command>

Or subscribe to this page's RSS feed to be told when it changes.

Badge

mcp-pin status badge for munim-computer-use

The badge states one fact about time and nothing else. It never claims a server is safe.

[![mcp-pin](https://mcp-pin.gautamkhosla.com/badge/24b3386dc040cf08.svg)](https://mcp-pin.gautamkhosla.com/servers/24b3386dc040cf08.html)