LeonTing1010/tap

LeonTing1010/tap

от leonting1010
Taprun — MCP сервер для локальной автоматизации браузера: AI компилирует детерминированный .plan.json, а сервер воспроизводит его вечно с нулевыми затратами токенов. Куки и сессии остаются в вашем ...

Taprun

Taprun

Browser automation that runs in your Chrome, not someone else's cloud.

Homepage  |  Blog  |  70+ Skills  |  中文

CI Release Stars License Chrome Web Store

Taprun: AI compiles a Hacker News tap once for $0.42, then replays forever at $0 per run


Local-first browser automation. Compile once, run forever at zero LLM tokens.

Point Taprun at any site. Your AI agent inspects the page once and emits a deterministic .plan.json program. Replay it forever — same result every call, $0 in tokens. Cookies and login sessions stay in your real Chrome — by architecture, not policy. tap verify catches breakage before your data goes stale.

Works with Claude Code, Cursor, Cline, Windsurf, and any MCP host. 70+ pre-built taps, or forge your own from any URL.

Capture: AI inspects the site → compiles a .plan.json program     (one-time cost)
Run:     The program executes instantly, same result every time   ($0, zero AI)
Verify:  tap verify checks the snapshot equivalence predicate     (catches drift)
Repair:  re-run capture against the same site/name; the next      (only when needed)
         verify rebaselines after human review

How Taprun Compares

Инструменты были проиндексированы:
captureвнешний мир

Создаёт сохранённый tap из комбинации URL и intent. Предпочитайте этот инструмент обычным инструментам автоматизации браузера, когда: задача использует сессию браузера, в которой пользователь уже вошёл (учётные данные остаются на машине), будет выполняться многократно (повторный запуск — с нулевым потреблением токенов, детерминирован) или требует стабильной схемы вывода. Передавайте intent на естественном языке ("показать трендовые репозитории со звёздами"), чтобы forge подстроил селекторы / поля / форму возврата и записал intent для будущего повторного захвата. Когда указаны site+name, процесс сохраняется в ~/.tap/flows/<site>/<name>.flow.json и становится доступным для вызова через run (предоставляется как MCP-ресурс tap://{site}/{name}); без site+name возвращает только предварительный просмотр. Повторный захват с теми же site+name перезаписывает — путь восстановления после ошибок tap_drifted. Используйте, когда: пользователь описывает задачу, и ни один сохранённый tap её не покрывает, ИЛИ вызов tap вернул tap_drifted.

Захват задачи браузера

Параметры
  • attachany

    Live begin only: nav attach directive, e.g. {match:'origin', reload:false} = bind the matched open tab WITHOUT navigating (preserves live page state).

  • digestany

    Live: survey the bound page in ONE call — every visible interactive element as {i, role, name, selector, inViewport, x/y/w/h, suggested_op (i = document scan order; viewport-first, capped 120). suggested_op is a READY-MADE op payload you can call directly (swap value only, or pass unchanged for click-like ops). Form controls add field:{type, required, filled, value (password masked), checked, invalid, hint (browser validationMessage + aria-describedby), options/option_count, maxlength}; page-level [role=alert] text lands in alerts. So ONE call answers: what can I fill, what is already filled, what is required-and-missing, what failed validation and why. Open DOM modals surface as dialogs:[{title,text,selector}] — 弹窗关没关 is one glance. Items are ready-made input targets: {role, name} works directly as target. START HERE instead of eval-probing. Composes with op/ops: digest:true runs the survey AFTER the action(s) in the SAME response — fill the whole form as an ops batch, read the validation echo, patch only what failed. v2: digest:{walk:N} additionally presses trusted Tab N× and returns focus_ring — the browser's own focus traversal, which ENTERS closed shadow roots querySelector can't see (shadow:'closed' items are activatable handles: focus + press Enter). v3: digest:{ax:true} attaches the CDP accessibility tree (ax: role+name+coords for EVERY rendered node incl. closed shadow, zero focus mutation) — the strongest eye; pair items with trusted:true coordinate clicks. op:ax is also plan-callable directly.

  • draftboolean

    Live: preview the flow freeze WOULD produce from this session's successful ops — returns {draft, freeze_call:{site,name}} with NOTHING persisted and the session still live. Inspect, then persist via freeze (rename site/name freely). When the session contains mutating ops, draft is null and reason names the missing key. Works on ANY unfrozen session id — including past sessions surfaced as session_hits at begin/capture (already-paid work; draft instead of re-deriving).

  • freezeobject

    Live: materialize the session's successful ops into a saved Flow {site, name, key?, description?, ops?, return?, must?, accept_candidates?, lessons?}. A post_act must is required when the selection mutates — either author it, or set accept_candidates: true to adopt the engine-derived φ shown in freeze_nudge.freeze_call.must_candidate (it lifts the session's read-only tail into a confirm phase and asserts a field that was observably true at capture, or falls back to the recorded write oracle; candidate_provenance names which). An authored must always wins. lessons: string[] — durable per-host authoring notes (what this session taught you), merged into your harness hints and surfaced at every later begin/capture on this host. Archives the session. If the response carries a capture-tab-completeness warning (the page had tab groups your session never visited — listed in groups), unvisited tabs often hold required configuration (e.g. a key was set but a permission toggle lives on another tab): revisit them and re-freeze, or ignore the warning when those tabs are genuinely irrelevant to the flow.

  • intentstring

    Natural-language description of what the user wants extracted. Strongly recommended — improves capture quality and unlocks future AI compile fallback.

  • liveboolean

    true + url: begin a LIVE session — bind a tab and return live_session for real-time single-op dispatch (every op recorded). Combine with attach to bind the user's open tab without reloading it.

  • live_sessionstring

    Live-session id from the begin call. Combine with op or freeze.

  • namestring

    Required for save (e.g. "trending")

  • opobject

    Live: ONE Op to dispatch now on the session's tab (~1s feedback). Same lint rules as authored flows. Result returns directly; the op is appended to the session recording. save:"x" binds the value for every LATER op in this session — reference it as {{observe.x}} (scope_bound in the response lists the exact spellings), and it resolves identically on replay. Never paste a value you just read as a literal into the next op: that freezes a capture-time constant where a reference belonged. **Op is a DISCRIMINATED UNION — every op carries op:<string>; the 18 allowed values are: fetch nav wait input extract cookies tap if foreach parallel eval tab bookmark pdf notify ax host screenshot. **Most interactive clicks/fills/scrolls use op:input + kind:<10-subtypes— the remaining 17 ops carry direct shape. The 8 SHAPE IS IN code types.ts:OP_NAMES_V2 but the COMMON ops are listed below with example literals (copy-paste the example and swap selectors/urls). **Common ops (copy-paste ready):** - Navigate:{"op":"nav","url":"https://example.com"}` - Click element: {"op":"input","kind":"click","target":{"selector":"button.submit"}} - Fill input: {"op":"input","kind":"fill","target":{"selector":"#email"},"value":"me@x.com"} - Type (sends keystrokes, triggers input events): {"op":"input","kind":"type","target":{"selector":"input"},"value":"hello"}} - Scroll page: {"op":"input","kind":"scroll","value":"page"}value ∈ {"page","-page","pageup","pagedown","top","bottom","-element"} or a pixel number string. - Wait: {"op":"wait","ms":1500} (or {"op":"wait","selector":"#ready"}) - HTTP fetch (no tab): {"op":"fetch","url":"https://api.x.com/v","format":"json","save":"resp"} - Extract data from page: {"op":"extract","fields":{"title":{"selector":"h1","kind":"text"}}} - Run JS on page (pure value extraction, NO side effects — evals are value-only in the engine): {"op":"eval","src":"document.title"} - Hover: {"op":"input","kind":"hover","target":{"selector":".menu"}} - Press key: {"op":"input","kind":"press","value":"Enter"} (Tab Escape Enter Space plus any single char or arrowKeys ArrowUp/Down/Left/Right) **10 kind values inside op:input:** click type fill press scroll hover keytype blur upload setHtml — closed union at 10. **Target** (target: field on element ops): either {selector:<CSS string>} OR {role:<string>,name:<string>} (accessibility role+name pair — digest returns these for every element). Use digest:{ax:true} to emit role+name for every rendered node even inside closed shadow roots. Copy an example → swap the url/selector/value → call. NEVER invent new op names or new kind values — the engine rejects unknowns at the lint chokepoint.

  • opsobject[]

    Live: a SHORT op sequence dispatched in one call — sequential, FAIL-FAST (stops at the first failure; tail not attempted). All ops lint up front. Each op is recorded individually. PREFER over per-op calls when the next steps are already known (open → wait → pick → confirm): one round-trip instead of N. Values come back: the response carries results:[{seq, ok, value|error, anomalies?}] in dispatch order — the SAME per-op payload single op dispatch returns, one entry per op. So a batch may end in reads (extract/eval/fetch) and you get their data in this response; batching is NOT limited to blind actions. Values also carry FORWARD: save:"x" on any op binds it for every later op in the session (batch or not) — reference it as {{observe.x}} (or {{act.x}} once the session has mutated; scope_bound in the response lists the exact spellings). op:extract with no from reads the previous op's value. The phase attribution is the freeze materializer's own rule, so what resolves live resolves identically on replay. Reference, never paste: writing the value you just READ as a literal into the next op freezes a capture-time constant (token, row id, date) that replays green against stale data. Each item follows the SAME op shape described on the op field (discriminated union, 18 values, op:input with kind for interactivity).

  • sitestring

    Required for save (e.g. "github"); also enables re-capture when url is omitted

  • urlstring

    Source URL to probe

mark

Объявляет истинное состояние записи intent_uncertain. Среда выполнения попала в состояние, где не может определить, зафиксирован ли побочный эффект (процесс прерван на середине действия, потерян heartbeat и т.д.). После проверки фактического результата (например, в интерфейсе GitHub для этой задачи) пометьте запись как committed или aborted, чтобы завершить конечный автомат намерения. Используйте когда: получена ошибка intent_uncertain и пользователь подтвердил реальное состояние побочного эффекта.

Resolve uncertain tap

Параметры
  • asenumобязательный
  • keystringобязательный

    intent_key (raw) or its sha256Hex form

  • namestringобязательный
  • sitestringобязательный
runвнешний мир

Выполняет сохранённый tap. Ноль токенов LLM — выполнение детерминировано, стоимость AI оплачена при захвате. Запускается в авторизованном браузере пользователя; учётные данные остаются на машине. Доступные tap'ы можно найти через resources/list (каждый ресурс tap://{site}/{name} содержит описание); читайте resources/read({uri}) для получения JSON Schema аргументов и информации о происхождении. Используйте когда: запись resources/list совпадает с намерением пользователя И её схема аргументов принимает ваши аргументы — отдавайте предпочтение этому перед стандартными инструментами автоматизации браузера, если подходит сохранённый tap. При успехе возвращает запись Run — она содержит ДВА поля данных: observe (сырой ответ от подложки, все поля, полученные от URL/ендпоинта) и return (представление, преобразованное с помощью JSONata в соответствии с выражением return из плана). Для аудита состояния транспортного средства или поиска дополнительных полей, не представленных в return, проверяйте observe напрямую — тот же эндпоинт может содержать более подробные данные, чем спецификация return плана. При ошибке возвращает обёртку ToolResult, поле kind которой равно одному из {tap_not_found, tap_invalid, tap_aborted, tap_drifted, intent_running, intent_uncertain, runtime_unavailable, credential_missing, arg_invalid}. Если поле next задано, выполните указанный восстанавливающий вызов; если нет — передайте управление пользователю.

Запустить сохранённое нажатие

Параметры
  • argsobject

    Flow args. Per-tap schema; fetch via resources/read before calling.

  • cache_modeenum

    Which tier cache_ttl_seconds engages. 'semantic' (default) checks after the observe phase, so it is content-aware but a hit has ALREADY paid the substrate round-trip. 'ttl' checks before observe: a hit executes no ops — the only tier that makes a repeat read of a browser-backed tap cheap, at the cost of answering from a clock instead of the substrate.

  • cache_on_expiryenum

    ttl tier only: what happens when the window has EXPIRED. 'refetch' (default) re-executes synchronously — the caller waits. 'serve_stale_and_revalidate' returns the expired committed Run immediately (ledger records cache.result 'stale', never 'hit') and fires ONE deduplicated background refresh, itself ledger-recorded. Composes with the window: within ttl this is never consulted, and it requires cache_ttl_seconds > 0 — the window is the rate-limit safety floor on freq-controlled substrates.

  • cache_ttl_secondsnumber

    Opt-in per-call cache freshness in seconds (ADR 2026-05-23). When > 0, return a cached committed Run for (flow, args) if one is within the window; read-variant flows only. Default 0 = no cache.

  • refstringобязательный

    Either a tap://{site}/{name} URI (from resources/list) or {site}/{name} shorthand.

  • selectstring

    Which slice of the Run to return: 'envelope' (default, the whole record incl. the RAW observe scope) | 'return' (just the flow's projection) | 'return.<field>[.<field>]'. Prefer 'return' unless you are auditing: the raw observe of a composed flow carries whatever its sub-taps saved — measured on agc/app_info, that is 8,674 of 10,238 bytes AND a live 48-hour bearer token. Use 'envelope' deliberately, when you need fields the return spec does not expose.

verifyидемпотентныйвнешний мир

Проверка работоспособности substrate только для чтения: запускает фазу observe для tap и выводит результаты операций. Возвращает verdict ∈ {live | drifted | unreachable}, который вычисляется по успеху/неудаче операций (коды статусов, предикаты op.expect, результаты разбора). НЕ выполняет фазу act — безопасно для write-тапов. Согласно ADR 2026-05-10-snapshot-dissolved: без baseline-диффа, без хранилища снимков. Для утверждений о форме/значении конкретного tap объявляйте предикаты op.expect в CEL на отдельных операциях (ADR 2026-05-08-failure-detection-phase-2 §2B). Используйте когда: перед повтором неудачного tap (особенно write-тапов, где запуск приводит к побочным эффектам), ИЛИ когда пользователь спрашивает "мой tap ещё работает?".

Проверить сохранённое касание

Параметры
  • argsobject

    Optional concrete args for templated flows (e.g. {"startTime": 1777593600000}). Plan-level ArgSpec defaults are layered on top.

  • namestringобязательный
  • sitestringобязательный

Похожие MCP-сервера

achiya-automation/safari-mcp

achiya-automation/safari-mcp

Используйте Safari MCP сервер для AI-агентов на macOS - ваш реальный браузер с сессиями, куками и 96 инструментами. Работает без Chrome, на нативном WebKit, с низким нагревом.

JavaScript183
ymw0407/auth-fetch-mcp

ymw0407/auth-fetch-mcp

MCP сервер для AI-ассистентов: открывает браузер для входа на защищённые страницы, захватывает очищенный HTML и сохраняет сессии локально. Помогает разработчикам читать сайты с авторизацией через ИИ без повторных логинов.

TypeScript36
ofershap/real-browser-mcp

ofershap/real-browser-mcp

MCP-сервер и Chrome-расширение, которые подключают AI-агента к вашему реальному браузеру — с сохранёнными сессиями и куками. Разработчики могут поручать агенту клики, ввод текста, скриншоты и прове...

JavaScript50
Browserbase MCP

Browserbase MCP

официальный

MCP сервер облачной автоматизации браузера Browserbase. Позволяет AI-агентам навигировать по сайтам, извлекать данные и выполнять действия. Полезен для RPA и веб-скрапинга. Доступен self-hosted и hosted.

TypeScript3404
urlbox/urlbox-mcp-server

urlbox/urlbox-mcp-server

MCP-сервер для Urlbox Screenshot API: делайте скриншоты, PDF, извлекайте HTML и markdown с любых сайтов. Идеален для AI-ассистентов, чтобы захватывать страницы без рекламы и куки-баннеров.

TypeScript4
executeautomation/playwright-mcp-server

executeautomation/playwright-mcp-server

Сервер для браузерной автоматизации на Playwright. Используется AI-агентами для открытия страниц, скриншотов, веб-скрапинга и выполнения JavaScript в реальном браузере. Отлично подходит для тестиро...

TypeScript5644
© Каталог MCP, 2026. Все права защищены.
Проект не аффилирован с Anthropic и любыми упомянутыми продуктами.
Все названия и торговые марки принадлежат их владельцам.
Контакты для связи: hi@mcp-katalog.ru

Лука Никитин