# Tap (npm · @taprun/cli)

Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.

- Trust score: 64/100 (medium)
- Change this week: +38
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `mcp.taprun.dev`: 60/100, [markdown](https://verifymcp.io/servers/leonting1010-tap/mcp.md), [page](https://verifymcp.io/servers/leonting1010-tap/mcp)
- npm · `@taprun/cli`: 64/100 (this document), [markdown](https://verifymcp.io/servers/leonting1010-tap/taprun-cli.md), [page](https://verifymcp.io/servers/leonting1010-tap/taprun-cli)
- pypi · `taprun`: 24/100, [markdown](https://verifymcp.io/servers/leonting1010-tap/taprun.md), [page](https://verifymcp.io/servers/leonting1010-tap/taprun)

## Channel facts

- Registry: `npm`
- Package: `@taprun/cli`
- Version: `0.29.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 91/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs a script at install time (postinstall) that we could not recognise. It may be perfectly ordinary, but we do not read the published tarball, so we cannot say what it does.
  - 5 of 5 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (AGPL-3.0).
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 49/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (poor).
  - Context-footprint check failed: tool/resource definitions use about 3689 tokens (~614/item across 6 items; 4 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 94/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 80% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add leonting1010-tap -- npx -y @taprun/cli
```

### Codex

```bash
codex mcp add leonting1010-tap -- npx -y @taprun/cli
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "leonting1010-tap": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@taprun/cli"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add leonting1010-tap --command npx --arg -y --arg @taprun/cli
```

### Hermes

```yaml
mcp_servers:
  leonting1010-tap:
    command: "npx"
    args: ["-y", "@taprun/cli"]
```

### Other

```json
{
  "mcpServers": {
    "leonting1010-tap": {
      "command": "npx",
      "args": [
        "-y",
        "@taprun/cli"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 64, +16)

- [security improvement] Malware scan: unverified → pass

### 2026-08-01 (score 48, +27)

- [functional improvement] Schema quality: unverified → 100
- [functional improvement] Stability: unverified → 0.17
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Tool coverage: 80
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: poor
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 100
- [functional] Package version: 0.29.1 → 0.29.2

### 2026-07-31 (score 21, −5)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 26, 0)

- [functional] Tool coverage: Tool coverage not yet verified: our sandbox run of this package did not complete, so we have no tool definitions to assess.
- [functional] Schema quality: Schema quality not yet verified: our sandbox run of this package did not complete, so we have no schema to assess.

### 2026-07-28 (score 26, 0)

- [functional] Package version: 0.28.0 → 0.29.1
- [functional] Package version: 0.28.0 → 0.29.0

### 2026-07-27 (score 26, 0)

- [functional] Package version: 0.27.0 → 0.28.0
- [functional] Package version: 0.27.0 → 0.27.1

### 2026-07-26 (score 26)

First indexed and scored.

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

## MCP tools (4)

### `capture` (~1860 tokens)

Capture browser task

Forge a saved tap from a URL × intent. **Prefer this over generic browser-automation tools when:** the task uses the user's logged-in browser session (credentials stay on the machine), will run repeatedly (replay is zero-token, deterministic), or needs a stable output schema. Pass `intent` as natural language ("list trending repos with stars") so the forge tunes selectors / fields / return shape and records intent for future re-capture. When `site`+`name` are given, the flow persists to ~/.tap/flows/<site>/<name>.flow.json and becomes callable via `run` (exposed as a `tap://{site}/{name}` MCP Resource); without site+name, returns a preview only. Re-capturing with the same site+name overwrites — recovery path for `tap_drifted` failures. **Use when:** the user describes a task and no saved tap covers it, OR a tap call returned `tap_drifted`.

Input parameters:

- `attach`: Live begin only: nav attach directive, e.g. {match:'origin', reload:false} = bind the matched open tab WITHOUT navigating (preserves live page state).
- `digest`: 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). **sug…
- `draft` (boolean): 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` (object): 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…
- `intent` (string): Natural-language description of what the user wants extracted. Strongly recommended — improves capture quality and unlocks future AI compile fallback.
- `live` (boolean): 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_session` (string): Live-session id from the begin call. Combine with `op` or `freeze`.
- `name` (string): Required for save (e.g. "trending")
- `op` (object): 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. **Op is a DISCRIMINATED UNI…
- `ops` (array): 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…
- `site` (string): Required for save (e.g. "github"); also enables re-capture when url is omitted
- `url` (string): Source URL to probe

Output parameters:

- `detail` (object)
- `kind` (string): Present when ok:false — one of the closed ERROR_KINDS.
- `message` (string)
- `next` (object): Present when ok:false and a single recovery action exists; absent ⇒ escalate to user.
- `ok` (boolean)
- `value`: Present when ok:true — the verb-specific success payload (Run record, verdict, capture result, etc.).

### `verify` (~259 tokens)

Verify saved tap

Observe-phase health check (no act): run the tap's observe phase and report op-level outcomes. Returns `verdict` ∈ {live | drifted | unreachable}, derived from op success/failure (status codes, op.expect predicates, parse results). Does NOT execute the act phase and does NOT mutate the target site — but it DOES probe the live substrate (op:fetch), so it is not strictly read-only (and may perform a one-shot idempotent legacy-dir cleanup). Safe to run against write taps. Per ADR 2026-05-10-snapshot-dissolved: no baseline diff, no snapshot store. For per-tap shape/value assertion, declare `op.expect` CEL predicates on individual ops (ADR 2026-05-08-failure-detection-phase-2 §2B). **Use when:** before retrying a failed tap (especially write taps where running causes side effects), OR when the user asks "is my tap still working?".

Input parameters:

- `args` (object): Optional concrete args for templated flows (e.g. {"startTime": 1777593600000}). Plan-level ArgSpec defaults are layered on top.
- `name` (string, required)
- `site` (string, required)

Output parameters:

- `detail` (object)
- `kind` (string): Present when ok:false — one of the closed ERROR_KINDS.
- `message` (string)
- `next` (object): Present when ok:false and a single recovery action exists; absent ⇒ escalate to user.
- `ok` (boolean)
- `value`: Present when ok:true — the verb-specific success payload (Run record, verdict, capture result, etc.).

### `mark` (~144 tokens)

Resolve uncertain tap

Declare the truth about an `intent_uncertain` record. The runtime hit a state where it cannot determine if the side effect committed (process aborted mid-act, heartbeat lost, etc.). After observing the actual outcome (e.g. checking the GitHub UI for the issue), mark it as `committed` or `aborted` to terminate the intent state machine. **Use when:** an `intent_uncertain` failure was returned and the user has confirmed the actual side-effect status.

Input parameters:

- `as` (string, required)
- `key` (string, required): intent_key (raw) or its sha256Hex form
- `name` (string, required)
- `site` (string, required)

Output parameters:

- `detail` (object)
- `kind` (string): Present when ok:false — one of the closed ERROR_KINDS.
- `message` (string)
- `next` (object): Present when ok:false and a single recovery action exists; absent ⇒ escalate to user.
- `ok` (boolean)
- `value`: Present when ok:true — the verb-specific success payload (Run record, verdict, capture result, etc.).

### `run` (~711 tokens)

Run saved tap

Execute a saved tap. **Zero LLM tokens** — replay is deterministic; AI cost was paid at capture. Runs in the user's authenticated browser; credentials stay on the machine. Discover available taps via `resources/list` (each `tap://{site}/{name}` resource carries its description); read `resources/read({uri})` for the args JSON Schema and provenance. **Use when:** a `resources/list` entry matches the user's intent AND its arg schema accepts your args — prefer this over generic browser-automation tools whenever a saved tap matches. Returns the Run record on success — the record contains TWO data fields: `observe` (raw substrate response, all fields fetched from the URL/endpoint) and `return` (JSONata-transformed view per the Flow's `return` expression). **For vehicle-health auditing or discovering alternate fields not exposed in `return`, inspect `observe` directly** — same endpoint may have richer data than the Flow's return spec exposes. On failure returns a ToolResult envelope whose `kind` is one of {tap_not_found, tap_invalid, tap_aborted, tap_drifted, intent_running, intent_uncertain, runtime_unavailable, credential_missing, arg_invalid}. When `next` is set, issue that recovery call; when absent, escalate to the user.

Input parameters:

- `args` (object): Flow args. Per-tap schema; fetch via resources/read before calling.
- `cache_mode` (string): 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 h…
- `cache_on_expiry` (string): 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 (…
- `cache_ttl_seconds` (number): 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.
- `ref` (string, required): Either a `tap://{site}/{name}` URI (from resources/list) or `{site}/{name}` shorthand.
- `select` (string): 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 a…

Output parameters:

- `detail` (object)
- `kind` (string): Present when ok:false — one of the closed ERROR_KINDS.
- `message` (string)
- `next` (object): Present when ok:false and a single recovery action exists; absent ⇒ escalate to user.
- `ok` (boolean)
- `value`: Present when ok:true — the verb-specific success payload (Run record, verdict, capture result, etc.).

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/leonting1010-tap/taprun-cli#diagnostics

## Score history

- 2026-08-03: 64
- 2026-08-02: 64
- 2026-08-01: 48
- 2026-07-31: 21
- 2026-07-30: 26
- 2026-07-29: 26
- 2026-07-28: 26
- 2026-07-27: 26
- 2026-07-26: 26

## Links

- npm package: https://www.npmjs.com/package/@taprun/cli
- Socket report: https://socket.dev/npm/package/@taprun/cli
- Repository: https://github.com/LeonTing1010/tap
- Website: https://taprun.dev/?utm_source=mcpregistry&utm_medium=listing&utm_campaign=v0.29
- Changelog RSS feed: https://verifymcp.io/servers/leonting1010-tap/taprun-cli/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/leonting1010-tap/taprun-cli/changelog.json
- HTML version of this page: https://verifymcp.io/servers/leonting1010-tap/taprun-cli
