macbeth (wende/macbeth) is an MCP server listed on the M8ven Trust Index. It scores 60 out of 100, grade C. It declares 38 tools. No publisher has claimed this listing.
Caution. Specific findings reduced this grade. They are listed on the page. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.
How we verified
Verified is a snapshot. Live keeps it current, and builds your track record.
⚡ Connect GitHub → continuous verification on every pushwhy connect →Who stands behind it
wende
Source: Glama · also listed on github_repo_search
Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →
Install from
The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.
These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.
list_appsList 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_methodsList every JSON-RPC method registered by the daemon. Used to verify that daemon capabilities are exposed through MCP.
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. R…
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.
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…
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. If Chromium web content is empty, the result explains available screenshot/OCR/menu/keyboard fallbacks.
list_windowsclickClick 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 …
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.
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).
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"…
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…
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.
extract_textExtract 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.
get_elementFind a specific UI element and return its properties (role, title, value, enabled, focused).
dump_attributesDump all accessibility attributes for a previously resolved element handle.
pin_handlePin an element handle to prevent it from expiring (default TTL is 5 minutes). Useful for long-running workflows where you need a stable reference to a panel or control.
unpin_handleUnpin a previously pinned handle, resuming normal TTL expiry.
read_formRead 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.
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.
list_menu_barReturn 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.
run_applescriptlist_shortcutsList all Apple Shortcuts available on this Mac.
run_shortcutRun an Apple Shortcut by name. Shortcuts are system-level automations, not tied to any specific app.
list_skillsList available macbeth skills. Each skill has instructions (SKILL.md) and optional runnable scripts.
load_skillLoad a skill by name. Returns the SKILL.md instructions and lists any runnable scripts.
run_skill_scriptRun a script from a skill's scripts/ directory. Scripts are .mjs files that automate specific workflows using macbeth.
GH_TOKENGITHUB_TOKENMACBETH_DAEMON_PATHMACBETH_UPDATE_REPOVITE_BASE_PATHTool annotations
10/38 tools have annotations
Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.
All four hints declared on every tool
38/38 tools missing one or more hints — list_apps (missing: destructiveHint, idempotentHint, openWorldHint); list_daemon_methods (missing: destructiveHint, idempotentHint, openWorldHint); begin_activity (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint), +35 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.
For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.
Tool annotations match behaviour
1 read-only tool performs write/delete/exec — list_shortcuts (line 581: spawnSync("shortcuts", ["list"], { encoding: "utf8", timeout: 10_000 }))
Either remove the readOnlyHint:true annotation, or remove the write/delete call from the tool handler.
Descriptions match behaviour
1 tool describes read intent but its handler mutates — list_shortcuts (line 581: spawnSync("shortcuts", ["list"], { encoding: "utf8", timeout: 10_000 }))
Rename the tool, rewrite the description, or move the side-effect into a separate clearly-named tool.
Tool inputs are validated
21/38 tool handlers declare input schemas (55%)
Declare an inputSchema with zod/joi/yup on every tool definition.
Tool handlers catch errors
Only 9/38 tool handlers wrap calls in try/catch (24%)
Wrap each tool handler body in try/catch and return a structured error response.
Tool test coverage
28/38 tools referenced in tests (74%)
Write tests that reference each tool by name so every tool has at least one test.
Tool description accuracy
list_shortcuts: description implies read-only but handler writes/deletes/executes
Update tool descriptions to accurately reflect all capabilities — especially write, delete, or execute operations.
Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.
[](https://m8ven.ai/mcp/wende/macbeth)?variant=verified from the URL.Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.
https://m8ven.ai/api/mcp/tool-check