{"name":"io.github.PrithviSeran/hunch","slug":"prithviseran-hunch","title":null,"description":"Focus-free macOS control for AI agents: drive your real Mac apps in the background, no stolen focus.","url":"https://mcp.market/server/prithviseran-hunch","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"productivity","tags":["productivity"],"presence":{"score":41,"stars":21,"forks":1,"downloads_week":477,"last_push_at":"2026-09-13T22:10:40.000Z","license":"Apache-2.0"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/PrithviSeran/hunch-mcp","website":null,"version":"0.6.6","remotes":[],"packages":[{"registryType":"pypi","identifier":"hunch-sdk","version":"0.6.6","transport":{"type":"stdio"}}],"tools":[{"name":"act","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_capabilities","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_recover","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_target","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"applescript","description":"Run AppleScript to control scriptable native apps FOCUS-FREE via Apple Events — the app's own command layer, not its UI/keyboard/focus. Unlocks Mail, Messages, Notes, Reminders, Calendar, Music, Finder, Safari, Keynote, etc. (e.g. 'tell application \"Music\" to play', or 'tell application \"Safari\" to get URL of current tab of front window'). Returns the script's output or the error.","write_action":true,"price_micros":0,"input_schema":null},{"name":"clipboard_get","description":"Read the clipboard's text — focus-free (no ⌘C needed).","write_action":false,"price_micros":0,"input_schema":null},{"name":"clipboard_set","description":"Put text on the clipboard — focus-free (move data around without ⌘C/⌘V keystrokes).","write_action":true,"price_micros":0,"input_schema":null},{"name":"file_op","description":"Focus-free filesystem operations by path: op='move' or 'copy' (src -> dst; dst may be a folder or a new path), or op='mkdir' (create a folder at src). For MULTIPLE operations pass batch=[{\"op\",\"src\",\"dst\"},...] and they all run in ONE call — sorting a folder is one call, not one per file. To delete, use `trash`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"find","description":"Search an app's WHOLE accessibility tree for matching elements — the cheap way to locate one control in a huge window without reading a full snapshot. Filters: `role` (e.g. \"button\", \"AXTextField\", \"row\" — case-insensitive, \"AX\" prefix optional) and/or `name_contains` (case-insensitive substring of the element's title/description/value). Returns one line per match: an ancestor breadcrumb, then the","write_action":false,"price_micros":0,"input_schema":null},{"name":"focus_app","description":"Bring an app to the front (reliable OS call), and target it for snapshots. ALWAYS pass `reason` — one short sentence for WHY you're switching the user's view (shown to them in the focus warning).","write_action":false,"price_micros":0,"input_schema":null},{"name":"launch_app","description":"Launch or focus an app, then target it (reliable OS call — use instead of clicking Dock icons). In simultaneous mode it launches in the BACKGROUND so it doesn't steal your view. Set force_accessibility=True for an Electron/Chromium app (Spotify, Discord, Slack, Notion, VS Code) whose tree reads empty — it relaunches the app so its accessibility tree becomes visible to snapshot. Pass `reason` — one","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_apps","description":"List the running GUI apps you can target with snapshot(app=...).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_credentials","description":"List the service NAMES the user has saved credentials for (e.g. \"google\", \"openai\"). Returns names + kind ONLY — never any values. Two kinds: username+password logins (use web_fill_login) and single protected values like API keys (use web_fill_secret).","write_action":false,"price_micros":0,"input_schema":null},{"name":"notify_user","description":"Alert the user when Hunch needs them SHORTLY — to finish a login, approve a 2FA / verification prompt, solve a captcha, or make a decision. Brings the Hunch window back up (or fires a desktop notification when running outside the app and the user enabled `notifications.user_attention`). Call this the moment you hit a step only the human can do, so they don't have to watch the screen.","write_action":false,"price_micros":0,"input_schema":null},{"name":"open_file","description":"Open a file/folder/URL with its default app (or a named app) — focus-free launch. Also opens web URLs and app deep-links (e.g. 'spotify:track:...', 'mailto:...').","write_action":false,"price_micros":0,"input_schema":null},{"name":"quit_app","description":"Quit an app via the OS — reliable regardless of focus (use instead of ⌘Q, which is unreliable on background apps).","write_action":false,"price_micros":0,"input_schema":null},{"name":"request_focus","description":"Ask the user's permission BEFORE a focus-stealing step you'll do via OTHER tools (e.g. focus_app / launch_app bringing an app to the front). Pops a one-click 'Go ahead / Cancel' dialog and returns their choice. You do NOT need this for `act`'s key / click_xy / ref-less type — act pops the same dialog automatically. If approved, do the action, then return focus to the user's previous app when done.","write_action":false,"price_micros":0,"input_schema":null},{"name":"reveal_in_finder","description":"Reveal/select item(s) in a Finder window by path. (This one does bring Finder forward — it's an explicit 'show me these files' action.)","write_action":false,"price_micros":0,"input_schema":null},{"name":"screenshot","description":"See the screen as a PNG image — for surfaces the tree genuinely can't show (canvas apps, an image, a photo/file-preview thumbnail). NOT for reading UI you could get from `snapshot`: if the tree looked thin, `click` into the pane and re-`snapshot` instead. A screenshot only shows the FRONTMOST app, so in the background it usually shows the user's OTHER app, not your target — and it can't be acted o","write_action":false,"price_micros":0,"input_schema":null},{"name":"simultaneous_mode","description":"Turn simultaneous mode on/off. When ON, Hunch never steals your cursor/keyboard or switches your view: it reads apps WITHOUT bringing them forward, launches apps in the background, runs only the focus-free actions (click/select/set-a-field by ref), and REFUSES shared-input actions (typed keystrokes, key combos, pixel clicks) that would disrupt you. Background AX coverage is operation- and state-de","write_action":false,"price_micros":0,"input_schema":null},{"name":"snapshot","description":"See the screen as an accessibility tree. Each element is one line tagged with a [ref] like [e12]; you act on elements by ref. Pass an app name to target that app's focused window, or leave blank for the frontmost app.","write_action":false,"price_micros":0,"input_schema":null},{"name":"trash","description":"Move file(s)/folder(s) to the Trash BY PATH — FOCUS-FREE and reversible. Use this to delete files instead of driving Finder + ⌘⌫ (which steals focus and is fragile). Accepts absolute or ~ paths. Files go to the Trash, so it's recoverable.","write_action":false,"price_micros":0,"input_schema":null},{"name":"web_act","description":"Execute focus-free page actions on the bound Safari or CDP app, then return the updated tree. Each: {\"action\":\"click\",\"ref\":\"e12\"} | {\"action\":\"type\",\"ref\":\"e12\",\"text\":\"hi\"} | {\"action\":\"click_xy\",\"x\":500,\"y\":250} | {\"action\":\"drag\",\"from_x\":10,\"from_y\":20, \"to_x\":200,\"to_y\":220} | {\"action\":\"key\",\"key\":\"return\"} | {\"action\":\"navigate\",\"url\":\"https://...\"}. `type` REPLACES a field's content (no m","write_action":true,"price_micros":0,"input_schema":null},{"name":"web_fill_login","description":"Fill the CURRENT CDP page's login form (username + password) using the user's SAVED credential for `service`, WITHOUT the values ever entering your context. You pass ONLY the service name; Hunch reads the secret from the macOS Keychain and types it straight into the page, returning only which fields were filled. Call web_open first and make sure the login form is visible. For two-step logins (e.g.","write_action":false,"price_micros":0,"input_schema":null},{"name":"web_fill_secret","description":"Type the user's SAVED protected value (API key / token) for `service` into a field on the CURRENT CDP page, WITHOUT the value ever entering your context. web_snapshot first and pass the target field's `ref`; Hunch reads the secret from the macOS Keychain and types it straight into that field, replacing its content — you only learn that it was filled. Omit `ref` to type at the currently-focused ele","write_action":false,"price_micros":0,"input_schema":null},{"name":"web_login","description":"Sign into the persistent Hunch CDP profile ONCE (there is no way to reuse the user's existing browser login over CDP — modern Chrome + site device-bound cookies prevent it). `app` is the BROWSER name (default \"Google Chrome\"); `url` is the site's login/home page (e.g. \"https://mail.google.com/\") — do not pass a website as `app`. Opens the browser in the BACKGROUND at that URL (it does NOT steal fo","write_action":false,"price_micros":0,"input_schema":null},{"name":"web_open","description":"Open Safari through the Hunch extension, or Chromium/Electron through CDP, for FOCUS-FREE background control — read, click, and type in the BACKGROUND without stealing your cursor/keyboard or switching your view. This is the way to drive these apps simultaneously with the user (AX can't). Then use web_snapshot / web_act.","write_action":false,"price_micros":0,"input_schema":null},{"name":"web_restart","description":"Recover a BROKEN CDP browser by quitting and reopening it fresh. Kills only the Hunch CDP instance (never the user's normal browser), relaunches on the SAME persistent profile (login kept), reloads `url` if given, and returns the fresh tree.","write_action":false,"price_micros":0,"input_schema":null},{"name":"web_screenshot","description":"PNG of the CDP-controlled page ITSELF (focus-free, via CDP) — for genuinely visual web content the tree can't convey (a chart, canvas, image, rendered PDF). Use THIS, never the OS `screenshot` tool, for anything in the background browser: the OS one grabs the physical screen and would capture the user's own foreground window instead of this page. Call web_open first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"web_snapshot","description":"Look at the bound Safari or CDP browser/Electron page as an accessibility tree ([ref] per element). Call web_open first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"web_switch_tab","description":"Switch the CDP session to a specific browser tab by index (see web_tabs), then web_snapshot to read it. Use when auto-follow landed on the wrong tab, or to return to an earlier one.","write_action":false,"price_micros":0,"input_schema":null},{"name":"web_tabs","description":"List the open browser tabs/windows in the bound Safari or CDP session — index, title, URL, and which is current (*). New tabs opened by a click or form are AUTO-FOLLOWED on the next web_snapshot; use web_switch_tab only to override that (go back to a prior tab, or pick a different one).","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-09-19T20:14:16.342Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T20:14:16.339Z","components":{"code":{"score":25,"max":25,"notes":["32 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 6 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"hunch-sdk","version":"0.6.6","found":true,"license":"Apache-2.0","dependencyCount":12,"publishedAt":"2026-09-11T14:11:25.370906Z","repositoryUrl":"https://github.com/PrithviSeran/hunch-mcp"}],"repo":{"found":true,"owner":"PrithviSeran","repo":"hunch-mcp","archived":false,"pushedAt":"2026-09-13T22:10:40Z","stars":21,"forks":1,"openIssues":1,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/109385760?v=4","ownerCreatedAt":"2022-07-15T19:14:09Z","license":"Apache-2.0"},"icon":{"url":"https://avatars.githubusercontent.com/u/109385760?v=4&s=128","source":"registry","width":128,"height":128},"presence":{"stars":21,"forks":1,"downloadsWeek":477,"license":"Apache-2.0","lastPushAt":"2026-09-13T22:10:40.000Z","score":41}}}},"grade_history":[],"reviews":[]}