Playwright MCP
Playwright MCP
Playwright를 사용한 브라우저 자동화 기능을 제공하는 Model Context Protocol (MCP) 서버입니다. 이 서버는 LLM이 구조화된 접근성 스냅샷을 통해 웹 페이지와 상호작용할 수 있게 하여, 스크린샷이나 시각 기반 모델이 필요하지 않습니다.
Playwright MCP vs Playwright CLI
이 패키지는 Playwright에 대한 MCP 인터페이스를 제공합니다. 코딩 에이전트를 사용하는 경우, 대신 CLI+SKILLS를 사용하는 것이 더 유용할 수 있습니다.
CLI: 최신 코딩 에이전트는 점점 더 CLI 기반 워크플로우를 SKILL로 노출하는 방식을 MCP보다 선호합니다. CLI 호출이 토큰 효율성이 더 높기 때문입니다. 즉, 큰 도구 스키마와 장황한 접근성 트리를 모델 컨텍스트에 로드하는 것을 피하여, 에이전트가 간결하고 목적에 맞는 명령을 통해 작업할 수 있습니다. 이로 인해 CLI + SKILLs는 제한된 컨텍스트 창 내에서 대규모 코드베이스, 테스트, 추론과 브라우저 자동화의 균형을 맞춰야 하는 처리량이 높은 코딩 에이전트에 더 적합합니다.Playwright CLI with SKILLS에 대해 자세히 알아보기: Playwright CLI with SKILLS.
MCP: MCP는 지속적인 상태, 풍부한 내부 검사, 페이지 구조에 대한 반복적 추론의 이점을 얻는 특수 에이전트 루프(예: 탐색적 자동화, 자가 치유 테스트, 또는 지속적인 브라우저 컨텍스트 유지가 토큰 비용 우려보다 중요한 장기 실행 자율 워크플로우)에서 여전히 유용합니다.
주요 기능
빠르고 가벼움. Playwright의 접근성 트리를 사용하며, 픽셀 기반 입력을 사용하지 않습니다.
LLM 친화적. 시각 모델이 필요 없으며, 구조화된 데이터만으로 작동합니다.
결정론적 도구 적용. 스크린샷 기반 접근 방식에서 흔한 모호함을 피합니다.
요구 사항
Node.js 18 이상
VS Code, Cursor, Windsurf, Claude Desktop, Goose, Grok, Junie 또는 기타 MCP 클라이언트
시작하기
먼저, 클라이언트에 Playwright MCP 서버를 설치하세요.
표준 구성은 대부분의 도구에서 작동합니다:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}
Amp VS Code 확장 설정 화면에서 추가하거나 settings.json 파일을 업데이트하세요:
"amp.mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}Amp CLI 설정:
아래 amp mcp add 명령어를 통해 추가하세요:
amp mcp add playwright -- npx @playwright/mcp@latestAntigravity 설정에서 추가하거나 구성 파일을 업데이트하세요:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}Claude Code CLI를 사용하여 Playwright MCP 서버를 추가하세요:
claude mcp add playwright npx @playwright/mcp@latestMCP 설치 가이드를 따르고, 위의 표준 구성을 사용하세요.
MCP 서버 구성 섹션의 지침을 따르세요.
예: 로컬 설정
cline_mcp_settings.json 파일에 다음을 추가하세요:
{
"mcpServers": {
"playwright": {
"type": "stdio",
"command": "npx",
"timeout": 30,
"args": [
"-y",
"@playwright/mcp@latest"
],
"disabled": false
}
}
}Codex CLI를 사용하여 Playwright MCP 서버를 추가하세요:
codex mcp add playwright npx "@playwright/mcp@latest"또는 구성 파일 ~/.codex/config.toml을 생성하거나 편집하고 다음을 추가하세요:
[mcp_servers.playwright]
command = "npx"
args = ["@playwright/mcp@latest"]자세한 내용은 Codex MCP 문서를 참조하세요.
Copilot CLI를 사용하여 대화형으로 Playwright MCP 서버를 추가하세요:
/mcp add또는 구성 파일 ~/.copilot/mcp-config.json을 생성하거나 편집하고 다음을 추가하세요:
{
"mcpServers": {
"playwright": {
"type": "local",
"command": "npx",
"tools": [
"*"
],
"args": [
"@playwright/mcp@latest"
]
}
}
}자세한 내용은 Copilot CLI 문서를 참조하세요.
버튼을 클릭하여 설치:
또는 수동으로 설치:
Cursor Settings -> MCP -> Add new MCP Server로 이동하세요. 원하는 이름을 지정하고, command 유형에 명령어 npx @playwright/mcp@latest를 사용하세요. Edit을 클릭하여 구성을 확인하거나 인수와 같은 명령어를 추가할 수도 있습니다.
Factory CLI를 사용하여 Playwright MCP 서버를 추가하세요:
droid mcp add playwright "npx @playwright/mcp@latest"또는 Factory droid 내에서 /mcp를 입력하여 MCP 서버 관리를 위한 대화형 UI를 열 수 있습니다.
자세한 내용은 Factory MCP 문서를 참조하세요.
MCP 설치 가이드를 따르고, 위의 표준 구성을 사용하세요.
버튼을 클릭하여 설치:
또는 수동으로 설치:
Advanced settings -> Extensions -> Add custom extension으로 이동하세요. 원하는 이름을 지정하고, 유형은 STDIO를 사용하며, command를 npx @playwright/mcp로 설정하세요. "Add Extension"을 클릭하세요.
Grok CLI를 사용하여 Playwright MCP 서버를 추가하세요:
grok mcp add playwright -- npx @playwright/mcp@latest또는 구성 파일 ~/.grok/config.toml을 생성하거나 편집하고 다음을 추가하세요:
[mcp_servers.playwright]
command = "npx"
args = ["@playwright/mcp@latest"]자세한 내용은 Grok MCP 문서를 참조하세요.
Junie CLI에서 Playwright MCP 서버를 추가하려면:
/mcp입력Ctrl+A를 눌러 새 MCP 서버 추가목록에서 Playwright 선택
또는 .junie/mcp/mcp.json에 추가:
{
"mcpServers": {
"Playwright": {
"command": "npx",
"args": [
"-y",
"@playwright/mcp@latest"
]
}
}
}자세한 내용은 Junie MCP 구성 문서를 참조하세요.
MCP 서버 문서를 따르세요. 예를 들어 .kiro/settings/mcp.json에:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}버튼을 클릭하여 설치:
또는 수동으로 설치:
오른쪽 사이드바의 Program -> Install -> Edit mcp.json으로 이동하세요. 위의 표준 구성을 사용하세요.
MCP 서버 문서를 따르세요. 예를 들어 ~/.config/opencode/opencode.json에:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"playwright": {
"type": "local",
"command": [
"npx",
"@playwright/mcp@latest"
],
"enabled": true
}
}
}
VSCode 또는 IntelliJ에서 Qodo Gen 채팅 패널을 열고 → 더 많은 도구 연결 → + 새 MCP 추가 → 위의 표준 구성을 붙여넣으세요.
저장을 클릭하세요.
버튼을 클릭하여 설치:
또는 수동으로 설치:
MCP 설치 가이드를 따르고, 위의 표준 구성을 사용하세요. VS Code CLI를 사용하여 Playwright MCP 서버를 설치할 수도 있습니다:
# For VS Code
code --add-mcp '{"name":"playwright","command":"npx","args":["@playwright/mcp@latest"]}'설치 후, Playwright MCP 서버는 VS Code에서 GitHub Copilot 에이전트와 함께 사용할 수 있습니다.
Settings -> AI -> Manage MCP Servers -> + Add로 이동하여 MCP 서버를 추가하세요. 위의 표준 구성을 사용하세요.
또는 Warp 프롬프트에서 슬래시 명령어 /add-mcp를 사용하고 위의 표준 구성을 붙여넣으세요:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
}
}
}Windsurf MCP 문서를 따르세요. 위의 표준 구성을 사용하세요.
구성
Playwright MCP 서버는 다음 인수를 지원합니다. 위의 JSON 구성에서 "args" 목록의 일부로 제공할 수 있습니다:
옵션 | 설명 |
--allowed-hosts <hosts...> | 이 서버가 제공할 수 있는 호스트의 쉼표로 구분된 목록입니다. 기본값은 서버가 바인딩된 호스트입니다. 호스트 검사를 비활성화하려면 '*'를 전달하십시오.env |
--allowed-origins | 브라우저가 요청할 수 있는 신뢰할 수 있는 출처의 세미콜론으로 구분된 목록입니다. 기본값은 모든 출처를 허용합니다. 중요: 보안 경계 역할을 하지 않으며 리디렉션에 영향을 주지 않습니다.env |
--allow-unrestricted-file-access | 작업 공간 루트 외부의 파일에 대한 액세스를 허용합니다. 또한 file:// URL에 대한 무제한 액세스를 허용합니다. 기본적으로 파일 시스템 액세스는 작업 공간 루트 디렉터리(루트가 구성되지 않은 경우 cwd)로만 제한되며 file:// URL로의 탐색이 차단됩니다.env |
--blocked-origins | 브라우저가 요청하지 못하도록 차단할 출처의 세미콜론으로 구분된 목록입니다. 차단 목록은 허용 목록보다 먼저 평가됩니다. 허용 목록 없이 사용하는 경우 차단 목록과 일치하지 않는 요청은 여전히 허용됩니다. 중요: 보안 경계 역할을 하지 않으며 리디렉션에 영향을 주지 않습니다.env |
--block-service-workers | 서비스 워커를 차단합니다.env |
--browser | 사용할 브라우저 또는 Chrome 채널입니다. 가능한 값: chrome, firefox, webkit, msedge.env |
--caps | 활성화할 추가 기능의 쉼표로 구분된 목록입니다. 가능한 값: vision, pdf, devtools.env |
--cdp-endpoint | 연결할 CDP 엔드포인트입니다.env |
--cdp-header <headers...> | 연결 요청과 함께 보낼 CDP 헤더입니다. 여러 개를 지정할 수 있습니다.env |
--cdp-timeout | CDP 엔드포인트 연결을 위한 시간 제한(밀리초)입니다. 기본값은 30000ms입니다.env |
--codegen | 코드 생성을 위한 언어를 지정합니다. 가능한 값: "typescript", "python", "java", "csharp", "none". 기본값은 "typescript"입니다.env |
--config | 구성 파일의 경로입니다.env |
--console-level | 반환할 콘솔 메시지의 수준입니다: "error", "warning", "info", "debug". 각 수준은 더 심각한 수준의 메시지를 포함합니다.env |
--device | 에뮬레이트할 장치입니다(예: "iPhone 15").env |
--mobile | 일반 모바일 장치(Chromium의 경우 Pixel 10, WebKit의 경우 iPhone 17)를 에뮬레이트합니다. 모바일 페이지는 일반적으로 더 가벼워서 토큰을 절약합니다. --device와 함께 사용할 수 없습니다.env |
--executable-path | 브라우저 실행 파일의 경로입니다.env |
--extension | 실행 중인 브라우저 인스턴스에 연결합니다(Edge/Chrome만 해당). "Playwright Extension"이 설치되어 있어야 합니다.env |
--endpoint | 연결할 바인딩된 브라우저 엔드포인트입니다.env |
--grant-permissions <permissions...> | 브라우저 컨텍스트에 부여할 권한 목록입니다(예: "geolocation", "clipboard-read", "clipboard-write").env |
--headless | 브라우저를 헤드리스 모드로 실행합니다. 기본값은 헤드 있음입니다.env |
--host | 서버를 바인딩할 호스트입니다. 기본값은 localhost입니다. 모든 인터페이스에 바인딩하려면 0.0.0.0을 사용하십시오.env |
--ignore-https-errors | HTTPS 오류를 무시합니다.env |
--init-page <path...> | Playwright 페이지 개체에서 평가할 TypeScript 파일의 경로입니다.env |
--init-script <path...> | 초기화 스크립트로 추가할 JavaScript 파일의 경로입니다. 이 스크립트는 페이지의 스크립트보다 먼저 모든 페이지에서 평가됩니다. 여러 번 지정할 수 있습니다.env |
--isolated | 브라우저 프로필을 메모리에 유지하고 디스크에 저장하지 않습니다.env |
--image-responses | 클라이언트에 이미지 응답을 보낼지 여부입니다. "allow" 또는 "omit"일 수 있습니다. 기본값은 "allow"입니다.env |
--no-sandbox | 일반적으로 샌드박스 처리되는 모든 프로세스 유형에 대해 샌드박스를 비활성화합니다.env |
--output-dir | 출력 파일을 위한 디렉터리 경로입니다.env |
--output-max-size | 오래된 출력 파일을 제거하는 임계값(바이트)입니다.env |
--port | SSE 전송을 위해 수신 대기할 포트입니다.env |
--proxy-bypass | 프록시를 우회할 쉼표로 구분된 도메인 목록입니다(예: .com,chromium.org,.domain.com).env |
--proxy-server | 프록시 서버를 지정합니다(예: "http://myproxy:3128" 또는 "socks5://myproxy:8080").env |
--sandbox | 일반적으로 샌드박스 처리되지 않는 모든 프로세스 유형에 대해 샌드박스를 활성화합니다.env |
--save-session | Playwright MCP 세션을 출력 디렉터리에 저장할지 여부입니다.env |
--secrets | dotenv 형식의 비밀을 포함하는 파일의 경로입니다.env |
--shared-browser-context | 연결된 모든 HTTP 클라이언트 간에 동일한 브라우저 컨텍스트를 재사용합니다.env |
--snapshot-boxes | 각 요소의 경계 상자를 스냅샷에 [box=x,y,width,height]로 포함합니다. 좌표는 뷰포트 기준이며 CSS 픽셀 단위입니다.env |
--snapshot-mode | 응답을 위해 스냅샷을 찍을 때 사용할 모드를 지정합니다. "full" 또는 "none"일 수 있습니다. 기본값은 "full"입니다.env |
--storage-state | 격리된 세션을 위한 저장 상태 파일의 경로입니다.env |
--test-id-attribute | 테스트 ID에 사용할 속성을 지정합니다. 기본값은 "data-testid"입니다.env |
--timeout-action | 작업 시간 제한(밀리초)을 지정합니다. 기본값은 5000ms입니다.env |
--timeout-navigation | 탐색 시간 제한(밀리초)을 지정합니다. 기본값은 60000ms입니다.env |
--timeout-settle | 각 작업 후 트리거된 작업이 안정될 때까지 대기하는 시간(밀리초)입니다. 기본값은 500ms입니다.env |
--user-agent | 사용자 에이전트 문자열을 지정합니다.env |
--user-data-dir | 사용자 데이터 디렉터리의 경로입니다. 지정하지 않으면 임시 디렉터리가 생성됩니다.env |
--viewport-size | 브라우저 뷰포트 크기를 픽셀 단위로 지정합니다(예: "1280x720").env |
사용자 프로필
일반 브라우저처럼 영구 프로필을 사용하여 Playwright MCP를 실행하거나(기본값), 테스트 세션을 위한 격리된 컨텍스트에서 실행하거나, 브라우저 확장 프로그램을 사용하여 기존 브라우저에 연결할 수 있습니다.
영구 프로필
로그인된 모든 정보는 영구 프로필에 저장됩니다. 세션 사이에 오프라인 상태를 지우려면 프로필을 삭제할 수 있습니다.
영구 프로필은 다음 위치에 있으며 --user-data-dir 인수로 재정의할 수 있습니다.
# Windows
%USERPROFILE%\AppData\Local\ms-playwright\mcp-{channel}-{workspace-hash}
# macOS
- ~/Library/Caches/ms-playwright/mcp-{channel}-{workspace-hash}
# Linux
- ~/.cache/ms-playwright/mcp-{channel}-{workspace-hash}{workspace-hash}는 MCP 클라이언트의 작업 공간 루트에서 파생되므로, 다른 프로젝트는 자동으로 별도의 프로필을 사용합니다.
[!IMPORTANT] 영구 프로필은 한 번에 하나의 브라우저 인스턴스에서만 사용할 수 있으므로, 동일한 작업 공간을 공유하는 동시 MCP 클라이언트는 충돌합니다. 여러 클라이언트를 병렬로 실행하려면 각 추가 클라이언트를
--isolated로 시작하거나 고유한--user-data-dir을 지정하십시오.
격리 모드
격리 모드에서는 각 세션이 격리된 프로필에서 시작됩니다. MCP에 브라우저를 닫도록 요청할 때마다 세션이 종료되고 이 세션의 모든 저장 상태가 손실됩니다. 구성의 contextOptions 또는 --storage-state 인수를 통해 브라우저에 초기 저장 상태를 제공할 수 있습니다. 저장 상태에 대한 자세한 내용은 여기에서 확인하세요.
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest",
"--isolated",
"--storage-state={path/to/storage.json}"
]
}
}
}브라우저 확장 프로그램
Playwright MCP Chrome 확장 프로그램을 사용하면 기존 브라우저 탭에 연결하고 로그인된 세션 및 브라우저 상태를 활용할 수 있습니다. 설치 및 설정 지침은 microsoft/playwright › packages/extension을 참조하세요.
초기 상태
브라우저 컨텍스트 또는 페이지에 초기 상태를 제공하는 여러 가지 방법이 있습니다.
저장 상태의 경우 다음 중 하나를 선택할 수 있습니다.
--user-data-dir인수를 사용하여 사용자 데이터 디렉터리로 시작합니다. 이렇게 하면 모든 브라우저 데이터가 세션 간에 유지됩니다.--storage-state인수를 사용하여 저장 상태 파일로 시작합니다. 이렇게 하면 파일의 쿠키 및 로컬 저장소가 격리된 브라우저 컨텍스트에 로드됩니다.
페이지 상태의 경우 다음을 사용할 수 있습니다.
--init-page를 사용하여 Playwright 페이지 객체에서 평가될 TypeScript 파일을 지정합니다. 이를 통해 페이지를 설정하기 위해 임의의 코드를 실행할 수 있습니다.
// init-page.ts
export default async ({ page }) => {
await page.context().grantPermissions(['geolocation']);
await page.context().setGeolocation({ latitude: 37.7749, longitude: -122.4194 });
await page.setViewportSize({ width: 1280, height: 720 });
};--init-script를 사용하여 초기화 스크립트로 추가될 JavaScript 파일을 지정합니다. 이 스크립트는 페이지의 모든 스크립트보다 먼저 모든 페이지에서 평가됩니다. 브라우저 API를 재정의하거나 환경을 설정하는 데 유용합니다.
// init-script.js
window.isPlaywrightMCP = true;구성 파일
Playwright MCP 서버는 JSON 구성 파일을 사용하여 구성할 수 있습니다. --config 명령줄 옵션을 사용하여 구성 파일을 지정할 수 있습니다.
npx @playwright/mcp@latest --config path/to/config.json{
/**
* The browser to use.
*/
browser?: {
/**
* The type of browser to use.
*/
browserName?: 'chromium' | 'firefox' | 'webkit';
/**
* Keep the browser profile in memory, do not save it to disk.
*/
isolated?: boolean;
/**
* Path to a user data directory for browser profile persistence.
* Temporary directory is created by default.
*/
userDataDir?: string;
/**
* Launch options passed to
* @see https://playwright.dev/docs/api/class-browsertype#browser-type-launch-persistent-context
*
* This is useful for settings options like `channel`, `headless`, `executablePath`, etc.
*/
launchOptions?: playwright.LaunchOptions;
/**
* Context options for the browser context.
*
* This is useful for settings options like `viewport`.
*/
contextOptions?: playwright.BrowserContextOptions;
/**
* Chrome DevTools Protocol endpoint to connect to an existing browser instance in case of Chromium family browsers.
*/
cdpEndpoint?: string;
/**
* CDP headers to send with the connect request.
*/
cdpHeaders?: Record<string, string>;
/**
* Timeout in milliseconds for connecting to CDP endpoint. Defaults to 30000 (30 seconds). Pass 0 to disable timeout.
*/
cdpTimeout?: number;
/**
* Remote endpoint to connect to an existing Playwright server. May be a
* WebSocket URL string, or a [ConnectOptions] object that mirrors the
* `connectOptions` shape used by the test runner. When passed as an object,
* `exposeNetwork`, `headers`, `slowMo`, and `timeout` are forwarded to the
* underlying connect call.
*/
remoteEndpoint?: string | playwright.ConnectOptions & { endpoint: string };
/**
* Paths to TypeScript files to add as initialization scripts for Playwright page.
*/
initPage?: string[];
/**
* Paths to JavaScript files to add as initialization scripts.
* The scripts will be evaluated in every page before any of the page's scripts.
*/
initScript?: string[];
},
/**
* Connect to a running browser instance (Edge/Chrome only). If specified, `browser`
* config is ignored.
* Requires the "Playwright Extension" to be installed.
*/
extension?: boolean;
server?: {
/**
* The port to listen on for SSE or MCP transport.
*/
port?: number;
/**
* The host to bind the server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.
*/
host?: string;
/**
* The hosts this server is allowed to serve from. Defaults to the host server is bound to.
* This is not for CORS, but rather for the DNS rebinding protection.
*/
allowedHosts?: string[];
},
/**
* List of enabled tool capabilities. Possible values:
* - 'core': Core browser automation features.
* - 'pdf': PDF generation and manipulation.
* - 'vision': Coordinate-based interactions.
* - 'devtools': Developer tools features.
*/
capabilities?: ToolCapability[];
/**
* Whether to save the Playwright session into the output directory.
*/
saveSession?: boolean;
/**
* Reuse the same browser context between all connected HTTP clients.
*/
sharedBrowserContext?: boolean;
/**
* Secrets are used to replace matching plain text in the tool responses to prevent the LLM
* from accidentally getting sensitive data. It is a convenience and not a security feature,
* make sure to always examine information coming in and from the tool on the client.
*/
secrets?: Record<string, string>;
/**
* The directory to save output files.
*/
outputDir?: string;
/**
* Threshold for evicting old output files, in bytes.
*/
outputMaxSize?: number;
console?: {
/**
* The level of console messages to return. Each level includes the messages of more severe levels. Defaults to "info".
*/
level?: 'error' | 'warning' | 'info' | 'debug';
},
network?: {
/**
* List of origins to allow the browser to request. Default is to allow all. Origins matching both `allowedOrigins` and `blockedOrigins` will be blocked.
*
* Supported formats:
* - Full origin: `https://example.com:8080` - matches only that origin
* - Wildcard port: `http://localhost:*` - matches any port on localhost with http protocol
*/
allowedOrigins?: string[];
/**
* List of origins to block the browser to request. Origins matching both `allowedOrigins` and `blockedOrigins` will be blocked.
*
* Supported formats:
* - Full origin: `https://example.com:8080` - matches only that origin
* - Wildcard port: `http://localhost:*` - matches any port on localhost with http protocol
*/
blockedOrigins?: string[];
};
/**
* Specify the attribute to use for test ids, defaults to "data-testid".
*/
testIdAttribute?: string;
timeouts?: {
/*
* Configures default action timeout: https://playwright.dev/docs/api/class-page#page-set-default-timeout. Defaults to 5000ms.
*/
action?: number;
/*
* Configures default navigation timeout: https://playwright.dev/docs/api/class-page#page-set-default-navigation-timeout. Defaults to 60000ms.
*/
navigation?: number;
/**
* Configures default expect timeout: https://playwright.dev/docs/test-timeouts#expect-timeout. Defaults to 5000ms.
*/
expect?: number;
/**
* How long to wait after each action for triggered work (navigations, requests) to settle before responding. Defaults to 500ms.
*/
settle?: number;
};
/**
* Whether to send image responses to the client. Can be "allow", "omit", or "auto". Defaults to "auto", which sends images if the client can display them.
*/
imageResponses?: 'allow' | 'omit';
snapshot?: {
/**
* When taking snapshots for responses, specifies the mode to use.
*/
mode?: 'full' | 'none';
/**
* Whether to include each element's bounding box as [box=x,y,width,height] in snapshots.
* Coordinates are viewport-relative, in CSS pixels (Element.getBoundingClientRect).
*/
boxes?: boolean;
};
/**
* allowUnrestrictedFileAccess acts as a guardrail to prevent the LLM from accidentally
* wandering outside its intended workspace. It is a convenience defense to catch unintended
* file access, not a secure boundary; a deliberate attempt to reach other directories can be
* easily worked around, so always rely on client-level permissions for true security.
*/
allowUnrestrictedFileAccess?: boolean;
/**
* Specify the language to use for code generation.
*/
codegen?: 'typescript' | 'python' | 'java' | 'csharp' | 'none';
}독립형 MCP 서버
디스플레이가 없는 시스템이나 IDE의 작업자 프로세스에서 헤드 브라우저를 실행할 때는 DISPLAY가 설정된 환경에서 MCP 서버를 실행하고 HTTP 전송을 활성화하려면 --port 플래그를 전달하세요.
npx @playwright/mcp@latest --port 8931그런 다음 MCP 클라이언트 구성에서 url을 HTTP 엔드포인트로 설정합니다.
{
"mcpServers": {
"playwright": {
"url": "http://localhost:8931/mcp"
}
}
}Related MCP server: Playwright MCP Server
보안
Playwright MCP는 보안 경계가 아닙니다. 배포 보안에 대한 지침은 MCP 보안 모범 사례를 참조하세요.
참고: 현재 Docker 구현은 헤드리스 Chromium만 지원합니다.
{
"mcpServers": {
"playwright": {
"command": "docker",
"args": ["run", "-i", "--rm", "--init", "--pull=always", "mcr.microsoft.com/playwright/mcp"]
}
}
}또는 MCP 클라이언트가 스폰하도록 하는 대신 컨테이너를 장기 실행 서비스로 실행하려면 다음을 사용하세요.
docker run -d -i --rm --init --pull=always \
--entrypoint node \
--name playwright \
-p 8931:8931 \
mcr.microsoft.com/playwright/mcp \
/app/cli.js --headless --browser chromium --no-sandbox --port 8931 --host 0.0.0.0서버는 호스트 포트 8931에서 수신 대기하며 모든 MCP 클라이언트가 연결할 수 있습니다.
직접 Docker 이미지를 빌드할 수 있습니다.
docker build -t mcr.microsoft.com/playwright/mcp .import http from 'http';
import { createConnection } from '@playwright/mcp';
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
http.createServer(async (req, res) => {
// ...
// Creates a headless Playwright MCP server with SSE transport
const connection = await createConnection({ browser: { launchOptions: { headless: true } } });
const transport = new SSEServerTransport('/messages', res);
await connection.connect(transport);
// ...
});도구
browser_click
제목: 클릭
설명: 웹 페이지에서 클릭을 수행합니다.
매개변수:
element(문자열, 선택 사항): 요소와 상호 작용할 권한을 얻는 데 사용되는 사람이 읽을 수 있는 요소 설명target(문자열): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유한 요소 선택자doubleClick(부울, 선택 사항): 단일 클릭 대신 더블 클릭을 수행할지 여부button(문자열, 선택 사항): 클릭할 버튼, 기본값은 왼쪽modifiers(배열, 선택 사항): 누를 수정자 키
읽기 전용: false
browser_close
제목: 브라우저 닫기
설명: 페이지를 닫습니다.
매개변수: 없음
읽기 전용: false
browser_console_messages
제목: 콘솔 메시지 가져오기
설명: 모든 콘솔 메시지를 반환합니다.
매개변수:
level(문자열): 반환할 콘솔 메시지의 수준. 각 수준에는 더 심각한 수준의 메시지가 포함됩니다. 기본값은 "info"입니다.all(부울, 선택 사항): 세션 시작 이후가 아니라 마지막 탐색 이후의 모든 콘솔 메시지를 반환할지 여부. 기본값은 false입니다.filename(문자열, 선택 사항): 콘솔 메시지를 저장할 파일 이름. 제공되지 않으면 메시지가 텍스트로 반환됩니다.
읽기 전용: true
browser_drag
제목: 마우스 드래그
설명: 두 요소 간에 드래그 앤 드롭을 수행합니다.
매개변수:
startElement(문자열, 선택 사항): 요소와 상호 작용할 권한을 얻는 데 사용되는 사람이 읽을 수 있는 소스 요소 설명startTarget(문자열): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유한 요소 선택자endElement(문자열, 선택 사항): 요소와 상호 작용할 권한을 얻는 데 사용되는 사람이 읽을 수 있는 대상 요소 설명endTarget(문자열): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유한 요소 선택자
읽기 전용: false
browser_drop
제목: 요소에 파일 또는 데이터 드롭
설명: 페이지 외부에서 드래그한 것처럼 요소에 파일 또는 MIME 유형 데이터를 드롭합니다. "paths" 또는 "data" 중 하나 이상을 제공해야 합니다.
매개변수:
element(문자열, 선택 사항): 요소와 상호 작용할 권한을 얻는 데 사용되는 사람이 읽을 수 있는 요소 설명target(문자열): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유한 요소 선택자paths(배열, 선택 사항): 요소에 드롭할 파일의 절대 경로.data(객체, 선택 사항): 드롭할 데이터, MIME 유형을 문자열 값에 매핑한 맵 (예: {"text/plain": "hello", "text/uri-list": "https://example.com"}).
읽기 전용: false
browser_evaluate
제목: JavaScript 평가
설명: 페이지 또는 요소에서 JavaScript 표현식을 평가합니다.
매개변수:
element(문자열, 선택 사항): 요소와 상호 작용할 권한을 얻는 데 사용되는 사람이 읽을 수 있는 요소 설명target(문자열, 선택 사항): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유한 요소 선택자function(문자열): () => { /* 코드 / } 또는 요소가 제공된 경우 (element) => { / 코드 */ }filename(문자열, 선택 사항): 결과를 저장할 파일 이름. 제공되지 않으면 결과가 텍스트로 반환됩니다.
읽기 전용: false
browser_file_upload
제목: 파일 업로드
설명: 하나 이상의 파일을 업로드합니다.
매개변수:
paths(배열, 선택 사항): 업로드할 파일의 절대 경로. 단일 파일 또는 여러 파일일 수 있습니다. 생략하면 파일 선택기가 취소됩니다.
읽기 전용: false
browser_fill_form
제목: 양식 채우기
설명: 여러 양식 필드를 채웁니다.
매개변수:
fields(배열): 채울 필드
읽기 전용: false
browser_find
제목: 페이지 스냅샷에서 찾기
설명: 현재 페이지의 접근성 스냅샷에서 텍스트 또는 정규식을 검색합니다. 일치하는 스냅샷 노드를 주변 컨텍스트의 몇 줄(검색 스니펫과 유사)과 함께 반환하며, 각각 트리 루트에서의 경로 아래에 표시됩니다. 전체 스냅샷을 캡처하는 것보다 저렴하며 요소와 해당 참조만 찾으면 될 때 유용합니다.
매개변수:
text(문자열, 선택 사항): 페이지 스냅샷에서 검색할 일반 텍스트(대소문자 구분 없는 부분 문자열 일치). text 또는 regex 중 하나만 제공하십시오.regex(문자열, 선택 사항): 페이지 스냅샷에서 검색할 정규식. 일치는 기본적으로 대소문자를 구분합니다. 플래그를 추가하려면 패턴을 슬래시로 감싸십시오. 예: "/error/i" (대소문자 구분 없음). text 또는 regex 중 하나만 제공하십시오.
읽기 전용: true
browser_handle_dialog
제목: 대화 상자 처리
설명: 대화 상자를 처리합니다.
매개변수:
accept(부울): 대화 상자를 수락할지 여부.promptText(문자열, 선택 사항): 프롬프트 대화 상자의 경우 프롬프트 텍스트.
읽기 전용: false
browser_hover
제목: 마우스 호버
설명: 페이지의 요소 위로 마우스를 가져갑니다.
매개변수:
element(문자열, 선택 사항): 요소와 상호 작용할 권한을 얻는 데 사용되는 사람이 읽을 수 있는 요소 설명target(문자열): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유한 요소 선택자
읽기 전용: false
browser_navigate
제목: URL로 이동
설명: URL로 이동합니다.
매개변수:
url(문자열): 이동할 URL
읽기 전용: false
browser_navigate_back
제목: 뒤로 가기
설명: 기록에서 이전 페이지로 돌아갑니다.
매개변수: 없음
읽기 전용: false
browser_network_request
제목: 네트워크 요청 세부 정보 표시
설명: 단일 네트워크 요청의 전체 세부 정보(헤더 및 본문)를 반환하거나,
part가 설정된 경우 단일 부분을 반환합니다. browser_network_requests의 번호를 사용하십시오.매개변수:
index(정수): browser_network_requests에서 출력된 요청의 1부터 시작하는 인덱스.part(문자열, 선택 사항): 요청의 이 부분만 반환합니다. 생략하면 전체 세부 정보를 반환합니다.filename(문자열, 선택 사항): 결과를 저장할 파일 이름. 제공되지 않으면 출력이 텍스트로 반환됩니다.
읽기 전용: true
browser_network_requests
제목: 네트워크 요청 나열
설명: 페이지 로드 이후의 네트워크 요청에 번호가 매겨진 목록을 반환합니다. 전체 세부 정보를 얻으려면 번호와 함께 browser_network_request를 사용하십시오.
매개변수:
static(부울): 이미지, 글꼴, 스크립트 등 성공적인 정적 리소스를 포함할지 여부. 기본값은 false입니다.filter(문자열, 선택 사항): URL이 이 정규식과 일치하는 요청만 반환합니다(예: "/api/."user").filename(문자열, 선택 사항): 네트워크 요청을 저장할 파일 이름. 제공되지 않으면 요청이 텍스트로 반환됩니다.
읽기 전용: true
browser_press_key
제목: 키 누르기
설명: 키보드의 키를 누릅니다.
매개변수:
key(string): 누를 키의 이름 또는 생성할 문자(예:ArrowLeft또는a)
읽기 전용: false
browser_resize
제목: 브라우저 창 크기 조정
설명: 브라우저 창의 크기를 조정합니다.
매개변수:
width(number): 브라우저 창의 너비height(number): 브라우저 창의 높이
읽기 전용: false
browser_run_code_unsafe
제목: Playwright 코드 실행 (안전하지 않음)
설명: Playwright 코드 조각을 실행합니다. 안전하지 않음: Playwright 서버 프로세스에서 임의의 JavaScript를 실행하며 RCE와 동등합니다.
매개변수:
code(string, 선택 사항): 실행할 Playwright 코드가 포함된 JavaScript 함수입니다. 단일 인수page로 호출되며, 이를 사용하여 페이지와 상호작용할 수 있습니다. 예:async (page) => { await page.getByRole('button', { name: 'Submit' }).click(); return await page.title(); }filename(string, 선택 사항): 지정된 파일에서 코드를 로드합니다.code와filename이 모두 제공되면code는 무시됩니다.
읽기 전용: false
browser_select_option
제목: 옵션 선택
설명: 드롭다운에서 옵션을 선택합니다.
매개변수:
element(string, 선택 사항): 요소와 상호작용할 권한을 얻기 위해 사용되는 사람이 읽을 수 있는 요소 설명target(string): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유 요소 선택자values(array): 드롭다운에서 선택할 값의 배열입니다. 단일 값 또는 여러 값일 수 있습니다.
읽기 전용: false
browser_snapshot
제목: 페이지 스냅샷
설명: 현재 페이지의 접근성 스냅샷을 캡처합니다. 스크린샷보다 더 좋습니다.
매개변수:
target(string, 선택 사항): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유 요소 선택자filename(string, 선택 사항): 응답으로 반환하는 대신 스냅샷을 마크다운 파일로 저장합니다.depth(number, 선택 사항): 스냅샷 트리의 깊이 제한boxes(boolean, 선택 사항): 각 요소의 경계 상자를 스냅샷에[box=x,y,width,height]로 포함합니다. 좌표는 뷰포트 기준이며 CSS 픽셀 단위입니다(Element.getBoundingClientRect).
읽기 전용: true
browser_take_screenshot
제목: 스크린샷 찍기
설명: 현재 페이지의 스크린샷을 찍습니다. 스크린샷을 기반으로 작업을 수행할 수 없습니다. 작업에는
browser_snapshot을 사용하세요.매개변수:
element(string, 선택 사항): 요소와 상호작용할 권한을 얻기 위해 사용되는 사람이 읽을 수 있는 요소 설명target(string, 선택 사항): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유 요소 선택자type(string, 선택 사항): 스크린샷의 이미지 형식입니다. 설정하지 않으면 파일 확장자에서 유추되며, 그렇지 않으면 png입니다.filename(string, 선택 사항): 스크린샷을 저장할 파일 이름입니다. 지정하지 않으면 기본값은page-{timestamp}.{png|jpeg|webp}입니다. 출력 디렉터리 내에 유지하려면 상대 파일 이름을 선호합니다.fullPage(boolean, 선택 사항): true인 경우 현재 보이는 뷰포트 대신 전체 스크롤 가능한 페이지의 스크린샷을 찍습니다. 요소 스크린샷과 함께 사용할 수 없습니다.scale(string): 이미지 해상도 배율입니다. "css"는 CSS 픽셀 단위의 스크린샷을 생성합니다(더 작고 장치 간 일관됨). "device"는 장치 픽셀을 사용하여 고해상도 스크린샷을 생성합니다(더 크고 장치 픽셀 비율을 고려함). 기본값은 css입니다.
읽기 전용: true
browser_type
제목: 텍스트 입력
설명: 편집 가능한 요소에 텍스트를 입력합니다.
매개변수:
element(string, 선택 사항): 요소와 상호작용할 권한을 얻기 위해 사용되는 사람이 읽을 수 있는 요소 설명target(string): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유 요소 선택자text(string): 요소에 입력할 텍스트submit(boolean, 선택 사항): 입력한 텍스트를 제출할지 여부(Enter 키 누름)slowly(boolean, 선택 사항): 한 번에 한 문자씩 입력할지 여부입니다. 페이지의 키 핸들러를 트리거하는 데 유용합니다. 기본적으로 전체 텍스트가 한 번에 채워집니다.
읽기 전용: false
browser_wait_for
제목: 대기
설명: 텍스트가 나타나거나 사라지거나 지정된 시간이 경과할 때까지 기다립니다.
매개변수:
time(number, 선택 사항): 대기할 시간(초)text(string, 선택 사항): 기다릴 텍스트textGone(string, 선택 사항): 사라질 때까지 기다릴 텍스트
읽기 전용: false
browser_tabs
제목: 탭 관리
설명: 브라우저 탭을 나열, 생성, 닫기 또는 선택합니다.
매개변수:
action(string): 수행할 작업index(number, 선택 사항): 탭 인덱스, 닫기/선택에 사용됩니다. 닫기에서 생략하면 현재 탭이 닫힙니다.url(string, 선택 사항): 새 탭에서 이동할 URL, 새 탭 생성에 사용됩니다.
읽기 전용: false
browser_get_config
제목: 구성 가져오기
설명: CLI 옵션, 환경 변수 및 구성 파일을 병합한 후 최종 해결된 구성을 가져옵니다.
매개변수: 없음
읽기 전용: true
browser_network_state_set
제목: 네트워크 상태 설정
설명: 브라우저 네트워크 상태를 온라인 또는 오프라인으로 설정합니다. 오프라인인 경우 모든 네트워크 요청이 실패합니다.
매개변수:
state(string): 오프라인 모드를 시뮬레이션하려면 "offline"으로 설정하고, 네트워크 연결을 복원하려면 "online"으로 설정합니다.
읽기 전용: false
browser_route
제목: 네트워크 요청 모의
설명: URL 패턴과 일치하는 네트워크 요청을 모의(mock)하는 경로를 설정합니다.
매개변수:
pattern(string): 일치시킬 URL 패턴 (예: "/api/users", "/*.{png,jpg}")status(number, 선택 사항): 반환할 HTTP 상태 코드 (기본값: 200)body(string, 선택 사항): 응답 본문 (텍스트 또는 JSON 문자열)contentType(string, 선택 사항): Content-Type 헤더 (예: "application/json", "text/html")headers(array, 선택 사항): "Name: Value" 형식으로 추가할 헤더removeHeaders(string, 선택 사항): 요청에서 제거할 헤더 이름의 쉼표로 구분된 목록
읽기 전용: false
browser_route_list
제목: 네트워크 경로 나열
설명: 모든 활성 네트워크 경로를 나열합니다.
매개변수: 없음
읽기 전용: true
browser_unroute
제목: 네트워크 경로 제거
설명: 패턴과 일치하는 네트워크 경로를 제거합니다(패턴을 지정하지 않으면 모든 경로 제거).
매개변수:
pattern(string, 선택 사항): 제거할 URL 패턴 (모든 경로를 제거하려면 생략)
읽기 전용: false
browser_cookie_clear
제목: 쿠키 지우기
설명: 모든 쿠키를 지웁니다.
매개변수: 없음
읽기 전용: false
browser_cookie_delete
제목: 쿠키 삭제
설명: 특정 쿠키를 삭제합니다.
매개변수:
name(string): 삭제할 쿠키 이름
읽기 전용: false
browser_cookie_get
제목: 쿠키 가져오기
설명: 이름으로 특정 쿠키를 가져옵니다.
매개변수:
name(string): 가져올 쿠키 이름
읽기 전용: true
browser_cookie_list
제목: 쿠키 나열
설명: 모든 쿠키를 나열합니다(선택적으로 도메인/경로로 필터링).
매개변수:
domain(string, 선택 사항): 도메인별로 쿠키 필터링path(string, 선택 사항): 경로별로 쿠키 필터링
읽기 전용: true
browser_cookie_set
제목: 쿠키 설정
설명: 선택적 플래그(domain, path, expires, httpOnly, secure, sameSite)와 함께 쿠키를 설정합니다.
매개변수:
name(string): 쿠키 이름value(string): 쿠키 값domain(string, 선택 사항): 쿠키 도메인path(string, 선택 사항): 쿠키 경로expires(number, 선택 사항): Unix 타임스탬프로 쿠키 만료httpOnly(boolean, 선택 사항): 쿠키가 HTTP 전용인지 여부secure(boolean, 선택 사항): 쿠키가 보안인지 여부sameSite(string, 선택 사항): 쿠키 SameSite 속성
읽기 전용: false
browser_localstorage_clear
제목: localStorage 지우기
설명: 모든 localStorage를 지웁니다.
매개변수: 없음
읽기 전용: false
browser_localstorage_delete
제목: localStorage 항목 삭제
설명: localStorage 항목을 삭제합니다.
매개변수:
key(string): 삭제할 키
읽기 전용: false
browser_localstorage_get
제목: localStorage 항목 가져오기
설명: 키로 localStorage 항목을 가져옵니다.
매개변수:
key(string): 가져올 키
읽기 전용: true
browser_localstorage_list
제목: localStorage 나열
설명: 모든 localStorage 키-값 쌍을 나열합니다.
매개변수: 없음
읽기 전용: true
browser_localstorage_set
제목: localStorage 항목 설정
설명: localStorage 항목을 설정합니다.
매개변수:
key(string): 설정할 키value(string): 설정할 값
읽기 전용: false
browser_sessionstorage_clear
제목: sessionStorage 지우기
설명: 모든 sessionStorage를 지웁니다.
매개변수: 없음
읽기 전용: false
browser_sessionstorage_delete
제목: sessionStorage 항목 삭제
설명: sessionStorage 항목을 삭제합니다.
매개변수:
key(string): 삭제할 키
읽기 전용: false
browser_sessionstorage_get
제목: sessionStorage 항목 가져오기
설명: 키로 sessionStorage 항목을 가져옵니다.
매개변수:
key(string): 가져올 키
읽기 전용: true
browser_sessionstorage_list
제목: sessionStorage 나열
설명: 모든 sessionStorage 키-값 쌍을 나열합니다.
매개변수: 없음
읽기 전용: true
browser_sessionstorage_set
제목: sessionStorage 항목 설정
설명: sessionStorage 항목을 설정합니다.
매개변수:
key(string): 설정할 키value(string): 설정할 값
읽기 전용: false
browser_set_storage_state
제목: 저장 상태 복원
설명: 파일에서 저장 상태(쿠키, 로컬 스토리지)를 복원합니다. 복원하기 전에 기존 쿠키와 로컬 스토리지를 지웁니다.
매개변수:
filename(string): 복원할 저장 상태 파일의 경로
읽기 전용: false
browser_storage_state
제목: 저장 상태 저장
설명: 저장 상태(쿠키, 로컬 스토리지)를 나중에 재사용하기 위해 파일에 저장합니다.
매개변수:
filename(string, 선택 사항): 저장 상태를 저장할 파일 이름. 지정하지 않으면 기본값은storage-state-{timestamp}.json입니다.
읽기 전용: true
browser_annotate
제목: 현재 페이지에 주석 달기
설명: 현재 페이지에 대해 주석 모드로 Playwright Dashboard를 열고 사용자가 주석을 그릴 때까지 기다립니다. 주석이 포함된 스크린샷, ARIA 스냅샷 및 주석 목록을 반환합니다.
매개변수: 없음
읽기 전용: true
browser_hide_highlight
제목: 요소 하이라이트 숨기기
설명: 이전에 요소에 추가된 하이라이트 오버레이를 제거합니다.
매개변수:
element(string, 선택 사항): 하이라이트를 추가할 때 사용된 사람이 읽을 수 있는 요소 설명; browser_highlight에 전달된 값과 일치해야 합니다.target(string, 선택 사항): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유 요소 선택자
읽기 전용: true
browser_highlight
제목: 요소 하이라이트
설명: 페이지의 요소 주위에 지속적인 하이라이트 오버레이를 표시합니다.
매개변수:
element(string, 선택 사항): 요소와 상호작용하기 위한 권한을 얻는 데 사용되는 사람이 읽을 수 있는 요소 설명target(string): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유 요소 선택자style(string, 선택 사항): 하이라이트 오버레이에 적용되는 추가 인라인 CSS (예: "outline: 2px dashed red").
읽기 전용: true
browser_resume
제목: 일시 중지된 스크립트 실행 재개
설명: 일시 중지된 스크립트 실행을 재개합니다. step이 true로 설정된 경우 다음 작업 전에 실행이 다시 일시 중지됩니다.
매개변수:
step(boolean, 선택 사항): true인 경우 다음 작업 전에 실행이 다시 일시 중지되어 단계별 디버깅이 가능합니다.location(string, 선택 사항): 특정 :에서 실행을 일시 중지합니다 (예: "example.spec.ts:42").
읽기 전용: false
browser_start_tracing
제목: 추적 시작
설명: 추적 기록 시작
매개변수: 없음
읽기 전용: true
browser_start_video
제목: 비디오 시작
설명: 비디오 기록 시작
매개변수:
filename(string, 선택 사항): 비디오를 저장할 파일 이름.size(object, 선택 사항): 비디오 크기
읽기 전용: true
browser_stop_tracing
제목: 추적 중지
설명: 추적 기록 중지
매개변수: 없음
읽기 전용: true
browser_stop_video
제목: 비디오 중지
설명: 비디오 기록 중지
매개변수: 없음
읽기 전용: true
browser_video_chapter
제목: 비디오 챕터
설명: 비디오 기록에 챕터 마커를 추가합니다. 흐릿한 배경의 전체 화면 챕터 카드를 표시합니다.
매개변수:
title(string): 챕터 제목description(string, 선택 사항): 챕터 설명duration(number, 선택 사항): 챕터 카드를 표시할 시간(밀리초)
읽기 전용: true
browser_video_hide_actions
제목: 작업 오버레이 숨기기
설명: 페이지에서 수행된 작업에 주석을 추가하는 것을 중지합니다.
매개변수: 없음
읽기 전용: true
browser_video_show_actions
제목: 작업 오버레이 표시
설명: 페이지에서 수행되는 후속 작업에 작업 이름을 지정하고 대상 요소를 강조 표시하는 콜아웃을 추가합니다. 비디오 녹화 또는 스크린캐스트 중에 유용합니다.
매개변수:
duration(number, 선택 사항): 각 작업 주석이 화면에 유지되는 시간(밀리초). 기본값은 500입니다.position(string, 선택 사항): 페이지를 기준으로 작업 제목을 배치할 위치. 기본값은 오른쪽 상단입니다.cursor(string, 선택 사항): 포인터 작업에 대한 커서 장식. "pointer"(기본값)는 이전 작업 지점에서 다음 작업 지점으로 마우스 포인터를 애니메이션합니다. "none"은 커서 장식을 비활성화합니다.
읽기 전용: true
browser_mouse_click_xy
제목: 클릭
설명: 주어진 위치에서 마우스 버튼 클릭
매개변수:
x(number): X 좌표y(number): Y 좌표button(string, 선택 사항): 클릭할 버튼, 기본값은 왼쪽clickCount(number, 선택 사항): 클릭 횟수, 기본값은 1delay(number, 선택 사항): 마우스 다운과 마우스 업 사이의 대기 시간(밀리초), 기본값은 0
읽기 전용: false
browser_mouse_down
제목: 마우스 누르기
설명: 마우스 버튼 누르기
매개변수:
button(string, 선택 사항): 누를 버튼, 기본값은 왼쪽
읽기 전용: false
browser_mouse_drag_xy
제목: 마우스 드래그
설명: 왼쪽 마우스 버튼을 주어진 위치로 드래그
매개변수:
startX(number): 시작 X 좌표startY(number): 시작 Y 좌표endX(number): 끝 X 좌표endY(number): 끝 Y 좌표
읽기 전용: false
browser_mouse_move_xy
제목: 마우스 이동
설명: 마우스를 주어진 위치로 이동
매개변수:
x(number): X 좌표y(number): Y 좌표
읽기 전용: false
browser_mouse_up
제목: 마우스 놓기
설명: 마우스 버튼 놓기
매개변수:
button(string, 선택 사항): 놓을 버튼, 기본값은 왼쪽
읽기 전용: false
browser_mouse_wheel
제목: 마우스 휠 스크롤
설명: 마우스 휠 스크롤
매개변수:
deltaX(number): X 델타deltaY(number): Y 델타
읽기 전용: false
browser_pdf_save
제목: PDF로 저장
설명: 페이지를 PDF로 저장
매개변수:
filename(string, 선택 사항): PDF를 저장할 파일 이름. 지정하지 않으면 기본값은page-{timestamp}.pdf입니다. 출력 디렉터리 내에 유지하려면 상대 파일 이름을 선호합니다.
읽기 전용: true
browser_generate_locator
제목: 요소에 대한 로케이터 생성
설명: 테스트에서 사용할 수 있도록 지정된 요소에 대한 로케이터를 생성합니다.
매개변수:
element(string, 선택 사항): 요소와 상호작용하기 위한 권한을 얻는 데 사용되는 사람이 읽을 수 있는 요소 설명target(string): 페이지 스냅샷의 정확한 대상 요소 참조 또는 고유 요소 선택자
읽기 전용: true
browser_verify_element_visible
제목: 요소 표시 확인
설명: 요소가 페이지에 표시되는지 확인합니다.
매개변수:
role(string): 요소의 역할(ROLE). 스냅샷에서 다음과 같이 찾을 수 있습니다:- {ROLE} "Accessible Name":accessibleName(string): 요소의 접근 가능한 이름(ACCESSIBLE_NAME). 스냅샷에서 다음과 같이 찾을 수 있습니다:- role "{ACCESSIBLE_NAME}"
읽기 전용: false
browser_verify_list_visible
제목: 목록 표시 확인
설명: 목록이 페이지에 표시되는지 확인합니다.
매개변수:
element(string): 사람이 읽을 수 있는 목록 설명target(string): 목록을 가리키는 정확한 대상 요소 참조items(array): 확인할 항목
읽기 전용: false
browser_verify_text_visible
제목: 텍스트 표시 확인
설명: 텍스트가 페이지에 표시되는지 확인합니다. 가능하면 browser_verify_element_visible을 선호합니다.
매개변수:
text(string): 확인할 텍스트(TEXT). 스냅샷에서 다음과 같이 찾을 수 있습니다:- role "Accessible Name": {TEXT}또는- text: {TEXT}
읽기 전용: false
browser_verify_value
제목: 값 확인
설명: 요소 값 확인
매개변수:
type(string): 요소 유형element(string): 사람이 읽을 수 있는 요소 설명target(string): 페이지 스냅샷의 정확한 대상 요소 참조value(string): 확인할 값. 체크박스의 경우 "true" 또는 "false"를 사용하세요.
읽기 전용: false
Available Tools
24 toolsbrowser_clickBDestructive
Perform click on a web page
| Name | Required | Description | Default |
|---|---|---|---|
| button | No | Button to click, defaults to left | |
| target | Yes | Exact target element reference from the page snapshot, or a unique element selector | |
| element | No | Human-readable element description used to obtain permission to interact with the element | |
| modifiers | No | Modifier keys to press | |
| doubleClick | No | Whether to perform a double click instead of a single click |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, indicating the tool mutates state and can be destructive. The description adds no further behavioral disclosure, such as possible navigation or permission requirements. It does not contradict annotations, but provides no value beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler. However, it is terse and omits useful context that could be added without bloat, such as the requirement for a snapshot target. It is appropriately sized but not front-loaded with any distinguishing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (5 parameters, no output schema), the description alone is minimally sufficient because the schema fully describes parameters. However, it lacks context about return values, when to use click vs other actions, and potential side effects. The schema covers parameter semantics, so a score of 3 is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with every parameter documented (e.g., target is 'Exact target element reference from the page snapshot, or a unique element selector'). The description itself adds no additional parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Perform click') and the resource ('web page'), which is specific enough. However, it does not differentiate from sibling interaction tools like browser_hover or browser_drag; the agent must infer that 'click' is a distinct action without additional context. It is unambiguous about the core operation but lacks detail on the target element requirement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites such as needing a page snapshot to obtain a valid target, nor does it contrast with browser_hover or browser_drag. An agent receives no context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_closeBDestructive
Close the page
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation already indicates destructiveHint=true, so the agent knows the action is destructive. The description simply repeats that by saying 'close' without adding any extra context about side effects (e.g., whether it closes just the current tab, loses unsaved state, or affects other tabs). It does not contradict the annotation, but it adds no new behavioral information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, using only three words. It communicates the essential action and target without any fluff, making it easy to parse and understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (no parameters, no output schema), the description is functional but lacks completeness. It leaves open the scope of 'close'—does it close the current page/tab, or the entire browser? In a context with sibling tools like browser_tabs, this ambiguity could be problematic. More detail would improve it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the schema coverage is trivially complete at 100%. The description does not need to explain any parameter semantics, and the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Close the page' clearly states the action (close) and the resource (page), making it unambiguous. It is distinct from sibling tools like browser_navigate or browser_snapshot, so an agent can easily identify it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention potential alternatives (e.g., using browser_tabs to manage multiple pages) or any conditions that would make closing appropriate. The context is minimal and leaves the decision entirely to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_console_messagesBRead-only
Returns all console messages
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Return all console messages since the beginning of the session, not just since the last navigation. Defaults to false. | |
| level | Yes | Level of the console messages to return. Each level includes the messages of more severe levels. Defaults to "info". | info |
| filename | No | Filename to save the console messages to. If not provided, messages are returned as text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint true and destructiveHint false, so the description adds no conflicting side-effect information. It does not elaborate on behavior such as saving to a file, but that is covered by parameter descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence with no redundancy, front-loading the verb and object.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with full schema coverage, the description is adequate, though it omits explicit use-case guidance and output format details beyond what the schema provides.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter descriptions, so the tool description itself does not add meaning beyond the schema, but no parameter meaning is missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb 'Returns' and identifies the resource 'console messages' with scope 'all', making the tool's purpose clear and distinct from sibling tools such as network request retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like browser_network_requests or browser_snapshot, nor does it mention filtering or filename-saving scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_dragADestructive
Perform drag and drop between two elements
| Name | Required | Description | Default |
|---|---|---|---|
| endTarget | Yes | Exact target element reference from the page snapshot, or a unique element selector | |
| endElement | No | Human-readable target element description used to obtain the permission to interact with the element | |
| startTarget | Yes | Exact target element reference from the page snapshot, or a unique element selector | |
| startElement | No | Human-readable source element description used to obtain the permission to interact with the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false, so the destructive nature is covered. The description adds no extra behavioral context such as side effects on the DOM or event firing, but it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the action and provides the core information without any irrelevant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple action with well-described parameters and no output schema, the description is mostly complete. It does not mention any return values or wait behavior, but the lack of output schema makes this acceptable. It could have added a note about the order of start and end parameters, but the parameter names and descriptions handle that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with all four parameters described. The tool description adds no additional parameter semantics beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (perform drag and drop) and the resource (between two elements), distinguishing it from sibling tools like browser_click, browser_hover, and browser_drop. It is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide any guidance on when to use this tool versus alternatives. It does not mention conditions such as needing to move an element or triggering drag-and-drop events, nor does it reference sibling tools like browser_drop or browser_click.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_dropADestructive
Drop files or MIME-typed data onto an element, as if dragged from outside the page. At least one of "paths" or "data" must be provided.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Data to drop, as a map of MIME type to string value (e.g. {"text/plain": "hello", "text/uri-list": "https://example.com"}). | |
| paths | No | Absolute paths to files to drop onto the element. | |
| target | Yes | Exact target element reference from the page snapshot, or a unique element selector | |
| element | No | Human-readable element description used to obtain permission to interact with the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey destructive and non-read-only behavior, so the description does not need to repeat that. The description adds useful semantic context about simulating an external drag, but does not disclose any side effects beyond the basic drop action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that concisely explains both the action and the key parameter requirement. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description, combined with the detailed schema and annotations, provides enough information to invoke the tool correctly. There is no output schema, so return-value details are not required, and the parameter permission explanation is handled by the 'element' field description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters have clear schema descriptions. The tool description adds an important cross-parameter constraint that at least one of 'paths' or 'data' must be provided, which is not otherwise expressed in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: dropping files or MIME-typed data onto an element. It uses a specific verb and resource, and distinguishes itself from in-page drag operations by specifying 'as if dragged from outside the page'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a useful usage constraint ('At least one of paths or data must be provided') and hints at external drag context, but it does not explicitly name sibling tools or state when to prefer this over browser_file_upload or browser_drag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_evaluateBDestructive
Evaluate JavaScript expression on page or element
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Exact target element reference from the page snapshot, or a unique element selector | |
| element | No | Human-readable element description used to obtain permission to interact with the element | |
| filename | No | Filename to save the result to. If not provided, result is returned as text. | |
| function | Yes | () => { /* code */ } or (element) => { /* code */ } when element is provided |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, so the agent knows this can modify state. The description adds minimal context beyond that—it mentions 'on page or element' but doesn't warn about the power of arbitrary JS execution or potential side effects. Since the annotation covers the destructive nature, the description's lack of extra detail keeps it at a baseline 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, clear sentence with no redundant words. The action is front-loaded and easy to parse. This is appropriately concise for a tool whose parameter details are already in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that this tool executes arbitrary JavaScript with destructive potential, the description is too sparse. It doesn't mention that the function can modify the page, that results can be saved to a file (though schema covers it), or that there is a separate unsafe variant (browser_run_code_unsafe) that might be more appropriate for certain tasks. The description lacks the context an agent needs to safely and correctly use this tool, especially when annotations already warn about destructiveness but the description provides no additional guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are documented in the schema itself. The description does not add any meaning beyond what the schema provides—it doesn't elaborate on the function syntax, target usage, or filename behavior. With high schema coverage, the baseline is 3, and the description contributes nothing extra.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Evaluate' and the resource 'JavaScript expression on page or element', making the core purpose obvious. However, it doesn't distinguish from the sibling browser_run_code_unsafe, which might also execute code, so it loses a point for not differentiating between similar tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like browser_run_code_unsafe or when to avoid it. No context about prerequisites (e.g., page must be loaded) or scenarios that favor this tool over others. The description simply states the action without any usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_file_uploadBDestructive
Upload one or multiple files
| Name | Required | Description | Default |
|---|---|---|---|
| paths | No | The absolute paths to the files to upload. Can be single file or multiple files. If omitted, file chooser is cancelled. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate destructive behavior and non-read-only semantics, so the description does not need to restate those. However, the description does not mention side effects beyond uploading, such as navigating away, opening or cancelling a file chooser, or potential overwrite behavior, though the parameter description partially covers the cancellation case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and free of filler. Every word contributes meaning, and the parameter description adds necessary details without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no output schema, the description and parameter comment cover the essential input and basic behavior. However, it does not describe what happens after the upload, what success or failure looks like, or how this fits into the broader browser automation workflow, leaving some practical context missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines an array of strings, but the parameter description adds important meaning: paths must be absolute, multiple files are allowed, and omitting the parameter cancels the file chooser. This goes beyond the raw schema and helps an agent use the parameter correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Upload') and the resource ('files'), and specifies 'one or multiple'. It does not explicitly state the destination or context, but the tool name and sibling set make the browser file-upload intent sufficiently clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as browser_drop or other browser interaction tools. It also does not mention prerequisites like whether the file chooser must already be open or how paths should be formatted beyond 'absolute'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_fill_formBDestructive
Fill multiple form fields
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | Fields to fill in |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=false and destructiveHint=true, so the write and potentially destructive nature is covered. The description adds the 'multiple form fields' detail but does not disclose additional behavior such as overwriting values or submitting the form.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence with no redundant words or boilerplate. It is appropriately short and easy to parse, though it sacrifices deeper context for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The rich schema fully documents the nested field objects, including target references, type-specific value behavior, and permission-related element descriptions. Combined with the read-only and destructive annotations, the description is sufficient for correct invocation; only alternative-selection guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the fields array and its nested target, name, type, value, and element properties all have descriptive text. The description itself does not add parameter-level meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Fill multiple form fields' clearly identifies the action and resource, and the word 'multiple' helps distinguish it from single-field tools like browser_type. It does not explicitly contrast with sibling tools, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided for when to use this tool instead of alternatives such as browser_type, browser_select_option, or browser_click. The term 'multiple' implies batch usage, but there is no explicit when-to-use or exclusion context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_findARead-only
Search the accessibility snapshot of the current page for text or a regular expression. Returns matching snapshot nodes with a few lines of surrounding context (like search snippets), each shown under its path from the root of the tree, which is cheaper than capturing the whole snapshot when you only need to locate an element and its ref.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Plain text to search for in the page snapshot (case-insensitive substring match). Provide either text or regex, not both. | |
| regex | No | Regular expression to search for in the page snapshot. Matching is case-sensitive by default; wrap the pattern in slashes to add flags, e.g. "/error/i" for case-insensitive. Provide either text or regex, not both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and non-destructive behavior. The description adds useful behavioral detail about return format, surrounding context, path-from-root presentation, and cost characteristics. It is consistent with the annotations, with no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense, well-structured sentence that front-loads the action and then provides the output shape and the key trade-off. There is no filler or redundancy; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains return shape and the main use case, and annotations cover safety. However, since neither parameter is marked required in the schema, the description could more explicitly instruct the agent to provide exactly one of text or regex.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; both text and regex are already documented with mutual exclusivity and regex flag syntax. The description adds no parameter-level meaning beyond restating that either text or regex is used, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search'), a clear resource ('the accessibility snapshot of the current page'), and a well-defined result (matching snapshot nodes with surrounding context and refs). It also distinguishes itself from the whole-snapshot sibling by explaining its narrower focus.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-to-use condition: this is 'cheaper than capturing the whole snapshot when you only need to locate an element and its ref.' It implicitly contrasts with browser_snapshot but does not explicitly name the sibling or state when NOT to use this tool, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_handle_dialogCDestructive
Handle a dialog
| Name | Required | Description | Default |
|---|---|---|---|
| accept | Yes | Whether to accept the dialog. | |
| promptText | No | The text of the prompt in case of a prompt dialog. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations indicate readOnlyHint=false and destructiveHint=true, covering the main safety aspect. However, the description adds no detail about side effects, such as submitting a form or canceling a prompt, beyond what the parameter names imply. It does not clearly disclose the consequences of accepting or rejecting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely short and lacks necessary detail, making it under-specified. It is terse but not informative enough to guide an agent effectively, similar to a placeholder like 'Process'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema or additional context is provided. The description does not explain what happens after handling the dialog, how the parameters interact, or any post-conditions. This is insufficient for an agent to fully understand the tool's behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for both 'accept' (boolean) and 'promptText' (string for prompt dialogs). The description does not add extra meaning, but the schema already provides adequate parameter semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Handle a dialog' identifies the action and resource but is vague. It does not specify the type of dialog (alert, confirm, prompt) or the precise effect, though the 'accept' parameter implies accept/dismiss. It is distinct from sibling tools, but the purpose is under-specified.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool, such as after a dialog appears or in contrast to other browser actions. The description gives no context for the appropriate situation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_hoverADestructive
Hover over element on page
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Exact target element reference from the page snapshot, or a unique element selector | |
| element | No | Human-readable element description used to obtain permission to interact with the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=true, so the description doesn't need to re-state them. The description adds no extra behavioral detail about side effects (e.g., triggering JavaScript events, potential menu changes). With annotations present, the bar is lower, but there's still room for more transparency about outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise—six words, no redundancy, and perfectly focused on the action. It follows a clear verb-object structure with no extra fluff, making it easy to parse and understand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple interaction tool, the description, alongside the parameter schema and annotations, is adequate. It lacks details on return values (but no output schema exists) and does not mention any prerequisites or setup. Given the simplicity, it covers essential context without being overlong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters (target and element) have descriptions in the schema, achieving 100% coverage. The tool description does not add further meaning beyond the schema; it simply restates the action. Since schema coverage is complete, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (hover) and the target (element on page). It distinguishes itself from sibling tools like click, drag, and type by specifying the hover action. However, it lacks detail about what the hover does (e.g., showing tooltips or hover menus), but the core purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use hover versus other interactions. While it's intuitive that hover is for mouse-over actions, the description doesn't mention edge cases or alternative tools (e.g., use click for activating, hover for previews). It provides minimal implicit usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_network_requestARead-only
Returns full details (headers and body) of a single network request, or a single part if part is set. Use the number from browser_network_requests.
| Name | Required | Description | Default |
|---|---|---|---|
| part | No | Return only this part of the request. Omit to return full details. | |
| index | Yes | 1-based index of the request, as printed by browser_network_requests. | |
| filename | No | Filename to save the result to. If not provided, output is returned as text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds that it returns headers and body and can filter to a part, but does not elaborate on output structure or edge cases. Given annotation coverage, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no redundant wording. The main purpose is front-loaded, the part option is explained, and the source of the index is given. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only retrieval tool with full schema coverage and annotations, the description is sufficient. It explains the return type (full details or part) and the index source. It lacks explicit output format details, but the enum values for 'part' are self-explanatory.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all parameters, so the schema already documents them. The description adds critical value by explaining that 'index' comes from browser_network_requests, which is not in the schema, enhancing clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns full details of a single network request, with an optional 'part' parameter to narrow down. It distinguishes from the sibling tool browser_network_requests by referencing its index, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The instruction 'Use the number from browser_network_requests' explicitly guides when to use this tool—after obtaining a listing. It does not explicitly mention alternatives or exclusions, but the context is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_network_requestsARead-only
Returns a numbered list of network requests since loading the page. Use browser_network_request with the number to get full details.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Only return requests whose URL matches this regexp (e.g. "/api/.*user"). | |
| static | Yes | Whether to include successful static resources like images, fonts, scripts, etc. Defaults to false. | |
| filename | No | Filename to save the network requests to. If not provided, requests are returned as text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds valuable context about the temporal scope ('since loading the page') and the numbered list format, which goes beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no redundancy. The primary action is front-loaded, and the companion tool reference is placed efficiently at the end. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description tells the agent what the tool returns (a numbered list) and how to proceed for details. Since there is no output schema, this is essential. It does not describe potential error cases or edge scenarios, but for a read-only list tool with strong schema coverage, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters have schema descriptions covering 100% of the input schema. The tool description does not add any additional meaning to the parameters themselves, so the baseline of 3 applies; it neither enhances nor detracts from what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns a numbered list of network requests since page load, and explicitly differentiates from the sibling tool browser_network_request by instructing to use that tool for details. This is a specific verb+resource with a clear scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit usage pattern: first call this tool to get a list, then use browser_network_request with the number for full details. This is clear guidance on when to use it versus its companion, though it does not mention any other alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_press_keyBDestructive
Press a key on the keyboard
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Name of the key to press or a character to generate, such as `ArrowLeft` or `a` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not mention any side effects, such as triggering keyboard events or potential destructive behavior. The annotations indicate destructiveHint: true, but the description adds no additional behavioral context beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise — a single sentence that directly conveys the action. No unnecessary information or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple action with a single well-defined parameter, the description is adequate. It lacks mention of when to use this tool (e.g., for shortcuts or navigation keys) but is otherwise complete for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The parameter 'key' is fully described in the schema with examples, and schema coverage is 100%. The description adds minimal extra meaning ('on the keyboard') but doesn't clarify key formats or special keys, which is already covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (press) and the resource (key on the keyboard). It is distinct from broader actions like navigate or click, though it does not explicitly differentiate from browser_type (typing) or browser_click (clicking).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus its siblings (e.g., browser_type for text entry or browser_click for mouse actions). The description lacks any contextual cues for choosing this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_resizeBDestructive
Resize the browser window
| Name | Required | Description | Default |
|---|---|---|---|
| width | Yes | Width of the browser window | |
| height | Yes | Height of the browser window |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not disclose any behavioral traits beyond the bare action. Annotations already indicate it is not read-only and is destructive, but the description adds no extra context about side effects like layout reflows or potential viewport changes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, short declarative sentence with no unnecessary words. It is perfectly concise and well-structured for the simple action it describes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool, the description is adequate, but it lacks any extra context such as units (e.g., pixels), constraints, or when resizing might be appropriate. Given the simplicity and schema coverage, it is minimally complete but not rich.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for both parameters (width and height), achieving 100% coverage. The description adds no additional meaning about the parameters, so it stays at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (resize) and the resource (browser window), making it distinct from sibling tools like navigate or click. However, it lacks any nuance about whether it resizes the viewport or the entire window, but the core purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives. It does not mention scenarios like adjusting viewport for responsive testing or any conditions that would make it preferable to other navigation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_run_code_unsafeADestructive
Run a Playwright code snippet. Unsafe: executes arbitrary JavaScript in the Playwright server process and is RCE-equivalent.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | A JavaScript function containing Playwright code to execute. It will be invoked with a single argument, page, which you can use for any page interaction. For example: `async (page) => { await page.getByRole('button', { name: 'Submit' }).click(); return await page.title(); }` | |
| filename | No | Load code from the specified file. If both code and filename are provided, code will be ignored. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the description's 'Unsafe: executes arbitrary JavaScript in the Playwright server process and is RCE-equivalent' adds specific severity and mechanism beyond the generic flags. This enhances transparency without contradicting annotations, though it could also mention side effects or sandboxing if any.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that packs purpose and a crucial warning. It front-loads the action and immediately follows with the risk, maximizing information density with zero filler. Excellent structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (arbitrary code execution) and the lack of an output schema, the description does not mention the return value or error behavior. The example in the code parameter shows a return, but that's in the schema. For an advanced tool, this is a notable gap, but the core purpose and danger are clear. A 3 reflects the missing return semantics and operational details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters with detailed descriptions, including the precedence rule for code vs filename. The tool description adds no additional parameter meaning beyond the schema, so a baseline of 3 is appropriate. The schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Run a Playwright code snippet.' It specifies the resource (Playwright code) and immediately flags the critical distinction from siblings with 'Unsafe: executes arbitrary JavaScript ... RCE-equivalent.' This unambiguous verb+resource plus the danger label leaves no ambiguity about what the tool does and separates it from all other browser tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a strong warning about safety ('Unsafe', 'RCE-equivalent') but does not explicitly state when to use it versus alternatives. It implies it's for advanced custom logic, but there is no direct 'use this only if...' or mention of safer alternatives. The warning serves as a caution but not a full usage guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_select_optionBDestructive
Select an option in a dropdown
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Exact target element reference from the page snapshot, or a unique element selector | |
| values | Yes | Array of values to select in the dropdown. This can be a single value or multiple values. | |
| element | No | Human-readable element description used to obtain permission to interact with the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive=true, so the description does not contradict that. But the description adds no further behavioral detail (e.g., side effects on the page). With annotations present, the bar is lower, and the description is neutral.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no redundant words. It is well-structured and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the schema covers all parameters. The description is short but sufficient for a basic understanding. It does not specify whether values are labels or values, but that is a minor omission given the context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions for target and values. The tool description itself does not explain parameters beyond what the schema already provides, so it adds no extra semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (select) and the target (option in a dropdown), distinguishing it from more general actions like click or type. However, it does not explicitly contrast with sibling tools, so it misses a bit of distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention when selecting is appropriate or when other actions (e.g., click, type) might be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_snapshotBRead-only
Capture accessibility snapshot of the current page, this is better than screenshot
| Name | Required | Description | Default |
|---|---|---|---|
| boxes | No | Include each element's bounding box as [box=x,y,width,height] in the snapshot. Coordinates are viewport-relative, in CSS pixels (Element.getBoundingClientRect) | |
| depth | No | Limit the depth of the snapshot tree | |
| target | No | Exact target element reference from the page snapshot, or a unique element selector | |
| filename | No | Save snapshot to markdown file instead of returning it in the response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds 'capture' but no further behavioral detail beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence. The phrase 'this is better than screenshot' adds some comparative value but could be considered slightly extraneous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and the description does not explain what format the snapshot takes, how parameters like depth or target affect the result, or what kind of accessibility information is included. This leaves important context missing for an agent deciding whether and how to call the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 4 parameters with descriptions, so the baseline is 3. The description does not add any additional parameter meaning or usage notes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear action ('capture') and object ('accessibility snapshot of the current page'), and distinguishes itself from screenshot with a comparative remark, though 'better than screenshot' is somewhat vague.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives minimal guidance by saying 'better than screenshot', but does not explicitly state when to use this tool over alternatives like browser_evaluate or browser_console_messages, nor when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_tabsADestructive
List, create, close, or select a browser tab.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to navigate to in the new tab, used for new. | |
| index | No | Tab index, used for close/select. If omitted for close, current tab is closed. | |
| action | Yes | Operation to perform |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. However, the description adds no behavioral context beyond what the schema provides (e.g., index omission for close closes current tab is in schema). No mention of side effects like tab switching or browser-level changes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently lists all supported actions. It is front-loaded with verbs and avoids unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has multiple actions and a required action parameter. The description lists the actions but does not explain action-specific requirements (e.g., URL required for new, index for close/select) or edge cases like closing the last tab. Given the schema covers parameter details, the description is adequate but not rich. With no output schema, the agent must infer return values from the action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with each parameter having a description (url, index, action with enum). The tool description adds no parameter-level detail, so it does not go beyond schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verbs (list, create, close, select) and a specific resource (browser tab). It distinguishes from siblings like browser_close (closes the entire browser) and browser_navigate (navigates current tab) by focusing on tab operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the list of actions but provides no explicit when-to-use guidance or exclusions. Given siblings like browser_close (closes the entire browser) and browser_navigate (navigates current tab), an agent might benefit from explicit differentiation, but the actions themselves are clear enough that usage is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_take_screenshotARead-only
Take a screenshot of the current page. You can't perform actions based on the screenshot, use browser_snapshot for actions.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Image format for the screenshot. If unset, inferred from the filename extension, otherwise png. | |
| scale | Yes | Image resolution scale. "css" produces a screenshot sized in CSS pixels (smaller, consistent across devices). "device" produces a high-resolution screenshot using device pixels (larger, accounts for the device pixel ratio). Default is css. | css |
| target | No | Exact target element reference from the page snapshot, or a unique element selector | |
| element | No | Human-readable element description used to obtain permission to interact with the element | |
| filename | No | File name to save the screenshot to. Defaults to `page-{timestamp}.{png|jpeg|webp}` if not specified. Prefer relative file names to stay within the output directory. | |
| fullPage | No | When true, takes a screenshot of the full scrollable page, instead of the currently visible viewport. Cannot be used with element screenshots. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds a key behavioral trait: the output is not interactive ('You can't perform actions based on the screenshot'), which is not captured by annotations. This adds meaningful context about the tool's limitations beyond the structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no redundant phrasing. The core purpose is stated first, followed by a critical limitation and alternative, maximizing informativeness per word.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only screenshot tool with comprehensive schema documentation and safety annotations, the description covers the essential decision points: when to use it and when not to. It doesn't explain return formats or error handling, but those are less critical given the tool's simplicity and the annotations' coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with detailed descriptions for all 6 parameters. The description adds no parameter-specific information, and the baseline of 3 is appropriate since the schema fully documents parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Take') and resource ('screenshot of the current page'). Explicitly distinguishes from browser_snapshot by stating what it is not for ('You can't perform actions based on the screenshot'), making it clear which tool to use for captures vs. interactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-not-to-use guidance: 'You can't perform actions based on the screenshot' and directs to the alternative 'use browser_snapshot for actions'. This clearly routes an agent to the correct tool for interactive needs while implying this tool is for visual captures.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_typeBDestructive
Type text into editable element
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to type into the element | |
| slowly | No | Whether to type one character at a time. Useful for triggering key handlers in the page. By default entire text is filled in at once. | |
| submit | No | Whether to submit entered text (press Enter after) | |
| target | Yes | Exact target element reference from the page snapshot, or a unique element selector | |
| element | No | Human-readable element description used to obtain permission to interact with the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation destructiveHint=true and readOnlyHint=false already signal that this tool can modify state, so the description does not contradict that. However, the main description adds no additional behavioral context beyond the annotations, such as whether typing overwrites existing content or triggers page events. The parameter descriptions do mention key-handler triggering and Enter submission, but the main description itself stays shallow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no filler or repetition. It front-loads the verb and object, making the tool's primary purpose immediately obvious.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with several closely related siblings (fill_form, press_key, click), the description is too thin to fully orient an agent. It lacks any mention of when typing is appropriate, how the target is resolved, or what side effects to expect, so the agent must rely on parameter descriptions and external context to make a confident choice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 because the input schema already documents all five parameters. The main description, 'Type text into editable element,' adds no meaning beyond the schema's parameter descriptions, which already define text, slowly, submit, target, and element clearly enough.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Type text') and a clear target ('editable element'), which distinguishes it from many sibling tools at a high level. It is slightly vague about whether 'editable element' includes textareas, contenteditable regions, or only input fields, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to prefer this tool over sibling tools such as browser_fill_form or browser_press_key. It does not mention exclusions, prerequisites, or scenarios where typing would be inappropriate, leaving the agent to infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_wait_forARead-only
Wait for text to appear or disappear or a specified time to pass
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | The text to wait for | |
| time | No | The time to wait in seconds | |
| textGone | No | The text to wait for to disappear |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral detail beyond the readOnlyHint by explaining that it waits for text appearance/disappearance or a time delay. However, it does not specify what happens if multiple parameters are provided or if none are provided, so behavior is not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the core action and conditions. It contains no unnecessary words and is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple wait tool with no output schema, the description covers the main use cases, but it omits edge cases such as default behavior when no parameters are supplied, timeout behavior, or error conditions. These gaps make it only partially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema descriptions already cover each parameter individually, and the tool description mostly restates them. It does not clarify the relationship between text, textGone, and time (e.g., whether they are mutually exclusive or combinable), so minimal semantic value is added beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool waits for a condition: text to appear, text to disappear, or a specified time to pass. This distinguishes it from sibling tools like click, navigate, or type, and its purpose is immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when waiting for page state or a delay), but it does not explicitly state when to prefer this over alternatives or how to choose among text, textGone, and time parameters. It provides functional guidance but lacks explicit usage conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
24 tool updates
v0.0.79- First observed
browser_click - First observed
browser_close - First observed
browser_console_messages - First observed
browser_drag - First observed
browser_drop - First observed
browser_evaluate - First observed
browser_file_upload - First observed
browser_fill_form - First observed
browser_find - First observed
browser_handle_dialog - First observed
browser_hover - First observed
browser_navigate - First observed
browser_navigate_back - First observed
browser_network_request - First observed
browser_network_requests - First observed
browser_press_key - First observed
browser_resize - First observed
browser_run_code_unsafe - First observed
browser_select_option - First observed
browser_snapshot - First observed
browser_tabs - First observed
browser_take_screenshot - First observed
browser_type - First observed
browser_wait_for
TDQS
Scored across 24 tools
Each tool has a clearly distinct purpose, covering actions like navigation, clicking, typing, screenshots, network requests, file upload, and dialog handling. Even similar tools like browser_snapshot and browser_take_screenshot are differentiated by their intended use (actions vs. visual capture).
All tools share the 'browser_' prefix, and most follow a verb_noun or verb pattern (e.g., browser_click, browser_fill_form). However, a few are noun-based (e.g., browser_network_requests, browser_tabs) which breaks the verb-first convention slightly, but the overall pattern remains predictable.
With 24 tools, the set is extensive but well-scoped for a full browser automation server. Each tool addresses a specific operation, and the count is appropriate for the domain, though it borders on the heavier side.
The toolset covers core browser automation workflows: navigation, clicks, forms, network, screenshots, accessibility, dialogs, file upload, and tabs. Minor gaps exist (e.g., no direct tool for scrolling or getting current URL), but these do not significantly hinder common agent tasks.
Maintenance
Related MCP Connectors
E2LLM gives your AI eyes and hands in a real browser: structured perception (SiFR) plus action.
Official Browserless MCP server: browser automation, scraping, screenshots and PDFs for AI agents.
Control a real browser from AI agents: navigate, click, type, screenshot, read the page.
Hosted browser for AI agents: screenshots, post-JS DOM, console, WCAG. No install, no API key.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots, providing browser automation capabilities without requiring screenshots or visually-tuned models.7Apache 2.0
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots, providing browser automation capabilities without requiring screenshots or visually tuned models.717,220 npmApache 2.0
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that provides browser automation capabilities by allowing LLMs to interact with web pages through structured accessibility snapshots. It enables fast, lightweight interaction with web content without the need for vision-tuned models or visual processing.Apache 2.0
- AlicenseAqualityCmaintenanceMCP server for browser automation that lets LLMs interact with web pages through structured accessibility snapshots, bypassing the need for screenshots.233,465,430 npmApache 2.0