{"_id":"@absoluteinc/mcp","_rev":"4-cd4a6be6823a227b0deee4edb93bfa3f","name":"@absoluteinc/mcp","dist-tags":{"latest":"1.0.2"},"versions":{"0.1.2":{"name":"@absoluteinc/mcp","version":"0.1.2","_id":"@absoluteinc/mcp@0.1.2","maintainers":[{"name":"pwbh","email":"dsapaiv@gmail.com"}],"homepage":"https://github.com/absolute-inc/absolute#readme","bugs":{"url":"https://github.com/absolute-inc/absolute/issues"},"bin":{"absolute-mcp":"dist/cli.js"},"dist":{"shasum":"3886eb1f1d23a62b73151adbc002e1c395bfb49c","tarball":"https://registry.npmjs.org/@absoluteinc/mcp/-/mcp-0.1.2.tgz","fileCount":3,"integrity":"sha512-JUOUWmc4HA/B5ObNa+WbkgaV9i5yS20U2mWy7U7t2xNA6EbUP66XOkVvcBen+6JKC775hrh7pZDz8lZ2+6vu9Q==","signatures":[{"sig":"MEYCIQC3gv7fI0qO2UuedKUXqh6OAX/1lgE7/C19bt3WCr9mxQIhANrAEk4NFuLzW0PVXgxikA9zkRVtYFnSMpHMGlXV/Vrd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39052},"type":"module","engines":{"node":">=22.12.0"},"gitHead":"988359b1a5ff312ba266bb169d35b3e72253fb2e","scripts":{"build":"esbuild src/cli.ts --bundle --platform=node --format=esm --target=node22 --packages=external --banner:js='#!/usr/bin/env node' --outfile=dist/cli.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"pwbh","email":"dsapaiv@gmail.com"},"repository":{"url":"git+https://github.com/absolute-inc/absolute.git","type":"git","directory":"mcp"},"_npmVersion":"11.17.0","description":"MCP server for the Absolute browser — @playwright/mcp-parity tool surface over the Absolute VFS protocol","directories":{},"_nodeVersion":"26.4.0","dependencies":{"commander":"^15.0.0","playwright":"^1.61.1","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.2_1784964156760_0.3136111316199375","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@absoluteinc/mcp","version":"1.0.0","_id":"@absoluteinc/mcp@1.0.0","maintainers":[{"name":"pwbh","email":"dsapaiv@gmail.com"}],"homepage":"https://github.com/absolute-inc/absolute#readme","bugs":{"url":"https://github.com/absolute-inc/absolute/issues"},"bin":{"absolute-mcp":"dist/cli.js"},"dist":{"shasum":"5fdb3807e93cfb4ced1f19b270ddddb14f3d36d9","tarball":"https://registry.npmjs.org/@absoluteinc/mcp/-/mcp-1.0.0.tgz","fileCount":3,"integrity":"sha512-1GdMb1ZAOTWzt788zvQuGQwkYJyHe4dYlR6jAaYMCAlW5/ximR7YxShX1kUqCTfBCQdsQUUM4qkoCHt3tYDIOA==","signatures":[{"sig":"MEUCIAHJwDE15cdorufJ6qDGl/1L+4lXh6vbXGkjrg8diBnPAiEA7CDsqhUUOkwAJTMoY0GQpJrrylheh/zrJ8p9On2DHrI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90478},"type":"module","engines":{"node":">=22.12.0"},"gitHead":"5c5b01e3ce18c76187916fc9782fa30c0c80c191","scripts":{"build":"esbuild src/cli.ts --bundle --platform=node --format=esm --target=node22 --packages=external --banner:js='#!/usr/bin/env node' --outfile=dist/cli.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:092031be-2383-422a-844c-8c1ab212784f"}},"repository":{"url":"git+https://github.com/absolute-inc/absolute.git","type":"git","directory":"mcp"},"_npmVersion":"11.17.0","description":"MCP server for the Absolute browser — @playwright/mcp-parity tool surface over the Absolute VFS protocol","directories":{},"_nodeVersion":"26.5.1","dependencies":{"commander":"^15.0.0","playwright":"^1.61.1","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.0.0_1785506313326_0.1433842855088625","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@absoluteinc/mcp","version":"1.0.1","_id":"@absoluteinc/mcp@1.0.1","maintainers":[{"name":"pwbh","email":"dsapaiv@gmail.com"}],"homepage":"https://github.com/absolute-inc/absolute#readme","bugs":{"url":"https://github.com/absolute-inc/absolute/issues"},"bin":{"absolute-mcp":"dist/cli.js"},"dist":{"shasum":"c5135c1d5c8b1d21e0ddf9fa4c7214c43322a544","tarball":"https://registry.npmjs.org/@absoluteinc/mcp/-/mcp-1.0.1.tgz","fileCount":3,"integrity":"sha512-6aTa7/srSdDEkCFKCSxkG7um+yTOSdWxGimLSchBh59cDYUnaDJvG3uOnHdeQ0iuj0xWuw/1Ms3hrFOV81D1OQ==","signatures":[{"sig":"MEUCIQC6XPZRZ4zGW6M+4n7os/aUH+cGD2iNMR751acXQ1gXUAIgQScuhT/VNT6u3Zn4vQurcjU+GppA4tjlFpWSGg3Hj9o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93191},"type":"module","engines":{"node":">=22.12.0"},"gitHead":"82376df38227e3cc7ac1f7e2ebfa0ff3e5ec5312","scripts":{"build":"esbuild src/cli.ts --bundle --platform=node --format=esm --target=node22 --packages=external --banner:js='#!/usr/bin/env node' --outfile=dist/cli.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:092031be-2383-422a-844c-8c1ab212784f"}},"repository":{"url":"git+https://github.com/absolute-inc/absolute.git","type":"git","directory":"mcp"},"_npmVersion":"11.17.0","description":"MCP server for the Absolute browser — @playwright/mcp-parity tool surface over the Absolute VFS protocol","directories":{},"_nodeVersion":"26.5.1","dependencies":{"commander":"^15.0.0","playwright":"^1.61.1","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.0.1_1785610323261_0.5059868704515238","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@absoluteinc/mcp","version":"1.0.2","description":"MCP server for the Absolute browser — @playwright/mcp-parity tool surface over the Absolute VFS protocol","type":"module","repository":{"type":"git","url":"git+https://github.com/absolute-inc/absolute.git","directory":"mcp"},"bin":{"absolute-mcp":"dist/cli.js"},"publishConfig":{"access":"public","provenance":false},"scripts":{"build":"esbuild src/cli.ts --bundle --platform=node --format=esm --target=node22 --packages=external --banner:js='#!/usr/bin/env node' --outfile=dist/cli.js","prepublishOnly":"npm run build"},"engines":{"node":">=22.12.0"},"dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","commander":"^15.0.0","playwright-core":"^1.61.1"},"devDependencies":{"esbuild":"^0.28.1"},"gitHead":"e6571edc988fe6f10af242dd49e1b441ed638a50","_id":"@absoluteinc/mcp@1.0.2","bugs":{"url":"https://github.com/absolute-inc/absolute/issues"},"homepage":"https://github.com/absolute-inc/absolute#readme","_nodeVersion":"26.5.1","_npmVersion":"11.17.0","dist":{"integrity":"sha512-bWrkrVfA3MNgDs5Xn91q1+JdZ8UvzJ//eivmjnzW1qpxkJm/tLEaU+qyMvUAcXBND2bKhO1+4Q28rue0R3gJbA==","shasum":"6b68f6ad1c600dcbb02e4b3cbe5df8ebd8a452e5","tarball":"https://registry.npmjs.org/@absoluteinc/mcp/-/mcp-1.0.2.tgz","fileCount":3,"unpackedSize":95824,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFaeU+z45Cqy5Ht64RUT1+FcDoXJcdqIfnrl3pn2Yb2FAiEArQb+Z8msL3WDLIWBTQCzCnOsrtjMxkTew9LcEkqRgN4="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:092031be-2383-422a-844c-8c1ab212784f"}},"directories":{},"maintainers":[{"name":"pwbh","email":"dsapaiv@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp_1.0.2_1785647235115_0.5222818358923784"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-25T07:22:36.641Z","modified":"2026-08-02T05:07:15.445Z","0.1.2":"2026-07-25T07:22:36.900Z","1.0.0":"2026-07-31T13:58:33.461Z","1.0.1":"2026-08-01T18:52:03.392Z","1.0.2":"2026-08-02T05:07:15.285Z"},"bugs":{"url":"https://github.com/absolute-inc/absolute/issues"},"homepage":"https://github.com/absolute-inc/absolute#readme","repository":{"type":"git","url":"git+https://github.com/absolute-inc/absolute.git","directory":"mcp"},"description":"MCP server for the Absolute browser — @playwright/mcp-parity tool surface over the Absolute VFS protocol","maintainers":[{"name":"pwbh","email":"dsapaiv@gmail.com"}],"readme":"# @absoluteinc/mcp\n\n`@absoluteinc/mcp` is the definitional MCP client of the Absolute VFS protocol — it drives the\nAbsolute browser over the custom `Absolute.*` CDP domain and exposes it to any MCP-speaking\nagent. Its tool surface is deliberately parity-shaped with `@playwright/mcp`, so an agent's\ntraining priors for that surface carry over unchanged.\n\n## Tools\n\n23 tools are copied verbatim (names, descriptions, schemas) from `@playwright/mcp@0.0.78`\n(`PWMCP_PIN` in `mcp/src/schemas.ts`) — schema parity, not behavior parity. One tool,\n`browser_read_file`, is ours: the VFS is the product, and discovery workflows are read-heavy.\nThat's 24 tools total.\n\n| Tool                       | Description                                                                                               | Notes                                                                           |\n| -------------------------- | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |\n| `browser_snapshot`         | Capture accessibility snapshot of the current page                                                        | `target`, `filename`, `depth`, `boxes` are rejected — always the full `page.md` |\n| `browser_click`            | Perform click on a web page                                                                               | `doubleClick`, `button` ≠ `left`, `modifiers` are rejected                      |\n| `browser_type`             | Type text into editable element                                                                           | `slowly` is rejected                                                            |\n| `browser_press_key`        | Press a key on the keyboard                                                                               | —                                                                               |\n| `browser_navigate`         | Navigate to a URL                                                                                         | —                                                                               |\n| `browser_wait_for`         | Wait for text to appear/disappear, or for a duration                                                      | `time` capped at 30s; polls `page.md` every 500ms up to a 10s timeout           |\n| `browser_close`            | Close the active tab                                                                                      | —                                                                               |\n| `browser_resize`           | Resize the browser window                                                                                 | —                                                                               |\n| `browser_console_messages` | Return console messages, filtered by level                                                                | `filename` is rejected — results always inline                                  |\n| `browser_handle_dialog`    | Accept or dismiss a pending `alert`/`confirm`/`prompt`                                                    | —                                                                               |\n| `browser_evaluate`         | Evaluate a JS function against the page, or an element by ref                                             | `filename` is rejected — results always inline                                  |\n| `browser_file_upload`      | Set files on a pending file chooser                                                                       | —                                                                               |\n| `browser_drop`             | Drop files or MIME-typed data onto an element                                                             | —                                                                               |\n| `browser_find`             | Search `page.md` for text or a regex, with surrounding context                                            | —                                                                               |\n| `browser_fill_form`        | Fill multiple form fields in one call                                                                     | checkbox \"uncheck\" isn't supported (see Behavior contract)                      |\n| `browser_navigate_back`    | Go back to the previous page in history                                                                   | —                                                                               |\n| `browser_network_requests` | Numbered list of network requests since page load                                                         | `filename` is rejected — results always inline                                  |\n| `browser_network_request`  | Full details (or one part) of a single request by number                                                  | `filename` is rejected — results always inline                                  |\n| `browser_run_code_unsafe`  | Run arbitrary Playwright code against a live `Page`                                                       | see \"run_code_unsafe is RCE-equivalent\" below                                   |\n| `browser_drag`             | Drag and drop between two elements                                                                        | —                                                                               |\n| `browser_hover`            | Hover over an element                                                                                     | —                                                                               |\n| `browser_select_option`    | Select an option in a dropdown                                                                            | —                                                                               |\n| `browser_tabs`             | List, create, close, or select a browser tab                                                              | see \"Multi-tab\" below                                                           |\n| `browser_read_file`        | Read a VFS file: `page.md`, `index.md`, `elements/e<id>.md`, `scripts/s<id>.md`, or a bare ref like `e12` | ours, not from upstream                                                         |\n\nEvery `target`/ref parameter across the act tools accepts only the ref forms an agent would\nplausibly echo back from a snapshot (`e12` or `elements/e12.md`); any other value — including a\nCSS selector — is rejected with agent-visible error text explaining why.\n\n### Omitted by design\n\n`browser_take_screenshot` is not implemented and does not appear in `tools/list`. Absolute is an\nAI-only browser with no pixel-rendered surface for a screenshot tool to capture; `browser_snapshot`\n(the VFS markdown snapshot) is the parity replacement an agent should reach for instead.\n\n### Multi-tab\n\nThe server tracks every open tab in the browser context, not just the one it started on. Every\ntool acts on the _active_ tab. `browser_tabs` lists, creates, selects, and closes tabs, and\n`browser_close` closes the active one. Tabs the app itself opens (e.g. a link with\n`target=\"_blank\"`, a popup) are auto-tracked the moment they appear — no explicit `browser_tabs\n{action:\"new\"}` call is required to bring them under the server's management, and any tool call\nright after will already see them in `browser_tabs {action:\"list\"}`.\n\n### Not behavior-parity\n\nThe following parameters are present in the schema (for training-prior parity with\n`@playwright/mcp`) but are capped or rejected in this implementation — see the per-tool notes in\nthe table above for exact error text:\n\n- CSS-selector `target` values (only VFS element refs are accepted: `e12` / `elements/e12.md`).\n- `filename` on any tool that has it — results are always returned inline in the tool response,\n  never written to a file.\n- `browser_snapshot`'s `depth`, `boxes`, and `target` — Absolute snapshots are always the full,\n  unscoped `page.md`.\n- `browser_click`'s `doubleClick`, non-`left` `button`, and `modifiers`.\n- `browser_type`'s `slowly`.\n\n### `run_code_unsafe` is RCE-equivalent\n\n`browser_run_code_unsafe` hands the calling agent a live Playwright `Page` and `eval`s the\nsupplied code against it — this is upstream `@playwright/mcp`'s own `--unsafe-mode` escape\nhatch, carrying the same warning: it is RCE-equivalent (arbitrary JavaScript execution in the\nPlaywright server process, with all the host access that implies). It is enabled deliberately\nin this server, not an oversight — there is no safer implementation that preserves the contract\nupstream defines for this tool.\n\n## Usage\n\n```\nabsolute-mcp --cdp-endpoint http://127.0.0.1:9222 [--target-url crm.internal]\n```\n\n`--target-url` picks the open tab whose URL contains the given substring; omit it to drive the\nfirst non-devtools tab found.\n\nExample MCP client config:\n\n```json\n{\n  \"mcpServers\": {\n    \"absolute\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@absoluteinc/mcp\", \"--cdp-endpoint\", \"http://127.0.0.1:9222\"]\n    }\n  }\n}\n```\n\n## Install\n\n```bash\nnpm install -g @absoluteinc/mcp\nabsolute-mcp --cdp-endpoint http://127.0.0.1:9222\n```\n\nor run it ad hoc with `npx -y @absoluteinc/mcp …` as in the client config above. The published\npackage is a single esbuild bundle (`dist/cli.js`); `playwright`, `@modelcontextprotocol/sdk`,\nand `commander` install as regular dependencies.\n\nFrom a repo checkout (dev, no build step):\n\n```bash\npnpm install\nnode mcp/bin/absolute-mcp.js --cdp-endpoint http://127.0.0.1:9222\n```\n\n## Runtime\n\nInstalled from npm: Node ≥ 22.12 — the published bundle is plain JS.\n\nFrom a repo checkout: Node ≥ 23.6 (or 22.6+ with `--experimental-strip-types`) — the dev\nlauncher and tests run directly against `.ts` sources via Node's built-in TypeScript\nstripping, no build step.\n\n## Protocol compatibility\n\n`@absoluteinc/mcp` requires an Absolute build with resolveRef handle continuity (main ≥\n`930acae`) — without it, stale-but-resolvable refs across a re-render aren't followed. Against\nbuilds older than the `readFile` freshness fix (`cc4258b`), the server stays correct anyway: it\nalways calls `Absolute.getManifest` before `Absolute.readFile` (the getManifest-first idiom), so\nit never depends on the fix having landed.\n\n## Behavior contract\n\n- Every act tool follows act → settle (500ms DOM-stable, long-poll-tolerant) → ack + fresh\n  snapshot.\n- Every failure an agent can act on comes back as ordinary tool-result text starting with\n  `Error: ` — the server never throws out to the transport.\n- CDP disconnection is the one hard failure class: the server attempts one reconnect and\n  retries the full handler once; if that also fails, the call reports\n  `browser unreachable — is Absolute running?`.\n- A CDP disconnect that happens during the post-act settle also goes through this one\n  recover-and-retry path — which means the retry re-runs the entire handler, including the\n  action itself. Callers on flaky connections should treat acts as non-idempotent in that\n  window (e.g. a `browser_click` could be delivered twice) rather than assuming the ack implies\n  exactly-once delivery.\n- At startup, the server fails fast and exits 1 before the MCP transport ever opens, in either\n  of two cases: an unreachable CDP endpoint prints playwright's raw connect error (e.g. an\n  `ECONNREFUSED` message) as-is; a reachable endpoint whose browser lacks the `Absolute.*` CDP\n  domain (stock Chrome) prints the contract message\n  `not an Absolute browser — the Absolute CDP domain is unavailable`.\n- `browser_wait_for` with `text`/`textGone` polls `page.md` every 500ms against a 10s timeout;\n  a timeout returns an agent-visible `Error: timed out …` text, not a thrown error. `time` is\n  silently capped at 30 seconds. When both `time` and `text`/`textGone` are passed, `time` wins\n  and the text condition is not evaluated.\n- `browser_fill_form` cannot cheaply read a checkbox/radio's current checked state: it clicks\n  when a checkbox field's value is truthy (or always for radio) and otherwise does nothing —\n  unchecking an already-checked box is not supported.\n- The server tracks every tab in the browser context (see \"Multi-tab\" above); all other\n  behavior notes on this list apply per-tab (settle, console/network buffers, pending\n  dialog/file-chooser) unless stated otherwise.\n- All logging goes to stderr; stdout is reserved for the MCP stdio transport.\n- No response deduplication or trimming — every tool result returns the full, untouched\n  `page.md`/`index.md` content.\n\n## Versioning\n\n`@absoluteinc/mcp` versions independently of the Absolute browser: semver lives in\n`mcp/package.json`, and releases are tagged `mcp-vX.Y.Z`, distinct from the browser's own\n`vX.Y.Z` tags.\n\nReleases ship from the manually-dispatched **Release MCP** workflow\n(`.github/workflows/release-mcp.yml`): it computes the next tag from existing `mcp-v*` tags\n(`release next-version --package mcp`), stamps `mcp/package.json`, bundles, smoke-checks,\npublishes to npm via OIDC trusted publishing, then pushes the release commit + tag to `main`\nand creates the GitHub release. If branch protection is ever added to `main`, exempt the\n`github-actions[bot]` push. Never re-run `npm publish` for a version that already went out —\nif only the post-publish pushes failed, note that the release commit and tag existed only on\nthe runner: recreate the version-stamp commit and tag locally (`npm pkg set version=X.Y.Z` in\n`mcp/`, commit as `release: mcp-vX.Y.Z`, tag), push those, and create the GitHub release by\nhand.\n","readmeFilename":"README.md"}