beryl CLI
Beryl on the command line: create projects, author tests,
trigger runs in CI, and manage everything the web app can. Coding agents reach the same
commands through Beryl's hosted MCP server at https://api.beryl.so/mcp.
Quickstart: one command
npx @beryl-so/cli@latest init
Signs you in (browser approval by default, emailed one-time code as fallback; new emails are signed up on the spot), registers the hosted MCP server in the agent you pick with --claude, --cursor, --vscode or --opencode (it asks when you pass none), and installs the beryl-test authoring skill. Safe to re-run.
Install
npm install -g @beryl-so/cli # `beryl` on your PATH
npx @beryl-so/cli@latest … # or run one-off without installing
From the monorepo (development): cd cli && npm install && npm run build && npm link.
beryl version reports whether the running CLI is behind the latest npm release
(best-effort). Set BERYL_NO_UPDATE_CHECK=1 to skip that check.
The CLI reports which commands run (never their arguments or output) so onboarding can
be measured; set BERYL_TELEMETRY=0 or DO_NOT_TRACK=1 to send nothing.
Authenticate
beryl login # opens the browser to approve; press Enter for an emailed code instead
beryl login --otp # skip the browser; emailed one-time code (signs up new emails too)
export BERYL_API_KEY=beryl_pat_… # CI: use a token from Account → Personal access tokens
Config stores your token + API URL only; nothing else persists. Point a command at a
workspace/project with the --workspace / --project flags or the BERYL_WORKSPACE /
BERYL_PROJECT env vars; with exactly one, the CLI auto-picks it.
Precedence: flags > BERYL_* env > auto-pick-if-one.
CI in one line
beryl runs trigger --url-override "$PREVIEW_URL" --watch --timeout 30
Exit codes: 0 success / all tests passed · 1 failure · 2 usage error · 3 auth error · 4 plan limit reached.
A project CI token (BERYL_TOKEN=beryl_ci_…, from the project's Settings, CI tab) is
enough to trigger runs and to turn a brief into tests: beryl jobs create "Cover the brief" --file ./brief.md --ci
(pass --workspace and --project ids). A CI job never waits for input; what a login
blocks is listed as skipped in beryl jobs get.
MCP server
claude mcp add --transport http -s user beryl https://api.beryl.so/mcp
Your agent signs you in through the server's OAuth the first time it connects (in Claude
Code, run /mcp and pick beryl). Clients without OAuth send a personal access token as
Authorization: Bearer beryl_pat_…. The server is always current, so there is nothing
to update.
Most non-interactive commands below are exposed as an MCP tool with the same name
(spaces and dashes become underscores); see the MCP tool column. none marks commands
kept CLI-only: account/billing/team admin, feedback, cloud exploration, and the commands
that read or write your local disk (logout, config files upload, config signing set).
Commands
init
Set up Beryl in this repo: sign in and wire up your coding agent
| Command | Summary | MCP tool |
|---|---|---|
beryl init | Set up Beryl in this repo: sign in and wire up your coding agent | none |
guide
Print the Beryl test guide, or one of its sections
| Command | Summary | MCP tool |
|---|---|---|
beryl guide [topic] | Print the Beryl test guide, or one of its sections | guide |
login
Authenticate the CLI with your Beryl account
| Command | Summary | MCP tool |
|---|---|---|
beryl login | Authenticate the CLI with your Beryl account | none |
signup
Register a new Beryl account (emails a 6-digit verification code)
| Command | Summary | MCP tool |
|---|---|---|
beryl signup | Register a new Beryl account (emails a 6-digit verification code) | signup |
logout
Remove the stored token from the CLI config
| Command | Summary | MCP tool |
|---|---|---|
beryl logout | Remove the stored token from the CLI config | none |
whoami
Show the signed-in account
| Command | Summary | MCP tool |
|---|---|---|
beryl whoami | Show the signed-in account | whoami |
tokens
Manage the personal access tokens that authenticate the CLI and CI.
| Command | Summary | MCP tool |
|---|---|---|
beryl tokens list | List your personal access tokens | tokens_list |
beryl tokens create <name> | Mint a new personal access token (shown once) | tokens_create |
beryl tokens revoke <token-id> | Revoke a personal access token | tokens_revoke |
beryl tokens dismiss <token-id> | Remove an already-revoked token from your list | tokens_dismiss |
workspaces
Create and manage workspaces, and pick the one your commands act on by default.
| Command | Summary | MCP tool |
|---|---|---|
beryl workspaces list | List workspaces you belong to | workspaces_list |
beryl workspaces get | Show one workspace | workspaces_get |
beryl workspaces create <name> | Create a workspace | workspaces_create |
beryl workspaces update | Rename a workspace or change its visibility | workspaces_update |
beryl workspaces delete | Delete a workspace and everything in it | workspaces_delete |
beryl workspaces history | Show who changed what in the workspace and its projects (schedules, tests, groups, environments, config names, accounts, tokens, members, settings), newest first, with filters | workspaces_history |
beryl workspaces leave | Leave a workspace you are a member of | workspaces_leave |
members
Manage who belongs to a workspace and their roles.
| Command | Summary | MCP tool |
|---|---|---|
beryl members list | List workspace members | none |
beryl members set-role <user-id> <role> | Change a member's role | none |
beryl members remove <user-id> | Remove a member from the workspace | none |
invites
Send, list, and revoke workspace invitations, and accept ones sent to you.
| Command | Summary | MCP tool |
|---|---|---|
beryl invites send <email> | Invite someone to the workspace by email | none |
beryl invites list | List the workspace's outstanding invitations | none |
beryl invites revoke <invitation-id> | Revoke a pending invitation | none |
beryl invites mine | List invitations sent to you | none |
beryl invites accept <invitation> | Accept an invitation (by id, or by the token from the invite email) | none |
beryl invites decline <invitation-id> | Decline an invitation | none |
projects
Create and manage projects: a site you author tests for and run.
beryl projects with no subcommand runs projects list.
| Command | Summary | MCP tool |
|---|---|---|
beryl projects list | List projects across all your workspaces, or in one with --workspace | projects_list |
beryl projects get | Show one project, including its current exploration state | projects_get |
beryl projects create [url] | Create a project for a URL, or an empty one with just --name | projects_create |
beryl projects dismiss-capture-prompt | Stop prompting to capture a signed-in session for this project | projects_dismiss_capture_prompt |
beryl projects rename <name> | Rename a project | projects_rename |
beryl projects quarantine [state] | Turn auto quarantine on or off and tune when it mutes and releases a test | projects_quarantine |
beryl projects heal <state> | Turn self-heal on or off for a project | projects_heal |
beryl projects surfaces [surfaces...] | Turn project surfaces on or off | projects_surfaces |
beryl projects findings-gate <mode> | Turn the findings gate on each run on or off | projects_findings_gate |
beryl projects delete | Delete a project and all its tests and runs | projects_delete |
beryl projects re-explore | Send the agent back in to run/heal existing tests and discover new flows | none |
beryl projects report | Aggregate quality report across recent runs (pass rates, per-test history, trend) | projects_report |
beryl projects reusable-auth <url> | Check whether a saved login can be reused for a URL before creating a project | projects_reusable_auth |
envs
Manage a project's environments: the URLs and auth Beryl runs tests against.
| Command | Summary | MCP tool |
|---|---|---|
beryl envs list | List a project's environments | envs_list |
beryl envs get <env-id> | Show one environment | envs_get |
beryl envs create <name> <url> | Add an environment (e.g. staging) to a project | envs_create |
beryl envs update <env-id> | Update an environment's name, URL, app ids, auth settings, Site Health screen sizes, schedule, CI and pages, or issue tracker settings | envs_update |
beryl envs delete <env-id> | Delete an environment | envs_delete |
schedule
Manage the schedules on which Beryl runs a project's tests automatically. A project can hold many independent schedules; each has its own environment, cadence (daily or weekly), local run time, timezone, and target groups (none = every active test).
| Command | Summary | MCP tool |
|---|---|---|
beryl schedule list | List the project's schedules | schedule_list |
beryl schedule add | Add a schedule (daily, or weekly on a given day) | schedule_add |
beryl schedule update <schedule-id> | Change a schedule's cadence, time, timezone, groups, or environment | schedule_update |
beryl schedule remove <schedule-id> | Remove a schedule (its tests and groups stay) | schedule_remove |
tests
Author, inspect, version, and heal a project's tests: the checks Beryl runs on each run.
beryl tests with no subcommand runs tests list.
| Command | Summary | MCP tool |
|---|---|---|
beryl tests list | List the project's tests, each with its platforms and rolled-up status | tests_list |
beryl tests get <test-id> | Show one test and its variants | tests_get |
beryl tests plan <test-id> | Print a test's current step plan (JSON) | tests_plan |
beryl tests set-plan <test-id> | Replace a test's step plan (creates a new version) | tests_set_plan |
beryl tests rename <test-id> <title> | Rename a test | tests_rename |
beryl tests add-surface <test-id...> | Create an existing test on more surfaces, as variants of the same test | tests_add_surface |
beryl tests skip-surface <test-id> | Mark a test as not for a surface, so it is never offered as missing there | tests_skip_surface |
beryl tests set-intent <test-id> <intent> | Edit what a test proves, the target heal judges against | tests_set_intent |
beryl tests set-groups <test-id> | Replace the groups a test belongs to | tests_set_groups |
beryl tests set-access <test-id> <access> | Mark a test read or write | tests_set_access |
beryl tests add-groups <test-ids...> | Add groups to one or more tests, keeping the groups they already have | tests_add_groups |
beryl tests quarantine <state> <test-ids...> | Mute flaky tests: they keep running, but their failures stop failing the run | tests_quarantine |
beryl tests events <test-id> | Who quarantined, grouped or renamed a test, and why | tests_events |
beryl tests delete <test-ids...> | Delete tests, their version history, and their results | tests_delete |
beryl tests recompile <test-id> | Validate + verify an edited plan against the live site before persisting | tests_recompile |
beryl tests versions <test-id> | List a test's version history | tests_versions |
beryl tests version <test-id> <version-no> | Show one specific version of a test (including its plan) | tests_version |
beryl tests diff <test-id> <from> <to> | Diff two versions of a test's plan | tests_diff |
beryl tests restore <test-id> <version-no> | Restore a test to an earlier version | tests_restore |
beryl tests reset <test-id> | Discard user edits and return the test to its latest system-authored version | tests_reset |
beryl tests heal <test-id> <state> | Turn self-healing on or off for a test | tests_heal |
beryl tests history <test-id> | Pass/fail history, streak, and stability for a test | tests_history |
beryl tests script <test-id> | Print the rendered Playwright spec for a test | tests_script |
beryl tests export <test-ids...> | Export tests as Playwright .spec.ts files in a ZIP | tests_export |
groups
Manage a project's test groups: labels a test can carry any number of, used to filter, run, or schedule a slice of the suite. Groups are created only here (or in Settings → Groups); assigning a test to an unknown name is an error.
beryl groups with no subcommand runs groups list.
| Command | Summary | MCP tool |
|---|---|---|
beryl groups list | List the project's test groups and how many tests each holds | groups_list |
beryl groups create <name> | Create a group | groups_create |
beryl groups rename <group> <name> | Rename a group (tests keep their membership) | groups_rename |
beryl groups delete <group> | Delete a group: its tests stay; a schedule targeting only this group goes with it | groups_delete |
runs
Trigger a run of a project's tests (e.g. in CI), then watch, inspect, and download results.
beryl runs with no subcommand runs runs list.
| Command | Summary | MCP tool |
|---|---|---|
beryl runs trigger | Trigger a test run (whole suite, a subset, or one environment) | runs_trigger |
beryl runs queue | Show the run in flight and the runs waiting behind it | runs_queue |
beryl runs list | List recent runs | runs_list |
beryl runs get <run-id> | Show one run with its per-test results | runs_get |
beryl runs watch <run-id> | Follow a run until it finishes | runs_watch |
beryl runs cancel <run-id> | Cancel an in-flight run, or take a queued one out of the queue | runs_cancel |
beryl runs report <run-id> | Show the generated report for a run | runs_report |
beryl runs download <run-id> | Get a run's results with signed artifact URLs, or download them to disk | runs_download |
beryl runs explain <result-id> | Explain, with AI, why a test result failed | runs_explain |
health
Site Health, or how your site reads to search engines and visitors: content, speed, links, security, and a visual check of layout at phone, tablet and desktop sizes, graded from a real check of your live pages.
beryl health with no subcommand runs health get.
| Command | Summary | MCP tool |
|---|---|---|
beryl health get | Show the latest Site Health report, or one report by id | health_get |
beryl health run | Run a fresh Site Health check, or a visual check of one page | health_run |
beryl health intended <key> | Mark a finding as intended, so it stops counting against the grade | health_intended |
beryl health tracker status | Show how Site Health files findings as issue tracker tickets for an environment | health_tracker_status |
beryl health tracker tickets | List the findings Site Health tracks in the issue tracker, with their tickets | health_tracker_tickets |
beryl health tracker connect | Get the link that connects an issue tracker to the workspace | health_tracker_connect |
beryl health tracker disconnect | Remove the workspace's issue tracker connection | health_tracker_disconnect |
beryl health tracker teams | List the teams of the connected issue tracker | health_tracker_teams |
beryl health tracker projects | List a tracker team's projects | health_tracker_projects |
jobs
Test-creation jobs: the cloud agent follows a prompt, a document, or both, and authors tests.
| Command | Summary | MCP tool |
|---|---|---|
beryl jobs create [prompt] | Create tests from a prompt, a document, or both, on Beryl's cloud | jobs_create |
beryl jobs list | List the project's test-creation jobs | jobs_list |
beryl jobs get <job-id> | Show a job's status and the tests it created | jobs_get |
beryl jobs clone <job-id> | Run a job again: queue a new job with the same prompt, document, environment and account | jobs_clone |
beryl jobs retry <job-id> | Author only what a partial or failed job left out, optionally with an edited prompt or document | jobs_retry |
beryl jobs cancel <job-id> | Stop a queued, running or paused job; the tests it already created stay | jobs_cancel |
beryl jobs delete <job-id> | Delete a job; the flows and tests it created stay | jobs_delete |
explorations
Inspect the agent's exploration runs: how it crawled a site and authored its tests.
| Command | Summary | MCP tool |
|---|---|---|
beryl explorations list | List the agent's exploration passes for a project | none |
beryl explorations get <exploration-id> | Show one exploration: authored tests, abandoned flows, coverage, frontier | none |
beryl explorations steps <exploration-id> | List every step the agent took in an exploration | none |
beryl explorations cancel <exploration-id> | Cancel an in-flight exploration | none |
beryl explorations watch <exploration-id> | Stream an exploration live: watch the agent explore and author tests | none |
config
Manage the variables, secrets, and files the agent can use while exploring and running.
| Command | Summary | MCP tool |
|---|---|---|
beryl config vars list | List the project's config variables (visible to the agent during runs) | config_vars_list |
beryl config vars set <key> <value> | Create or update a config variable | config_vars_set |
beryl config vars get <key> | Show one config variable | config_vars_get |
beryl config vars delete <key> | Delete a config variable | config_vars_delete |
beryl config secrets list | List the project's secrets (values are never returned); a test account's password is managed on the account, not here | config_secrets_list |
beryl config secrets set <key> <value> | Create a secret (write-only; re-setting a key replaces it) | config_secrets_set |
beryl config secrets get <key> | Show one secret's metadata, or reveal its value with --reveal | config_secrets_get |
beryl config secrets delete <key> | Delete a secret | config_secrets_delete |
beryl config signing get | Which key signs Android builds converted from an .aab, with its fingerprints | config_signing_get |
beryl config signing set | Sign converted Android builds with your own keystore | none |
beryl config signing clear | Forget your keystore; converted builds go back to Beryl's key | config_signing_clear |
beryl config files list | List uploaded files: fixtures tests attach and Android and iOS app builds | config_files_list |
beryl config files get <file> | Show one uploaded file's metadata | config_files_get |
beryl config files upload <file> | Upload a file: a fixture an upload step attaches, or an Android or iOS app build | none |
beryl config files download <file-id> | Get a short-lived download URL for a file | config_files_download |
beryl config files delete <file-id> | Delete an uploaded file | config_files_delete |
mailbox
The project's standing email addresses, where its tests receive sign-in mail.
beryl mailbox with no subcommand runs mailbox get.
| Command | Summary | MCP tool |
|---|---|---|
beryl mailbox get | The project's mailbox address | mailbox_get |
beryl mailbox list | List the project's mailboxes | mailbox_list |
beryl mailbox identities | The +tag addresses Beryl minted for this project's tests, and how each cleanup ended | mailbox_identities |
beryl mailbox create | Add a second mailbox to the project | mailbox_create |
beryl mailbox delete <mailbox-id> | Delete a mailbox and every email it has received | mailbox_delete |
beryl mailbox read <mailbox-id> | Read the latest email in a mailbox (waits for one to arrive) | mailbox_read |
beryl mailbox emails <mailbox-id> | List the emails a mailbox has received | mailbox_emails |
third-party-integrations
Test a site's own integrations (Connect Slack) against Beryl's accounts on those providers.
beryl third-party-integrations with no subcommand runs third-party-integrations list.
| Command | Summary | MCP tool |
|---|---|---|
beryl third-party-integrations list | The third party providers this project's tests can connect to | third_party_integrations_list |
beryl third-party-integrations target | The channel this project's tests pick when the app asks where to post | third_party_integrations_target |
accounts
Durable identities on the site under test: what an authenticated test signs in as.
beryl accounts with no subcommand runs accounts list.
| Command | Summary | MCP tool |
|---|---|---|
beryl accounts list | List the test accounts an environment's tests sign in as | accounts_list |
beryl accounts get <account-id> | Show one test account: origin, lifetime, sign-in state | accounts_get |
beryl accounts create | Add a test account: the customer's own, or one Beryl signs up | accounts_create |
beryl accounts capture | Store a signed-in session as a captured test account | accounts_capture |
beryl accounts signup <account-id> | Store the sign-up you just walked live as a test account's signup plan | accounts_signup |
beryl accounts set-login <account-id> | Store the sign-in plan a run replays once, plus the signed-in check that proves it | accounts_set_login |
beryl accounts get-login <account-id> | Read the stored sign-in plan, its signed-in check, and the hash a safe write must cite | accounts_get_login |
beryl accounts check <account-id> | Sign in now and prove the session survives into a fresh browser | accounts_check |
beryl accounts update <account-id> | Change a test account's password, login method, or default flag | accounts_update |
beryl accounts delete <account-id> | Delete a test account | accounts_delete |
account
View and update your personal account profile.
| Command | Summary | MCP tool |
|---|---|---|
beryl account get | Show your account profile | none |
beryl account update | Update your profile | none |
beryl account deletion-preview | Preview what deleting your account would remove or leave | none |
feedback
Send product feedback to the Beryl team.
| Command | Summary | MCP tool |
|---|---|---|
beryl feedback send <message> | Send product feedback to the Beryl team | none |
billing
Review a workspace's plan usage, subscription, and invoices; upgrade or switch plans.
| Command | Summary | MCP tool |
|---|---|---|
beryl billing plans | List the plans: price, cloud run minutes, AI-created tests, active tests, parallel slots | none |
beryl billing usage | Show plan usage: cloud run minutes (web 1x, Android 2x, iOS 5x), AI-created tests, runnable tests (the newest your plan runs), parallel slots, run history, and pack balances | none |
beryl billing checkout | Get a Stripe Checkout link that moves a Free workspace onto Team or Business | none |
beryl billing plan | Get a link for a person to approve switching a paid workspace between Team and Business, monthly or annual; nothing changes until they do. Once approved, a higher tier or monthly to annual is charged today and restarts the cycle; anything else takes effect on the next billing day | none |
beryl billing subscription | Show the workspace's subscription, including a downgrade or cancel waiting for the next billing day | none |
beryl billing invoices | List recent invoices | none |
beryl billing portal | Get a Stripe billing-portal link for the workspace | none |
beryl billing packs buy | Get a link for a person to approve buying a one-time pack on Team or Business (2,500 cloud run minutes or 25 AI-created tests), used after the monthly allowance and never expiring; nothing is charged until they do | none |
beryl billing auto-refill get | Show auto-refill: which packs it buys, the threshold, the monthly cap and this period's spend | none |
beryl billing auto-refill set | Get a link for a person to approve turning auto-refill on or off; nothing changes until they do. When on: once the allowance is used up, buy a pack when its balance drops below the threshold, up to an optional monthly cap; flags left out keep their current value | none |
beryl billing addons get | Show the workspace's monthly add-ons (extra parallel slots, extra runnable tests by the 100), their prices and any reduction waiting for the billing day | none |
beryl billing addons set | Get a link for a person to approve monthly add-ons on Team or Business; nothing changes until they do. Once approved, more is charged today, prorated to the billing day; less takes effect on the billing day with no refund. Add-ons bill monthly on their own invoice, also on an annual plan; flags left out keep their current value | none |
version
Show the running CLI version, API URL, and Node version
| Command | Summary | MCP tool |
|---|---|---|
beryl version | Show the running CLI version, API URL, and Node version | version |
Run beryl <command> --help for flags and examples.
Global flags
-V, --version: Print the CLI version and exit--json: Print machine-readable JSON (NDJSON for streams)--api-url: API base URL (default https://api.beryl.so)--token: Personal access token (overrides config/BERYL_API_KEY)-h, --help: Show help