{"name":"io.github.dominion525/familiar-mcp","slug":"dominion525-familiar-mcp","title":null,"description":"MCP server that drives the user's real macOS Chrome via AppleScript. 32 tools.","url":"https://mcp.market/server/dominion525-familiar-mcp","rating":null,"grade":"B","score":82,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":15,"stars":0,"forks":0,"downloads_week":18,"last_push_at":"2026-06-25T00:13:14.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/dominion525/familiar","website":"https://github.com/dominion525/familiar","version":"0.1.2","remotes":[],"packages":[{"registryType":"npm","identifier":"@dominion525/familiar-mcp","version":"0.1.2","transport":{"type":"stdio"}}],"tools":[{"name":"familiar_active_tab","description":"Return the active (front) tab of one window as \"<windowId>,<tabId>\". Use when you need the tab the user is looking at right now in a specific window — familiar_list_tabs returns every tab, familiar_active_tab narrows to one. Native.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_clear","description":"Empty an input / textarea. Equivalent to familiar_fill with \"\". Returns \"true\" or \"not_found\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_click","description":"Scroll an element into view (centered) and call .click() on it. Use for buttons, links, and most clickable UI. To toggle a checkbox/radio to a specific state use familiar_set_checked instead (familiar_click flips, familiar_set_checked sets). Returns \"true\" or \"not_found\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_close_tab","description":"Close the specified tab. Pair with familiar_new_tab / familiar_new_incognito_tab to clean up tabs opened by the task. No value returned.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_execute_js","description":"Run short inline JavaScript in the page and return the LAST evaluated expression as text (completion value, like the DevTools console). Multiple statements are fine; end with an expression — a top-level `return` does not work. Inline strings must survive AppleScript escaping, so for anything with quotes, newlines, or special characters, use familiar_execute_js_file instead.","write_action":true,"price_micros":0,"input_schema":null},{"name":"familiar_execute_js_file","description":"Read JavaScript from a UTF-8 file on the local filesystem (absolute path to an existing file) and run it in the page. Sidesteps AppleScript escaping entirely — prefer this for multi-line scripts, anything with quotes, or anything with special characters. Returns the completion value (multiple statements are fine; end with an expression).","write_action":true,"price_micros":0,"input_schema":null},{"name":"familiar_exists","description":"Check whether an element is present without reading anything from it. Returns structuredContent `{ exists: boolean }` — never absent. Use for quick yes/no checks. If you want to wait for it to appear, use familiar_wait_for_selector instead of polling familiar_exists.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_fill","description":"Set the value of an input / textarea via the native value setter, then dispatch input + change events. The native setter ensures modern UI frameworks detect the update. For <select> use familiar_select_option, for checkbox/radio use familiar_set_checked. Note: <input> strips LF per HTML spec — use <textarea> if you need to preserve newlines in the value. Returns \"true\" or \"not_found\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_get_attribute","description":"Read a named attribute (href, src, data-*, aria-*, etc.) of one element. Returns structuredContent `{ found, value }`: value is the attribute value (empty string if the attribute is missing on a matched element); found is false if no element matched. For visible text use familiar_get_text; for input current value use familiar_get_value.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_get_html","description":"Return the live DOM as document.documentElement.outerHTML. Use for whole-page extraction or when the structure matters; for a single element's text/attribute, familiar_get_text / familiar_get_attribute / familiar_query_all are much smaller. May return up to … MiB. Note: outerHTML does NOT include shadow trees — for shadow-DOM content use familiar_execute_js to traverse explicitly. For lazy-loaded ","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_get_tab_url","description":"Return the tab's current URL. Useful after familiar_navigate to confirm the final URL (after redirects), or to read the user's current URL before acting. Native.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_get_text","description":"Read one element's trimmed visible text (innerText, falling back to textContent). Returns structuredContent `{ found, value }`: value is the element's text when found is true; found is false if the selector matched nothing. The most common read action for headings, labels, status messages. For input values use familiar_get_value, for attributes use familiar_get_attribute, for multiple elements use","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_get_value","description":"Read the current value of an input / textarea / select. Returns structuredContent `{ found, value }`: value is the field value (empty string if the field has none, distinct from absence); found is false if no element matched. Reads what familiar_fill set, what the user typed, or what a framework bound to the field.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_go_back","description":"Navigate back in the tab's history. No-op if there is no back history. Follow with familiar_wait_for_load if the next step needs the previous page's DOM ready. No value returned. Native.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_go_forward","description":"Navigate forward in the tab's history. No-op if there is no forward history. Follow with familiar_wait_for_load if the next step needs the forward page's DOM ready. No value returned. Native.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_is_loading","description":"One-shot check of whether the tab is currently loading. Returns \"true\" or \"false\". Use this when you only need to peek at the loading state (e.g. skip a step if mid-navigation); to actually block until ready, use familiar_wait_for_load. Native (no JS required).","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_list_tabs","description":"Enumerate every open Chrome tab across every window. The starting point for tab-scoped actions: most other tools need a windowId/tabId pair, which comes from this output (or from familiar_new_tab / familiar_new_incognito_tab). Returns one line per tab: \"<windowId>,<tabId>,<title>,<url>\". Native — works even when \"Allow JavaScript from Apple Events\" is off.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_navigate","description":"Set the tab's URL. Returns once navigation has started; does NOT block until the page finishes loading. Standard pattern: familiar_navigate → familiar_wait_for_load (DOM ready), or familiar_navigate → familiar_wait_for_selector (a known element appears). No value returned.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_new_incognito_tab","description":"Like familiar_new_tab but targets an incognito window. Use when isolation from the user's normal browsing profile matters. State is shared across all incognito windows and discarded when the last incognito window closes. Returns \"<windowId>,<tabId>\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_new_tab","description":"Open a new tab in a normal (non-incognito) Chrome window and return its \"<windowId>,<tabId>\". Launches Chrome if needed. For an incognito context use familiar_new_incognito_tab. Follow with familiar_navigate to load a URL.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_press_key","description":"Focus the element and dispatch synthetic keydown / keypress / keyup events for the key. Use for keyboard interactions like Enter (submit a search box), Escape (close a modal), ArrowDown (move through a menu). This does NOT type text — use familiar_fill for that. Events are isTrusted=false, so strict bot-detection sites may ignore them. Returns \"true\" or \"not_found\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_query_all","description":"Collect the trimmed text of every matching element as a JSON array, e.g. [\"First\",\"Second\"]. Use for list / table-row / search-result extraction. Empty result is \"[]\". With CSS or xpath= selectors, returns every match; text= / label= yield at most one element. familiar_get_text returns only the first match.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_reload","description":"Reload the tab. Follow with familiar_wait_for_load when the next step depends on a freshly-loaded DOM. No value returned. Native.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_scroll_into_view","description":"Scroll the element into view (centered). familiar_click already scrolls before clicking, so this is mainly for: making the element visible to the user, triggering lazy-load that activates on viewport entry, or staging a visual screenshot. Returns \"true\" or \"not_found\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_select_option","description":"Pick an <option> in a <select>. Matches by `value` attribute first, then by visible text as a fallback. Fires input + change so framework bindings update. Returns structuredContent `{ ok: boolean, kind?: string }`: `{ok: true}` on success, `{ok: false, kind: \"no_option\"}` if the select was found but had no matching option, `{ok: false, kind: \"not_found\"}` if the select itself was not found.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_set_checked","description":"Set a checkbox or radio to true (checked) or false (unchecked) via the native setter, then fire input + change. Prefer over familiar_click when you need a known state regardless of current state. Returns \"true\" or \"not_found\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_stop","description":"Stop the tab's in-progress loading. No value returned. Native.","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_submit","description":"Submit the form the element belongs to (or the element itself if it is a <form>). Uses requestSubmit() so HTML5 validation and submit handlers run, falling back to submit() when unsupported. Often more reliable than familiar_click on the submit button. Returns structuredContent `{ ok: boolean, kind?: string }`: `{ok: true}` on success, `{ok: false, kind: \"no_form\"}` if the element was not in a for","write_action":true,"price_micros":0,"input_schema":null},{"name":"familiar_wait_for_function","description":"Block until an arbitrary JavaScript expression becomes truthy (polled up to maxSeconds). Use when the condition cannot be expressed as a selector — e.g. \"window.__appReady === true\" or \"document.querySelectorAll('.row').length >= 10\". If a CSS selector alone is the condition, prefer familiar_wait_for_selector (cheaper and less error-prone). Evaluated as Boolean(expr); a thrown error counts as fals","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_wait_for_load","description":"Block until document.readyState reaches \"complete\" (polled every 0.5s, up to maxSeconds). The standard follow-up to familiar_navigate / familiar_reload / familiar_go_back / familiar_go_forward when the next step needs a finished DOM. For a more specific signal (a particular element appearing), use familiar_wait_for_selector. Returns \"complete\" or \"timeout\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_wait_for_selector","description":"Block until a specific element appears (CSS selector polled up to maxSeconds). Use for SPA / lazy-loaded content where familiar_wait_for_load reports \"complete\" before the element exists. Takes a CSS selector ONLY (no text= / xpath= / label= prefixes — those are rejected at the schema layer). For non-CSS conditions, use familiar_wait_for_function. Returns \"found\" or \"timeout\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"familiar_window_mode","description":"Return \"normal\" or \"incognito\" for the given window. Useful before reading storage or cookies, since incognito windows have isolated state. Native.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":82,"grade":"B","scanned_at":"2026-09-26T16:35:44.061Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-26T16:35:44.070Z","components":{"code":{"score":25,"max":25,"notes":["5 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":8,"max":15,"notes":["last push 94 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@dominion525/familiar-mcp","version":"0.1.2","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-06-25T00:13:41.297Z","repositoryUrl":"git+https://github.com/dominion525/familiar.git","weeklyDownloads":18}],"repo":{"found":true,"owner":"dominion525","repo":"familiar","archived":false,"pushedAt":"2026-06-25T00:13:14Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/125058?v=4","ownerCreatedAt":"2009-09-09T20:05:13Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/125058?v=4&s=128","source":"github"},"presence":{"stars":0,"forks":0,"downloadsWeek":18,"license":"MIT","lastPushAt":"2026-06-25T00:13:14.000Z","score":15}}}},"grade_history":[],"reviews":[]}