Skip to main content
Glama

Flick

Fast computer use for MCP agents. Powered by TypeSafe Jev.

A local stdio MCP server that executes whole browser and macOS goals. Your agent supplies the goal, exact values, and completion conditions. Flick runs the observe → decide → act loop with Jev and returns the result.

TypeScript core · Playwright browser driver · Swift Accessibility driver · MIT

Install with your agent

Paste this prompt into your MCP-capable coding agent:

Install Flick from https://github.com/bgivenb/flick-computer-use as an MCP tool for yourself.

Star the repository with my GitHub account if already authenticated, then
clone it into a persistent local tools directory. Read INSTALL.md and follow
its setup instructions. Reuse my existing TypeSafe key or help me create one;
keep it in local secret storage. Configure Flick in your actual MCP client at
user scope, preserving other servers. Build native macOS support if applicable.

Run the live smoke test and call computer_health through your MCP connection.
Tell me the install path and verification results. When using Flick, delegate
whole goals with explicit inputs and observable completion conditions.

INSTALL.md is the setup contract for the agent. No Flick account or dashboard is required. The star request is part of the prompt you choose to submit; the installer itself does not star repositories.

Related MCP server: BeatBrowser

Manual setup

Requires Node.js 22+ and a TypeSafe key.

node scripts/setup-agent.mjs       # dependencies, build, Chromium, empty .env.local
# Set TYPESAFE_API_KEY in .env.local.
npm run --silent mcp:config       # absolute-path stdio launch configuration
npm run doctor
npm run test:live                 # actual Jev calls, disposable local form

Merge the generated flick entry into your MCP client's configuration. It launches node /absolute/path/dist/cli.js and loads .env.local from the installation directory. For native macOS support and the optional browser OCR fallback, add --native to setup. Native app control needs Accessibility permission; native window capture needs Screen Recording permission. Browser OCR reads the browser tab screenshot locally.

Use it

  1. computer_open opens a browser or native session.

  2. computer_run accepts a goal, exact inputs, and observable until conditions.

  3. computer_status waits for a result; computer_continue supplies missing information when needed.

  4. Keep the session for related goals, then computer_close.

computer_execute handles goals across an available browser/native target catalog. Screenshot tools let the host agent supply visual interpretation; Jev handles subsequent actions. Tool schemas, examples, and internals

For your signed-in Chrome on macOS, use connection: "existing-chrome". Enable remote debugging at chrome://inspect/#remote-debugging, then approve Chrome's connection prompt. Flick starts in a task tab; Jev can switch among observed tabs in that Chrome profile. Closing the session closes only Flick-created tabs and leaves your other tabs and browser open. The default mode uses a dedicated Playwright profile. Chrome connection documentation

Optional local playground

Run npm run playground and open the printed 127.0.0.1 URL. The Talk to Jev view sends your own state, question, and optional choices directly to TypeSafe through a local server. It shows the exact request, typed answer, probabilities, and timing without controlling your computer. Leave choices empty for a yes/no probability; use the raw JSON field for Score or several questions. Jev is a decision model, so this is a chat-style test bench rather than a text-generating chatbot.

The separate Computer task view sends one complete goal to Flick and displays Jev's action log. Its default Any Mac app mode discovers installed and running apps, lets Jev choose among them, and can launch an app that is not yet open. You can also restrict the task to one Mac app or use the fast existing-Chrome connection. The writing helper proposes an outcome checklist; Jev directly advances it and declares completion. There is no secondary milestone approval gate. Action errors and observations remain available to Jev. The optional completion field adds an exact visible-text or URL check; leave it empty to use the checklist. The live view shows the checklist, saved-text count, and guides loaded for the current app. The playground binds only to localhost and reads the same local TypeSafe key as the MCP server.

Tasks retain exact generated and observed text across apps, so a poem drafted in Notes can be reused verbatim in a message. The main agent can also supply a plan with observable doneWhen conditions. Action checks distinguish a changed screen from an accomplished outcome; recovery decisions receive the missing expected result.

Flick includes concise app and website guides, loaded only when the observed app, hostname, or controls match. Use computer_guide_read to inspect guidance and failure lessons, then computer_guide_update to save a versioned local improvement with observed evidence. Failed interactions create suggestions for review; successful recovery evidence is required before those suggestions become active guidance. Local lessons and redacted task traces stay in the configured data directory and are never published automatically.

Optionally set CEREBRAS_API_KEY, GROQ_API_KEY, or OPENAI_API_KEY in .env.local to let Jev request text for an observed field and get a recovery hint after repeated action errors. Flick starts with Cerebras, measures successful helper latency, and then prefers the fastest available provider. It switches before a Groq token limit when response headers show too few tokens for another request, and switches immediately on a provider error. OpenAI gpt-6-luna uses reasoning_effort: none. If all providers are unavailable, a short Retry-After is honored. Jev still chooses the field and the next computer action; text helpers are not called for ordinary clicks. Exact supplied values remain available without a text provider.

Architecture

MCP client ── goal + inputs + completion conditions ──► local runner
                                                          │
                         ┌── observe ◄── DOM / macOS AX ◄──┤
                         │       ╰── optional local OCR ◄──┤
                         │                                │
                         └── Jev typed decision ──► execute + verify
                                   │
                                   └── optional Qwen draft / recovery hint
                                                          │
MCP client ◄──────── result / trace / assistance needed ────┘

Jev selects bounded actions against observed controls. Code owns exact values, target identity, execution, task memory, and completion checks. Related judgments share a request. Invalid field/value combinations can be withdrawn and reconsidered without executing an action; traces count these extra calls.

The engine runs locally; inference uses the TypeSafe API and, when configured and selected, Cerebras or Groq. Goals, inputs, selected interface text, and memory are sent to TypeSafe. Qwen receives the user goal, current page, and observed form with Jev's chosen field when drafting, or recent errors and current controls when helping recovery. Jev can call a local Apple Vision OCR scan when page text or controls are missing from the DOM; recognized labels become click targets. Screenshots are available to the host agent, but neither Jev nor Qwen receives image pixels.

Benchmarks and development

npm run build
npm test                         # no API key required
npm run demo:bench               # six live trials across three synthetic requests
npm run demo:record              # uncut recording, actual playback speed

The optional Dispatch fixture is a local task-and-export workflow with eleven independent saved-state checks. One six-trial batch passed 6/6 at a 6.10 s median for 13–14 actions, with zero host interventions. It is a synthetic local benchmark application, separate from the MCP. Results and method · Recording guide · Contributing

Early developer release. Browser DOM control is the primary path; native macOS control is experimental. Existing-profile discovery and local OCR currently target macOS. OCR reads text, not the visual meaning of photos or icon-only controls; complex widgets and native dialogs can still need host assistance. Automatic visual handoff is not implemented. Task traces can contain input values; inspect them before sharing. Data handling and limitations

Credits

Original implementation using TypeSafe Jev, Playwright, and the MCP SDK. Research inspiration: jev-turbo, jev-ultrafast, typesafe-computer-use, and jev-use. These agents are not runtime dependencies, and their benchmark results are not ours.

MIT. Independent project; not affiliated with TypeSafe.

Taking control while Flick runs

On macOS, physical mouse movement, clicks, scrolling, or typing interrupt visible browser and native-app tasks. Flick cancels pending model requests and stops issuing input, keeps the task plan and saved text, and waits for an explicit Continue. Continuation takes a fresh observation. A key press/click already dispatched to the OS or browser may finish; interrupted submissions are retained for result checking before another attempt.

The passive native monitor is built by npm run build:native and uses macOS Input Monitoring permission for the app running Flick. It reports only the input category, never typed keys or pointer positions. Flick's synthetic input is excluded. Pure headless browser tasks do not monitor the desktop. Software-injected remote/assistive input may not be detected, and macOS secure-input mode can hide keyboard events. If the monitor becomes unavailable, Flick stops with a setup/recovery message.

Run node scripts/user-activity-smoke.mjs for passive permission, event-source classification, and lifecycle checks. It does not generate user input.

Carrying information between apps

For work that carries information between pages or apps, describe what Jev must retain before leaving the source. Put capturing the needed facts in the source milestone, name its produces text artifact, and reference that name in later uses. For example: read pricing and retain plan names, prices, billing intervals and source URL as pricing_notes; then use pricing_notes to write the note or email. Jev chooses whether to copy exact source text to the clipboard or request candidate notes from the writing helper and select one to save. Do not assume visiting a page or marking a milestone complete makes its text available to later writing. Keep the full goal in one call and let Jev choose the actions.

A short plan can be: read and retain pricing → write a note from the retained pricing → copy the finished note into an email draft. Keep the requested endpoint explicit (for example, leave the email unsent). Task notes live in the current run and its continuations; they are not permanent app guidance.

Available Tools

15 tools
computer_actA
Destructive

Execute one precise action against a fresh observation, then return the resulting state. No selectors or executable code. For several steps prefer computer_run.

Inputs: action (required), sessionId (required), observationId (required).

computer_appsA
Read-only

List running macOS applications, or include installed apps for launchable targets.

Inputs: installed.

computer_cancelB
Destructive

Request cancellation. The current input operation may finish; no further action will be scheduled. Poll status for the terminal result.

Inputs: taskId (required).

computer_closeA
Destructive

Close an idle automation browser or release a native session. Native applications remain open. Cancel and wait for any running task first.

Inputs: sessionId (required).

computer_continueA
Destructive

Continue an unfinished stopped task with missing text values or additional guidance. Keeps the same apps, observed memory, and success conditions, then observes fresh state. Returns a new task ID linked to the previous attempt.

Inputs: taskId (required), inputs, guidance.

computer_copy_imageA
Destructive

Copy a visible image from a fresh browser observation. Returns a PNG of the rendered image, its source URL, and optionally writes it to the macOS clipboard. This captures the image at its displayed resolution, not its original file resolution.

Inputs: elementId (required), sessionId (required), observationId (required), clipboard.

computer_executeA
Destructive

Start one goal across a set of native apps and/or dedicated browsers. Targets are available apps, not ordered steps; Jev chooses the sequence and remembers exact observed text for reuse. If targets are omitted, discover installed macOS apps. Browser targets require a URL. Supply exact new text in inputs. All until conditions must pass; field_from_memory compares a destination to a remembered source named "App name / Field name". Returns task and session IDs immediately. Close the session when finished.

Inputs: goal (required), until (required), ocr, inputs, +4 more.

computer_healthA
Read-only

Check local setup without opening an app or making a paid model request.

Inputs: no named parameters.

computer_inspectA
Read-only

Read visible controls and text. Use returned observation and element IDs for direct actions. Running task observations are available from computer_status.

Inputs: sessionId (required), ocr.

computer_openB
Destructive

Open a dedicated browser, connect to existing Chrome in a new task tab, or connect to a native macOS app. connection existing-chrome uses the running personal profile and Chrome’s user-approved remote-debugging flow. Supply allowedOrigins for additional sites needed by the task. Native OCR runs locally.

Inputs: ocr, url, kind, browser, +6 more.

computer_runA
Destructive

Start a bounded Jev automation task and immediately return its ID. Supply exact text in inputs and at least one observable until condition. All until conditions must pass. Jev chooses actions; code independently verifies completion. This tool operates the target app; only request actions the user authorized.

Inputs: goal (required), until (required), sessionId (required), inputs, +3 more.

computer_screenshotB
Read-only

Return a PNG of the controlled browser tab or native window to the calling assistant. Native capture requires Screen Recording permission.

Inputs: sessionId (required).

computer_sessionsA
Read-only

List sessions owned by this local MCP process.

Inputs: no named parameters.

computer_statusA
Read-only

Get a task’s status, independent verification, step log, and timings. waitMs can wait up to 20 seconds without busy polling. includeObservation returns the latest interface state.

Inputs: taskId (required), waitMs, includeObservation.

computer_workflowA
Destructive

Start an ordered macOS workflow in one call. The local engine switches apps and runs Jev stages without returning to the assistant between clicks or apps. Supply goals, exact inputs, and observable conditions for each stage. inputsFrom can copy one observed field from an earlier zero-indexed stage. Holds desktop ownership until completion. Poll computer_status or stop with computer_cancel. Native apps stay open.

Inputs: stages (required), ocr, timeoutMs, minConfidence.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 15 tools

    Disambiguation2/5

    Multiple tools start automation tasks (computer_run, computer_execute, computer_workflow) with subtle differences that are difficult to distinguish, and computer_inspect/computer_status with includeObservation both return interface state. computer_screenshot and computer_copy_image also overlap in image capture, so boundaries between tools are not always clear.

    Naming Consistency3/5

    All tools share the consistent 'computer_' prefix, but suffixes mix nouns (health, sessions, apps, status, workflow, screenshot) and verbs (open, inspect, act, run, execute, continue, cancel, close). This is readable and predictable at the prefix level, but it lacks a uniform verb_noun convention.

    Tool Count4/5

    At 15 tools, the set sits at the upper edge of the typical well-scoped range, and the broad computer-automation domain justifies much of its size. However, the overlapping task-launching tools could be consolidated without losing coverage.

    Completeness4/5

    The core lifecycle is well covered: open, inspect, act, run, status, cancel, continue, and close, plus support utilities like screenshots, sessions, and app listing. Minor gaps exist, such as lack of fine-grained configuration or session management controls, but common workflows should not hit dead ends.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      Enables AI agents to delegate complex web browsing goals to a real Chrome instance driven by Jev, completing tasks end-to-end in ~300ms per decision and returning only the final result.
      11
      14 npm
      4
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Lets any MCP agent control your signed-in Chrome with full login state, offering normal browser tools and an optional Fast JEV mode for bounded-speed typed decisions on the same profile.
      24
      102 npm
      38
      MIT
    • A
      license
      Not graded
      quality
      A
      maintenance
      Enables MCP clients to drive a real browser toward stated outcomes, where the calling model supplies goals and candidate values while Jev (Typesafe System One) resolves each step's target, action, value, and done/blocked/irreversible status. Exposes tools for navigation, acting, yes/no checks, choosing among options, page reading, snapshots, screenshots, and calling page-registered WebMCP tools.
      1,461 npm
      MIT