MCP.Market

Familiar MCP server

by dominion525·io.github.dominion525/familiar-mcp·v0.1.2

MCP server that drives the user's real macOS Chrome via AppleScript. 32 tools.

B82/100grade B
What users say
No reviews yet
Be the first
Safety scan
B82/100

full report

Adoption
New

0 stars18 downloads/wk

Reviews

Write one

Nobody 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 posts

Read from the package source without running it. The installed server may list more.

  • familiar_active_tab

    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.

  • familiar_clear

    Empty an input / textarea. Equivalent to familiar_fill with "". Returns "true" or "not_found".

  • familiar_click

    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".

  • familiar_close_tab

    Close 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 action

    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.

  • familiar_execute_js_filewrite action

    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).

  • familiar_exists

    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.

  • familiar_fill

    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".

  • familiar_get_attribute

    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.

  • familiar_get_html

    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

  • familiar_get_tab_url

    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.

  • familiar_get_text

    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

  • familiar_get_value

    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.

  • familiar_go_back

    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.

  • familiar_go_forward

    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.

  • familiar_is_loading

    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).

  • familiar_list_tabs

    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.

  • familiar_navigate

    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.

  • familiar_new_incognito_tab

    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>".

  • familiar_new_tab

    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.

  • familiar_press_key

    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".

  • familiar_query_all

    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.

  • familiar_reload

    Reload 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_view

    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".

  • familiar_select_option

    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.

  • familiar_set_checked

    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".

  • familiar_stop

    Stop the tab's in-progress loading. No value returned. Native.

  • familiar_submitwrite action

    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

  • familiar_wait_for_function

    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

  • familiar_wait_for_load

    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".

  • familiar_wait_for_selector

    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".

  • familiar_window_mode

    Return "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

no findings
  • 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
Overall 82/100. Components that don't apply are left out of the denominator. Any critical finding is an F.RubricAppeal a findingJSON

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
Add to Cursor

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@familiar

For local development / testing:

/plugin marketplace add /path/to/familiar
/plugin install familiar@familiar

Vercel Skills (agent-skills)

npx skills add dominion525/familiar

This 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@latest

See 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_tabs

See 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.