
Cloud Chromium browsers for AI agents, over a hosted MCP server.
Kernel suits teams whose agents need real browsers with persistent logins, and it ranked first on ComputeSDK’s 6 November 2026 throughput board. The catch is trust: a security incident reported on 4 November 2026 touched 0.28% of customers, so check key scopes before connecting production agents.
Vaults, managed auth and card payments ship in the same MCP server as the browsers.
Main trade-off
A security incident in November 2026 exposed a small number of customer API keys and app secrets, and usage-based pricing is harder to forecast than a flat seat price.
| Plan | Monthly price | What it includes |
|---|---|---|
| Free | Free | $5 monthly usage credit, 5 concurrent browsers, live view, stealth mode, 3 managed auth connections, 3 vaults, 1-day session replays |
| Hobbyist | $30/mo | $10 monthly usage credit, 10 concurrent browsers, configurable proxies, 7-day replays, unlimited managed auth connections and vaults |
| Start-up | $200/mo | $50 monthly usage credit, 150 concurrent browsers, bring-your-own proxies, GPU acceleration, regional browsers, 30-day replays, unlimited extensions |
| Enterprise | Custom | High concurrency, 99.9% SLA, SSO, 24/7 Slack support, HIPAA BAA, zero data retention, white-labeling |
Usage above the included credit bills per second of active browser time: $0.0000166667 for a headless browser, $0.0001333336 for a headful one and $0.0008000016 for a headful browser with GPU. Idle time in Standby Mode and proxies are never charged, and a browser pool counts toward the concurrency limit even when its browsers are idle. Agents can also buy one stealth headful browser for 30 minutes at $0.50 without an account, through the machine payments protocol. Source: kernel.sh/docs/info/pricing, read 13 November 2026.
brew install onkernel/tap/kernel && kernel mcp install --target claude-code
Agents connect to the hosted MCP endpoint (https://mcp.onkernel.com/mcp) over Streamable HTTP, or through stdio via the mcp-remote bridge, and call its 33 tools (manage_browsers, computer_action, execute_playwright_code and others) by name once the server is registered in the client.
The permissions this connector asks for, as its own documentation states them.
33 actions an agent can call. Open one for its parameters and an example.
Example call
{"tool": "manage_browsers", "arguments": {"action": "create", "headless": false, "stealth": true, "persistence": {"id": "my-profile"}}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, update, list, get, delete, get_telemetry. |
| headless | booleandefault true | Optional | Run without a visible display; headful sessions cost more but support computer_action. |
| stealth | booleandefault false | Optional | Enable anti-detection fingerprint coherence for the session. |
| profile_id | string | Optional | Attach a saved Profile so cookies and logins persist. |
| proxy_id | string | Optional | Attach a configured proxy (ISP, residential, mobile or custom) to the session. |
| session_id | string | Optional | Required for update, get, delete, and get_telemetry actions. |
Returns
| Field | Type | Description |
|---|---|---|
| session_id | string | Identifier for the created or retrieved browser session. |
| cdp_url | string | Chrome DevTools Protocol endpoint for driving the session with Playwright/Puppeteer. |
Example call
{"tool": "manage_profiles", "arguments": {"action": "setup", "name": "github-login"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of setup, list, search, get, delete. |
| name | string | Optional | Human-readable name for the profile. |
| profile_id | string | Optional | Required for get and delete actions. |
| query | string | Optional | Search term used with the search action. |
Returns
| Field | Type | Description |
|---|---|---|
| profile_id | string | Identifier for the saved profile, reusable across future sessions. |
Example call
{"tool": "manage_projects", "arguments": {"action": "list"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, list, get, update, delete. |
| project_id | string | Optional | Required for get, update, and delete actions. |
| name | string | Optional | Project display name, used with create/update. |
Returns
| Field | Type | Description |
|---|---|---|
| project | object | Project details including resource limits and scoped API keys. |
Example call
{"tool": "manage_api_keys", "arguments": {"action": "create", "scope": "project", "project_id": "proj_123"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, list, get, update, delete. |
| scope | stringdefault org | Optional | org or project. |
| project_id | string | Optional | Required when scope is project. |
| key_id | string | Optional | Required for get, update, and delete actions. |
Returns
| Field | Type | Description |
|---|---|---|
| plaintext_key | string | Only returned on create; not retrievable afterward. |
Example call
{"tool": "manage_browser_pools", "arguments": {"action": "acquire", "pool_id": "pool_abc"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, list, get, delete, flush, acquire, release. |
| pool_id | string | Optional | Required for get, delete, flush, acquire, release. |
| max_concurrent_sessions | number | Optional | Unified concurrency cap for the pool. |
Returns
| Field | Type | Description |
|---|---|---|
| browser | object | The acquired browser session, when action is acquire. |
Example call
{"tool": "manage_proxies", "arguments": {"action": "create", "type": "residential"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, list, get, check, delete. |
| type | string | Optional | isp, residential, mobile, or custom. Datacenter proxies were deprecated on 16 October 2026. |
| proxy_id | string | Optional | Required for get, check, and delete actions. |
Returns
| Field | Type | Description |
|---|---|---|
| proxy_id | string | Identifier to attach to a browser session via manage_browsers. |
Example call
{"tool": "manage_replays", "arguments": {"action": "start", "session_id": "sess_123"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of start, stop, list. |
| session_id | string | Required | The browser session to record. |
Returns
| Field | Type | Description |
|---|---|---|
| replay_url | string | URL to the MP4 recording once available. |
Example call
{"tool": "manage_extensions", "arguments": {"action": "list"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of list, delete. |
| extension_id | string | Optional | Required for the delete action. |
Returns
| Field | Type | Description |
|---|---|---|
| extensions | array | List of uploaded extension metadata objects. |
Example call
{"tool": "manage_apps", "arguments": {"action": "invoke", "app_id": "app_123", "action_name": "run"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of list, search, invoke, get_deployment, list_deployments, delete_deployment, get_invocation. |
| app_id | string | Optional | Target app for invoke and deployment actions. |
| action_name | string | Optional | The specific app action to invoke. |
Returns
| Field | Type | Description |
|---|---|---|
| invocation_id | string | Identifier to poll for the invocation result. |
Example call
{"tool": "manage_auth_connections", "arguments": {"action": "login", "domain": "example.com"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, list, get, delete, login, submit, wait. |
| domain | string | Optional | Domain to filter or target for the auth connection. |
| connection_id | string | Optional | Required for get, delete, submit, and wait actions. |
Returns
| Field | Type | Description |
|---|---|---|
| status | string | Connection lifecycle status, e.g. pending, authenticated, expired. |
Example call
{"tool": "manage_credentials", "arguments": {"action": "get_totp", "credential_id": "cred_123"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, list, get, update, delete, get_totp. |
| credential_id | string | Optional | Required for get, update, delete, and get_totp actions. |
Returns
| Field | Type | Description |
|---|---|---|
| totp_code | string | Current one-time code, returned only by get_totp. |
Example call
{"tool": "manage_credential_providers", "arguments": {"action": "list"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, list, get, update, delete. |
| provider_id | string | Optional | Required for get, update, and delete actions. |
Returns
| Field | Type | Description |
|---|---|---|
| provider | object | Provider connection details, excluding raw secrets. |
Example call
{"tool": "get_connection_context", "arguments": {}}Returns
| Field | Type | Description |
|---|---|---|
| organization_id | string | The authenticated organization. |
| scope | string | Effective credential scope, e.g. org or a specific project. |
Example call
{"tool": "computer_action", "arguments": {"session_id": "sess_123", "operation": "click", "x": 420, "y": 180}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| session_id | string | Required | The browser session to control. |
| operation | string | Required | One of click, type, press_key, scroll, move, get_position, read_clipboard, write_clipboard, screenshot. |
| x | number | Optional | X coordinate for click, move, or scroll. |
| y | number | Optional | Y coordinate for click, move, or scroll. |
| text | string | Optional | Text to type or write to clipboard. |
Returns
| Field | Type | Description |
|---|---|---|
| screenshot_url | string | Returned when operation is screenshot. |
Example call
{"tool": "browser_curl", "arguments": {"session_id": "sess_123", "url": "https://example.com/api", "method": "GET"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| session_id | string | Required | The browser session whose network stack issues the request. |
| url | string | Required | Target URL. |
| method | stringdefault GET | Optional | HTTP method. |
Returns
| Field | Type | Description |
|---|---|---|
| body | string | Raw response body. |
| status | number | HTTP status code. |
Example call
{"tool": "execute_playwright_code", "arguments": {"session_id": "sess_123", "code": "return await page.title();"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| session_id | string | Required | The browser session to execute against. |
| code | string | Required | Playwright/TypeScript code, executed with `page` in scope. |
Returns
| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the code ran without error. |
| result | string | The returned value, e.g. "Example Domain" for a page.title() call. |
Example call
{"tool": "exec_command", "arguments": {"session_id": "sess_123", "command": "ls /tmp"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| session_id | string | Required | The browser session's VM to run the command in. |
| command | string | Required | Shell command to execute. |
Returns
| Field | Type | Description |
|---|---|---|
| stdout | string | Decoded standard output. |
| stderr | string | Decoded standard error. |
Example call
{"tool": "search_docs", "arguments": {"query": "standby mode pricing"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| query | string | Required | Search terms. |
Returns
| Field | Type | Description |
|---|---|---|
| results | array | Matching documentation pages with excerpts. |
Example call
{"tool": "open_auth_login", "arguments": {"connection_id": "conn_123"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| connection_id | string | Required | The managed-auth connection to open the interactive login for. |
Example call
{"tool": "manage_browser_files", "arguments": {"action": "read", "session_id": "sess_123", "path": "/tmp/report.txt"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of list, get_info, read, download, write, upload, upload_zip, download_dir_zip, create_directory, move, delete_file, delete_directory, set_permissions. |
| session_id | string | Required | Browser session id or name. |
| path | string | Optional | Absolute file or directory path in the browser VM; required by most actions. |
| max_bytes | numberdefault 10485760 | Optional | Maximum bytes to return for read, download and download_dir_zip; up to 25 MiB. |
Returns
| Field | Type | Description |
|---|---|---|
| content | string | File contents for read; binary downloads come back as embedded MCP resources. |
Example call
{"tool": "manage_config_registry", "arguments": {"action": "lookup", "url": "https://example.com"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of lookup, resolve, get_analysis, cancel_analysis, list_configs, list_analyses. |
| url | string | Optional | Public http(s) target URL, for lookup and resolve. |
| intent | string | Optional | Plain-language workload to exercise during analysis, for resolve; https targets only. |
| analysis_id | string | Optional | Analysis id returned by resolve or the list actions, for get_analysis and cancel_analysis. |
Returns
| Field | Type | Description |
|---|---|---|
| recommendation | object | Recommended browser and proxy configuration for the target. |
Example call
{"tool": "manage_playwright_executors", "arguments": {"action": "list", "session_id": "sess_123"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of list, delete. |
| session_id | string | Required | Browser session id or name. |
| name | string | Optional | Executor name, required for delete; deleting default restarts it. |
| close_tab | booleandefault true | Optional | Whether delete closes the executor tab. |
Returns
| Field | Type | Description |
|---|---|---|
| executors | array | Every executor with busy, created_at, last_used_at and, for named executors, target_id and url. |
Example call
{"tool": "web_search", "arguments": {"action": "providers"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, get, contents, providers. |
| request | object | Optional | Search request, required for create. |
| search_id | string | Optional | Retained search id, required for get and contents. |
| slug | string | Optional | Optional provider filter for providers. |
Returns
| Field | Type | Description |
|---|---|---|
| search_id | string | Identifier of the retained search, returned by create. |
Example call
{"tool": "browser_repl", "arguments": {"session_id": "sess_123", "code": "return await page.title();"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| session_id | string | Required | Browser session id or name. |
| code | string | Optional | JavaScript for the cell; top-level bindings survive across calls. |
| reset | boolean | Optional | Restart the runtime before running the cell. |
| timeout_sec | number | Optional | Per-call timeout in seconds. |
Returns
| Field | Type | Description |
|---|---|---|
| result | string | The cell output. |
Example call
{"tool": "webmcp", "arguments": {"action": "list", "session_id": "sess_123"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of list, invoke, list_custom, add_custom, remove_custom. |
| session_id | string | Required | Live browser id or name. |
| tool_ref | string | Optional | Reference from the latest list, required for invoke. |
| input | object | Optional | Input matching the tool's inputSchema, for invoke. |
| timeout_sec | numberdefault 60 | Optional | Invoke timeout, 1 to 120 seconds. |
Returns
| Field | Type | Description |
|---|---|---|
| status | string | completed, canceled, error or awaiting_submission, with an invocation_id. |
Example call
{"tool": "manage_vaults", "arguments": {"action": "list"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, list, get, delete. |
Returns
| Field | Type | Description |
|---|---|---|
| vault | object | The vault record. |
Example call
{"tool": "manage_vault_provider_configs", "arguments": {"action": "list"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, list, get, update, delete. |
Returns
| Field | Type | Description |
|---|---|---|
| config | object | The provider configuration, without raw secrets. |
Example call
{"tool": "manage_vault_wallets", "arguments": {"action": "payment_methods"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, payment_methods. |
Returns
| Field | Type | Description |
|---|---|---|
| wallet | object | Wallet details and eligibility. |
Example call
{"tool": "manage_vault_cards", "arguments": {"action": "create"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, update, authorize. |
Returns
| Field | Type | Description |
|---|---|---|
| card | object | Card request state, including any hosted spend-approval action. |
Example call
{"tool": "manage_vault_credentials", "arguments": {"action": "create"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of create, update, connect_account. |
Returns
| Field | Type | Description |
|---|---|---|
| credential | object | Credential definition; sensitive values stay hidden. |
Example call
{"tool": "manage_vault_items", "arguments": {"action": "list"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| action | string | Required | One of list, get, invoke, events, delete. |
Returns
| Field | Type | Description |
|---|---|---|
| status | string | Operation status; ready is not login or payment success. |
Example call
{"tool": "get_more_tools", "arguments": {"capability_area": "webmcp"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| capability_area | string | Required | The area of the gap, for example webmcp. |
| task_outcome | string | Optional | Normalized outcome of the task that hit the gap. |
Example call
{"tool": "submit_feedback", "arguments": {"summary": "Docs example for manage_profiles is out of date", "feedback_type": "documentation"}}Parameters
| Parameter | Type | Needed | Description |
|---|---|---|---|
| summary | string | Required | Short statement of the feedback. |
| feedback_type | string | Required | The kind of feedback being reported. |
| task_outcome | string | Optional | Normalized outcome of the task. |
Kernel is a hosted Model Context Protocol server that lets Claude Code, Cursor and other MCP clients drive cloud Chromium browsers. Its README lists 33 tools covering sessions, profiles, proxies, vaults and Playwright execution, and it connects over Streamable HTTP with OAuth 2.1 authentication.
Fast cold starts, vendor-reported
Kernel's homepage says it spins up browsers in under 30 ms and boots from a cold request to a ready browser in 794 ms, against 2,967 ms for Browserbase in the steel-dev browserbench table it cites.
Top of an independent throughput board
Kernel ranked first of seven providers on ComputeSDK's public browser throughput board in its 6 November 2026 run, which times ten sequential actions across 100 stealth sessions per provider.
Standby Mode with zero idle cost
Idle browsers suspend and resume on the next request, and idle browsers in a pool incur no usage charges, so only active time is billed.
Stealth proxies and CAPTCHA solving
Free plans include stealth mode with a Kernel-managed residential proxy and CAPTCHA auto-solver, and residential traffic now fails over across several providers.
Profiles, Managed Auth and vaults
Saved profiles persist cookies and logins, Managed Auth does the login for the agent and keeps the credential away from it, with no per-connection fee, and vaults store credentials per end user, up to 3 vaults on the free plan.
Agentic payments
Agents can pay at checkout through Link by Stripe wallets or a user-approved Visa card, with no surcharge for the payments products.
Session observability
Live view, MP4 replays kept for 1 day on Free, 7 on Hobbyist and 30 on Start-up, and a telemetry API let an agent debug its own failed runs.
Compliance posture
SOC 2 Type II applies to every plan, ISO 27001 was announced in June 2026, HIPAA with a BAA is on Enterprise, and GDPR is listed as in progress.
Give an MCP agent hands on the live web
Register the hosted MCP endpoint in Claude Code or Cursor so the agent can call manage_browsers and computer_action directly to click, type, and read real pages instead of relying on stale training data.
Run CAPTCHA-gated scraping jobs unattended
Route requests through Kernel's residential and ISP proxies with automatic CAPTCHA solving so a scraping agent keeps working on sites that would otherwise block headless traffic.
Persist a logged-in session across agent runs
Create a browser Profile once so cookies and auth survive between invocations, letting a scheduled agent skip re-login on every run.
Debug a failed automation from a video replay
Pull the MP4 replay for a session via manage_replays to see exactly where a Playwright script or computer-use loop diverged from the expected page state.
Let an agent pay at checkout with a card the user approves
Create a vault wallet and a card request, have the user approve it, then let the agent fill and confirm the purchase through manage_vault_items.
The nearest AI agent skills on Hokai for the same job.
| Skill | Works with | Connects by | Checked |
|---|---|---|---|
| Claude · Cursor · Windsurf · VS Code | MCP | 13 Nov | |
| Claude · Codex · Cursor | MCP | 11 Nov | |
| Claude · Cursor · Windsurf | MCP | 11 Oct | |
| Claude · Cursor · Windsurf · VS Code | MCP | 11 Oct |
Kernel has a free plan, Hobbyist at $30 a month, Start-up at $200 a month and a custom Enterprise plan, with included usage credit of $5, $10 and $50 on the first three. Credit covers usage only. Beyond it a headless browser costs about $0.06 an hour and a headful one about $0.48, billed for active use, and idle time and proxies are not charged. Source: kernel.sh/pricing, read 13 November 2026.
The Kernel MCP server is MIT-licensed and the kernel-images browser build is Apache-2.0, both on GitHub. The hosted service has a free plan with 5 concurrent browsers, live view and stealth mode, and signing up needs no credit card. Paid plans add concurrency, longer replay retention and configurable proxies.
Kernel documents setup for ten clients, among them Claude, Cursor, VS Code, Windsurf and Zed. Any other client with remote MCP support can use the Streamable HTTP endpoint, and a client without it can fall back to mcp-remote over stdio. The one known exclusion is free Claude plans, whose way of adding servers does not work with Kernel.
Yes. Its notice of 4 November 2026 describes an incident detected on 2 November, in which a leaked API key gave an attacker the data held at a logging provider and then four GPU servers, three of which ran customer browser sessions. The company puts the affected share at 0.28% of customers, says it revoked and rotated the credentials involved, and is promoting scoped API keys.
In ComputeSDK's public benchmark, last run on 6 November 2026, Kernel scored 87.9 against 77.9 for Browserbase, at 7.58 and 5.32 actions per second and a median task of 1.32 and 1.88 seconds. Its test runs ten actions in a row on Wikipedia, 100 sessions per provider, so time your own login flow before you commit.
Kernel is a hosted MCP server that gives an agent cloud Chromium browsers to drive: it can create a session, click and type in it, run Playwright code against it, keep logins in saved profiles and replay what happened as video. It comes from Kernel, a San Francisco company founded in 2025 by Catherine Jue (CEO, previously co-founder of Sway Finance) and Rafael Garcia (CTO). The company went through Y Combinator's Summer 2025 batch and announced a $22 million seed and Series A round led by Accel in October 2025. Y Combinator's company page lists 22 people, and Kernel's homepage claims 11,000+ teams build on it. Its users are agents, not people: they invoke it through MCP or the API, and the dashboard exists for keys, billing and watching sessions.
The server runs at mcp.onkernel.com over Streamable HTTP and authenticates with OAuth 2.1 and dynamic client registration; clients without remote MCP support can use the mcp-remote stdio bridge. Its README lists 33 tools. Each Kernel feature has one manage_* tool with an action parameter (browsers, pools, profiles, proxies, vaults, replays, apps and so on), beside standalone tools for mouse and keyboard control, Playwright execution, a persistent JavaScript REPL and WebMCP page tools. Some tools only appear for clients or accounts that qualify, such as web search and the interactive login app.
Any client that speaks remote MCP can connect. Kernel's docs have setup pages for Claude, Cursor, Google Antigravity, OpenCode, fx, Goose, VS Code, Windsurf, Zed and Smithery, and the Kernel CLI wires several of them up in one command. It fits Claude Code and Cursor sessions that need a real browser, scheduled agents that must stay logged in, and checkout flows where a user approves a card. The best MCP servers guide ranks the browsing options by job, and the browser skills directory lists the rest.
Where an alternative wins: Browserbase posted a faster median screenshot, 142 ms against Kernel's 189 ms, in ComputeSDK's public run of 6 November 2026, where Kernel led on actions per second and on composite score. ComputeSDK's test is ten sequential actions on Wikipedia across 100 sessions with stealth on, so it says little about login-heavy flows, and Browser Use had a shorter median task time, 0.11 seconds against 1.32. ComputeSDK's board also lists Hyperbrowser, Steel and Browser Use as hosted rivals, with composite scores of 26.7, 54.4 and 34.9, and Kernel's homepage compares cold starts with Anchor Browser. Free Claude users cannot add Kernel at all: its README says the remote server does not work with the method free Claude plans use to add MCP servers.
What shipped recently: on 6 October 2026 Kernel added named Playwright executors, so several tasks can run in parallel tabs of one browser. On 16 October it shipped scoped API keys, general availability of Config Registry on Hobbyist plans and up, Visa card payments for agents through the CLI and MCP server, a larger GPU tier and failover across several residential proxy providers, and it deprecated datacenter proxies. It announced ISO 27001 certification in June 2026. On 4 November 2026 it published a notice of a security incident: an attacker used a compromised API key from 24 October, reached a logging provider and four GPU servers, and Kernel says 0.28% of its customers were affected.
Who should pick what: choose Kernel if your agents run long sequences of actions or need vaults and card payments beside the browser, since it posted 7.58 actions per second to Browserbase's 5.32. Choose Browserbase if your loop waits mostly on screenshots, where its 142 ms median beat Kernel's 189 ms. Whichever you pick, give each agent a scoped API key.
Protocol, authentication, permissions and the call contracts on this page are read from Kernel's own documentation. The verdict is Hokai's reading of them, not the maintainer's claim.