Familiar MCP server
io.github.dominion525/familiar-mcp·v0.1.2MCP server that drives the user's real macOS Chrome via AppleScript. 32 tools.
0 stars18 downloads/wk
Reviews
Write oneNobody has reviewed Familiar yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Familiar tools (32, 3 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
familiar_active_tabReturn 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.
familiar_clearEmpty an input / textarea. Equivalent to familiar_fill with "". Returns "true" or "not_found".
familiar_clickScroll 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".
familiar_close_tabClose the specified tab. Pair with familiar_new_tab / familiar_new_incognito_tab to clean up tabs opened by the task. No value returned.
familiar_execute_jswrite actionRun 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.
familiar_execute_js_filewrite actionRead 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).
familiar_existsCheck 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.
familiar_fillSet 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".
familiar_get_attributeRead 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.
familiar_get_htmlReturn 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
familiar_get_tab_urlReturn 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.
familiar_get_textRead 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
familiar_get_valueRead 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.
familiar_go_backNavigate 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.
familiar_go_forwardNavigate 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.
familiar_is_loadingOne-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).
familiar_list_tabsEnumerate 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.
familiar_navigateSet 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.
familiar_new_incognito_tabLike 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>".
familiar_new_tabOpen 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.
familiar_press_keyFocus 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".
familiar_query_allCollect 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.
familiar_reloadReload the tab. Follow with familiar_wait_for_load when the next step depends on a freshly-loaded DOM. No value returned. Native.
familiar_scroll_into_viewScroll 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".
familiar_select_optionPick 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.
familiar_set_checkedSet 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".
familiar_stopStop the tab's in-progress loading. No value returned. Native.
familiar_submitwrite actionSubmit 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
familiar_wait_for_functionBlock 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
familiar_wait_for_loadBlock 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".
familiar_wait_for_selectorBlock 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".
familiar_window_modeReturn "normal" or "incognito" for the given window. Useful before reading storage or cookies, since incognito windows have isolated state. Native.
Public scan report
scanner v0.1.9 · 2026-09-26 · same rubric, same numbers if you re-run it
- Code scan5 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 94 days ago8/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
How Familiar compares
Against every graded MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 82/100
- higher than 63% of 48,255 servers
- Tools
- 32
- the typical server has 7
- Tools that change things
- 9%
- typical: 0%. Fewer write tools means less an agent can break
- Downloads a week
- 18
- more than 5% of 12,191 servers with a package
What its tools let an agent do: 29 read · 3 change
Install Familiar in Claude Code, Cursor or VS Code
Runs npx -y @dominion525/familiar-mcp on your machine. Read the scan report first; the gateway never runs local packages.
claude mcp add familiar-mcp -- npx -y @dominion525/familiar-mcp
What the publisher says
From the Familiar repository's README, as published. We do not edit it. Read it on GitHub
familiar
Control your real macOS Chrome via AppleScript — no DevTools Protocol, no Playwright.
A Claude Code skill that drives Google Chrome on macOS through AppleScript (Apple Events). It uses your everyday browser instead of a headless/automated one, so pages behind bot/WAF defenses tend to treat it as a normal user.
日本語版は README.ja.md を参照してください。
What it does
Everything is tab-scoped (windowId + tabId); it never relies on the "active tab".
- listtabs / newtab / newincognitotab / closetab — tab management (newtab uses a normal window, newincognitotab an incognito one)
- activetab / windowmode / is_loading — inspect active tab / window mode / tab loading state
- navigate / gettaburl — navigation
- reload / goback / goforward / stop — history & reload control
- waitforload / waitforselector / waitforfunction — wait for page load / element / a JS condition
- get_html — get the current DOM as HTML
- gettext / getattribute / getvalue / exists / queryall — read element text / attribute / value / presence / all matches
- click / fill / clear / selectoption / setchecked / presskey / submit / scrollinto_view — interact with elements and forms
- executejs / executejs_file — run arbitrary JavaScript (use the file form for complex scripts)
Selectors accept CSS (default), text=, xpath=, and label= forms.
Prerequisites
(View → Developer → Allow JavaScript from Apple Events)
- macOS with Google Chrome
- Enable Chrome's "Allow JavaScript from Apple Events"
- Approve the Automation permission prompt on first run
Install
Claude Code plugin
/plugin marketplace add dominion525/familiar
/plugin install familiar@familiarFor local development / testing:
/plugin marketplace add /path/to/familiar
/plugin install familiar@familiarVercel Skills (agent-skills)
npx skills add dominion525/familiarThis places the skill under ~/.agents/skills/familiar/. Any client that follows the agent-skills spec (Claude Code, Cursor, and others) picks it up automatically. The registry is at https://skills.sh.
MCP server
The mcp/ directory contains an MCP server implementation (TypeScript) that exposes the same 32 actions to any MCP-compatible client (Claude Code, Claude Desktop, Cursor, Codex CLI, and others).
Quick install (Claude Code):
claude mcp add familiar -- npx @dominion525/familiar-mcp@latestSee mcp/README.md for full per-client install and configuration.
Standalone (no install)
The script also runs standalone, without installing the skill:
osascript skills/familiar/familiar.applescript list_tabsSee skills/familiar/SKILL.md for full usage.
License
MIT
Nothing above is checked by us. What we check is on the safety report.
Familiar: common questions
- Is Familiar MCP server safe?
- Mostly: it is graded B (82/100). Read the Familiar safety report
- How do I install Familiar?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does Familiar need an API key?
- Not as far as the registry entry and our scan can tell: no credentials are declared or required.
- Is Familiar maintained?
- The last commit was 132 days ago (2026-06-25). The latest release is v0.1.2.
- How does Familiar compare with other MCP servers?
- safety score 82/100 (higher than 63% of 48,255 servers); tools 32 (the typical server has 7); tools that change things 9% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.