Macbeth
Open-source computer use for macOS agents.
Connector by wende · GitHub account verified by the MCP Registry
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/wende-macbeth
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.
- Tools
- 13 read · 8 write · 1 delete · 4 not yet classified
- Secrets
- None asked for
- Install scripts
- Not scanned yet
- Runs as
- Node.js package
Tools by what they do 26
Read from the source code; the running server may list different tools.
Read 13 · Look things up without changing anything.
dump_attributesextract_textget_elementlist_appslist_daemon_methodslist_menu_barlist_shortcutslist_skillslist_windowsload_skillquery_treeread_form
Show 1 more tools
screenshot
Write 8 · Create, change, send or run things.
clickfillpin_handlepress_keypress_keysrun_applescriptrun_shortcutselect_menu_item
Delete 1 · Delete, drop, revoke or wipe things.
run_skill_script
Not yet classified 4 · We could not tell from the name and description.
begin_activityconnect_append_activitywait_for
Files it touches
- Any path the agent passes to its tools
Tools (26)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
begin_activityTurn on the on-screen interaction indicator before you control the computer through some OTHER tool (a different MCP server, computer-use, a shell script) that Macbeth cannot see. Macbeth's own click/fill/press_key/run_applescript tools already show the indicator, so you do NOT need this for them. Returns a token; you MUST call end_activity with that token when the external work finishes (a crashed or disconnected client is cleaned up automatically after a timeout). Scopes nest safely: overlapping activities keep the indicator on until the last one ends.
clickClick a UI element. Auto-waits for the element to appear. On Electron/web content, the default 'auto' strategy tries AXPress (and adjacent nodes) then falls back to a synthetic mouse click; override with 'mouse' for canvas-heavy UIs or 'ax' to force a press. Mouse clicks briefly activate the target window, then restore the previous app, window, and cursor.
connect_appOPTIONAL preflight. Every app-taking tool (query_tree, click, fill, screenshot, ...) connects on its own, so you do NOT need to call this first. Call it to (a) check an app is reachable through Accessibility before driving it, (b) see exactly how a fuzzy name resolved, or (c) warm up an Electron app's accessibility tree with a custom readyTimeoutMs. It returns an app handle ("h_3") that you can pass as the `app` argument to any other tool to address the same process without re-resolving the name.
dump_attributesread-onlyDump all accessibility attributes for a previously resolved element handle.
end_activityEnd an interaction-indicator scope started by begin_activity. Pass the token that begin_activity returned. Safe to skip if the client disconnects; the daemon expires abandoned scopes on its own.
extract_textread-onlyExtract text from an app window using OCR (Vision framework). Bridges accessibility gaps in apps with poor AX support. Pass either an app name to capture + OCR, or base64 PNG data to OCR directly.
fillSet the text value of a field. Auto-waits for the element to appear. On Electron/web content, the default 'auto' strategy writes the AX value then synthesizes keystrokes (so frameworks like React see the input); override with 'keyboard' to force typing or 'ax' to force a direct value write.
get_elementFind a specific UI element and return its properties (role, title, value, enabled, focused).
list_appsread-onlyList running macOS apps, split into the ones that are currently reachable through the Accessibility API and the ones that are running but will fail to connect (launchers, helper processes, apps that never implement AX). Blocked entries carry the AX error code, what it means, and what to do instead.
list_daemon_methodsread-onlyList every JSON-RPC method registered by the daemon. Used to verify that daemon capabilities are exposed through MCP.
list_menu_barread-onlyReturn a menu-only Accessibility view. query_tree already includes menus, so use this only when that menu section was omitted, truncated, or a compact menu-only result is needed. Pass titlePattern to prune non-matching branches (case-insensitive regex); ancestors of matches are kept.
list_shortcutsread-onlyList all Apple Shortcuts available on this Mac.
list_skillsread-onlyList available macbeth skills. Each skill has instructions (SKILL.md) and optional runnable scripts. Call load_skill with no arguments for the core macbeth usage guide.
list_windowsread-onlyList open windows across macOS Spaces without touching an accessibility tree. Omit 'app' to list windows for every running app — that answers "is app X open, and what is it showing?" in one call; pass 'app' to scope the listing to one app and its helper processes. Each entry has windowId, title, ownerName/ownerPid/bundleId, frame, onScreen/active/minimized, AX role/subrole, kind, and whether it is capturable. windowId is a WindowServer ID, not an element handle: it has no TTL, ignores pin_handle, and stays valid until the window closes. Read-only — it does not activate windows or switch Spaces…
load_skillread-onlyLoad a skill's SKILL.md instructions (and list any runnable scripts). Omit `name` (or pass an empty string) to load the core macbeth skill — how to use the MCP tools themselves. Pass a directory name under skills/ for an app-specific skill (e.g. "Safari", "electron").
Show 11 more tools
pin_handleExtend a handle's idle TTL to 60 minutes (refreshed on each use). Pins are finite — abandoned handles age out on their own, so there is no unpin. Prefer `pin: true` on read_form/query_tree/get_element when you know at mint time; use this tool when you decide later, or when pinning a set of handles together via `handleIds`.
press_keyWARNING: This tool steals focus — it activates the target app window before sending input. Use as a last resort when click/fill cannot achieve the goal (e.g. keyboard shortcuts, arrow-key navigation). Prefer "fill" for text entry and "click" for buttons. Key names: "return", "tab", "escape", "a"-"z", "1"-"9", "f1"-"f12", "up", "down", "left", "right", "space", "delete". Modifiers: "cmd", "shift", "alt", "ctrl". The result reports how far the input got: outcome=dispatched means the events entered the system event stream (the app may still have ignored them); outcome=attempted means even that co…
press_keysWARNING: This tool steals focus — it activates the target app window before sending input. Use as a last resort when click/fill cannot achieve the goal. Prefer "fill" for text entry and "click" for buttons. Sends a sequence of keyboard inputs in one call. Each step accepts either `key` plus optional `modifiers`, or `text` to type literally, plus optional `delayMs`. Reports the same dispatch outcome as press_key, covering the sequence as a whole.
query_treeGet an app's accessibility tree, including its menu hierarchy. Use this first; it connects automatically, so a separate connect_app or list_menu_bar call is unnecessary. Element handles (h_N) are stable: the same element keeps the same handle across calls, so handles you already have stay valid and you can plan several actions from one tree instead of re-querying between them. A handle that stops working reports stale_handle (re-query for it) or unknown_handle (it was never issued). If Chromium web content is empty, the result explains available screenshot/OCR/menu/keyboard fallbacks. Start wi…
read_formread-onlyRead all form-like controls (text fields, sliders, checkboxes, popups, etc.) from a subtree. Returns each control's label, current value, type, editability, and handle. Use this to inspect panel contents without parsing the full tree. Pass `pin: true` to pin every returned field handle in one call — the cheap path for 'I'm about to fill this form'.
run_applescriptRun an AppleScript or JavaScript for Automation (JXA) script. Returns the script's output as text. The script goes in 'source' (not 'script' or 'code'), and 'language' is exactly "AppleScript" or "JavaScript" — JXA is "JavaScript", the string "jxa" is not accepted. Examples: {"source": "tell application \"Finder\" to get name of every window"} {"source": "Application('Finder').windows().map(w => w.name()).join(', ')", "language": "JavaScript"} Set 'timeout' for work that legitimately runs long (e.g. enumerating many apps); the default is 30 seconds. A script that overruns its timeout is st…
run_shortcutRun an Apple Shortcut by name. Shortcuts are system-level automations, not tied to any specific app.
run_skill_scriptRun a script from a skill's scripts/ directory. Scripts are .mjs files that automate specific workflows using macbeth.
screenshotCapture the default visible app window, or select a window returned by list_windows. Explicit selection does not activate the window or switch Spaces; some apps may provide blank content for off-Space windows.
select_menu_itemSelect a native menu bar item by path (e.g. ["Track", "New Audio Track"]). Uses the Accessibility API directly, accepts a fuzzy app name or PID, and does not steal focus.
wait_forWait for a UI condition. Conditions: 'exists' (default, wait for element to appear), 'value_equals' (wait for specific value), 'value_changes' (wait for any value change), 'enabled' (wait for element to become enabled).
Signals
- Stars
- 4
- Forks
- 0
- Open issues
- 1
- Last commit
- Sep 11, 2026 (1 month ago)
- Last release
- Aug 2, 2026 (2 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- Registry name
io.github.wende/macbeth- Version
- 0.2.4
- Auth
- No auth
- Packages
- npm macbeth
- License
- MIT
- Repository
- github.com/wende/macbeth
- Website
- wende.github.io/macbeth/
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
More from wende
- 0.619score
CICADA
wende
Code intelligence MCP server for 17+ programming languages.
ConnectorBFreshness: BLocal★ 40↓ 167/wkClaude Code +5 - 0.566score
macbeth
wende
How to drive macOS apps with Macbeth MCP tools — discovery, locators, actions, menus, screenshots/OCR, handles, and fallbacks
SkillBFreshness: B★ 4Claude Code +9 - 0.566score
electron
wende
Automate Electron apps (Slack, VS Code, Discord, etc.) whose UI is Chromium web content exposed through the Accessibility API
SkillBFreshness: B★ 4Claude Code +9 - 0.564score
contacts
wende
Search and create contacts via CNContact, with AppleScript/Shortcuts helpers
SkillBFreshness: B★ 4Claude Code +9 - 0.564score
maps
wende
AX-first automation for Apple Maps search and result interactions
SkillBFreshness: B★ 4Claude Code +9 - 0.564score
logicpro
wende
AX-first automation for Logic Pro — transport, tracks, tempo, mixer, and view controls
SkillBFreshness: B★ 4Claude Code +9
Cite this page
Macbeth MCP server. Agent Mart. https://agentmart.dev/connectors/wende-macbeth (last updated 2026-10-24)