이 페이지는 영어 문서의 번역입니다. 명령, 식별자, 예제는 그대로입니다. 런타임 7.24.4 · SDK 2.6.7. 영어 원문
WebMCP 브라우저 브리지
상태: 실험적 범위: 공개, 현재 상태 최종 검토: 2026-10-10 담당: AX Code 유지관리자
WebMCP 브리지는 에이전트가 격리된 Chrome 창에서 페이지를 열고, 읽고, 선택적으로 그 페이지에서 동작하게 합니다. 실험적이며 기본값은 꺼져 있고, Chrome 150 이상이 필요합니다.
WebMCP은 제안된 웹 표준입니다. 페이지는 이름, 설명, 입력 스키마로 이루어진 구조화된 도구를 등록할 수 있어, 에이전트가 그 동작을 직접 호출할 수 있습니다. AX Code는 페이지가 등록한 도구를 소비하며, 페이지 자체를 읽고 동작할 수도 있습니다.
Codex와 ChatGPT Work는 같은 표준을 내장 브라우저에서 구현한 내용을 사이트 도구로 문서화합니다. 그 페이지는 데스크톱 앱이 WebMCP를 켜는 방법, 방문자가 사이트가 제공하는 도구를 살펴보는 방법, 사이트 작성자가 도구를 등록하는 방법을 보여 줍니다. 아래 단계는 AX Code의 절차입니다.
Chrome으로 켜기
- Google Chrome 150 이상을 설치합니다. 같은 메이저 버전의 Chromium도 동작합니다. AX Code는 새 프로필로 자체 Chrome 창을 시작하고, 이미 열려 있는 Chrome 창은 그대로 둡니다.
ax-code로 터미널 UI를 시작합니다.- 사이드바 바닥글의 WebMCP 칩, 또는 홈 프롬프트 바닥글의 같은 칩을 클릭하거나
/webmcp을 실행합니다. 클릭이나 명령이 동의입니다. 그 전에는 브라우저가 시작되지 않습니다. AX Code는 브라우저를 시작하지 않은 채, 보통 위치에 Chrome 150 이상이 설치되어 있는지 먼저 확인하고 없으면 경고합니다. 이 확인은 조언이며 시도를 막지 않습니다. 선택은 사용자 구성에 저장되므로, 다음 시작에서 다시 클릭하지 않아도 브리지가 켜집니다. - AX Code는 WebMCP 기능을 켠 상태(
--enable-features=WebMCP)로 그 격리 창을 엽니다. 직접 로그인하기 전까지 창에는 로그인이 없습니다. - 에이전트에게 페이지를 열라고 요청합니다. 제품 기본값에서는 탐색이 제한되지 않습니다. 구성되거나 관리되는 오리진 목록이 있으면 범위가 좁아집니다.
- 칩을 다시 클릭하면 브리지가 꺼집니다. 임시 세션 부여는 끝나며, 저장한 승인은 MCP 설정에서 철회할 때까지 남습니다.
상호작용 단계가 켜져 있는 동안 칩은 [act]을 표시합니다. 제품 기본값에는 그 단계가 포함됩니다. 끄려면 interact를 항목의 webmcp 프로필에서 false로 설정합니다. 이전에 저장한 항목은 그때의 단계를 유지합니다.
ax-code mcp webmcp은 구성 조각을 출력합니다. 패키지를 설치하거나, 서버에 연결하거나, 파일을 쓰지 않습니다. --interact을 더하면 상호작용 단계가 켜진 항목을 출력하고, --executable-path /absolute/path/to/chrome을 더하면 특정 Chrome 150 이상 바이너리를 이름 붙입니다. 그 경로가 설정되면 AX Code는 시작 전에 바이너리의 메이저 버전을 확인합니다.
직접 연 Chrome 창의 도구
위의 격리 창에는 이미 WebMCP가 켜져 있습니다. 사이트를 만드는 동안 쓰는 Chrome 프로필에서 페이지 도구를 시험하려면 Chrome의 WebMCP 안내를 따릅니다.
chrome://flags/#enable-webmcp-testing를 엽니다.- 플래그를 Enabled로 설정합니다.
- Chrome을 다시 시작합니다.
그 플래그는 연 Chrome 프로필에 적용됩니다. AX Code 브리지는 여전히 칩에서 시작합니다.
프롬프트 힌트
브리지가 꺼져 있을 때 URL이나 로컬 서버를 가리키는 프롬프트(예: localhost:3000)는 칩과 /webmcp을 가리키는 한 줄을 보여 줍니다. 세션당 최대 한 번, 전체로 세 번만 나타나며, 에이전트에 보내는 내용은 바꾸지 않습니다.
에이전트가 할 수 있는 일
| 단계 | 도구 | 승인 |
|---|---|---|
| 페이지 | 페이지 나열, 열기, 이동, 닫기. 페이지가 WebMCP로 등록한 도구 실행 | 지원되는 범위가 저장되지 않았다면 호출마다 |
| 읽기 | 페이지 스냅샷, 스크린샷, 콘솔, 요청 메타데이터 | 세션마다 오리진당 부여 하나, 또는 저장된 읽기 승인 |
| 상호작용 | 클릭, 호버, 대기, 채우기, 양식 채우기, 키 입력, 대화상자 응답 | 아래를 참고 |
페이지 내용은 신뢰할 수 없습니다. 페이지가 에이전트를 유도하려 할 수 있습니다. 출력에는 오리진이 표시되고 크기가 제한됩니다.
승인 저장
대상이 되는 프롬프트는 빨간 배경의 WebMCP 허용 목록에 추가를 제공합니다. 선택하고 범위를 검토한 다음 추가하고 허용을 고릅니다. 저장된 승인은 이 머신의 이 프로젝트에 적용되며, 브라우저 재연결과 AX Code 재시작 뒤에도 남습니다.
- 페이지 나열은 AX Code 브라우저에 대해
list_pages를 승인하며, 열린 모든 오리진의 제목과 URL을 포함합니다. 페이지 내용은 승인하지 않습니다. - 탐색은 정확히 하나의 오리진을 열거나 그곳으로 이동하는 것을 승인합니다.
- 읽기는 정확히 하나의 오리진에서 스냅샷, 스크린샷, 콘솔, 네트워크 메타데이터를 승인합니다. 다른 오리진과 포트는 각자의 승인이 필요합니다.
- 닫기는 현재 정확히 하나의 오리진에 있는 페이지를 닫는 것을 승인하며, 저장하지 않은 작업이 있는 페이지도 포함합니다. 별도의 선택입니다. 탐색 승인과 읽기 승인은 닫기를 부여하지 않습니다. 대상 오리진은 닫기 전에 다시 확인됩니다.
첫 읽기 승인 뒤 AX Code는 페이지를 다시 확인한 다음 같은 호출에서 그 읽기를 계속합니다. 페이지나 브리지가 바뀌면 호출이 멈추고 새 읽기가 필요합니다. 실패한 브라우저 작업을 다시 재생하지는 않습니다.
탐색 제한과 관리자 정책은 계속 적용됩니다. 승인을 저장해도 allowedOrigins은 편집되지 않습니다. 입력, 중대한 클릭, 대화상자, 페이지가 등록한 도구는 기존 승인을 유지합니다. 한 번 허용은 임시로 남으며, 카운트다운은 지속 승인을 저장하지 않습니다.
WebMCP 칩 옆의 WebMCP 허용 목록 링크(세션 사이드바 바닥글과 홈 프롬프트 바닥글)를 선택하거나, /webmcp-allowlist를 실행하거나, /mcp를 열고 브리지를 선택한 뒤 Ctrl+G를 누릅니다. 항목을 두 번 클릭하거나 Enter를 두 번 눌러 철회합니다. 첫 활성화는 행을 표시하고, 몇 초 안의 두 번째 활성화가 확인하므로 한 번의 클릭으로는 철회되지 않습니다. 지우기 행은 같은 방식으로 이 프로젝트에서 그 브리지의 저장된 승인을 모두 철회합니다. 긴 목록은 스크롤됩니다. Escape를 누르거나 패널 밖을 클릭하면 닫힙니다.
검색 상자도 승인을 추가합니다. 정확한 https:// 오리진(또는 http://localhost)을 입력한 다음 탐색, 읽기, 닫기 행을 선택해 저장합니다. 페이지 나열 행은 저장되기 전까지 제공됩니다. 브리지는 연결되어 있어야 합니다. 명시적 승인은 실행 중인 브리지 ID에 묶이며, 프롬프트에서 저장한 승인과 똑같이 매 호출에서 확인되므로, 관리되는 오리진 목록, 읽기 단계 스위치, 관리자 정책이 계속 적용됩니다. WebMCP 칩을 끄면 브라우저 연결이 끊기고 저장된 선택은 유지됩니다.
로컬 저장소의 기본값은 ~/.local/share/ax-code/webmcp-approvals.json입니다(XDG 데이터 디렉터리 재정의가 적용됩니다). 승인은 브리지 ID에 묶입니다. 시작 방식이나 브라우저 프로필을 바꾸면 새 승인이 필요합니다.
탐색 실패
페이지가 열리거나 바뀐 뒤 탐색 오류가 날 수 있습니다. 오류는 가능할 때 인식된 시간 초과, 네트워크, 페이지 없음 범주를 보고하며, 원시 브리지 오류 텍스트는 되풀이하지 않습니다. 다시 이동할지 결정하기 전에 list_pages를 살펴봅니다. 탐색 오류는 저장된 승인을 제거하지 않습니다.
상호작용 단계
호버와 보통 클릭은 오리진당 부여 하나 아래에서 동작하며, 20회까지 유효하고 그다음 같은 프롬프트가 돌아옵니다.
- 입력, 키 누름, 대화상자, 링크, 더블 클릭, 이름이 중대하게 들리는 클릭(제출, 결제, 삭제, 권한 부여 등)은 매번 묻으며, 대상과 전체 값을 보여 줍니다.
- 이름이 자격 증명처럼 보이는 필드는 표시되고 가려집니다. API 키나 개인 키 형태인 값은 거부됩니다. 자격 증명은 직접 입력합니다.
- 동작에는 같은 페이지의 새 스냅샷이 필요합니다. 이동한 페이지나 알 수 없는 요소는 거부됩니다. 한 턴에서 거부가 세 번이면 이후 동작이 멈춥니다.
이름 기반 확인은 휴리스틱이며 보장이 아닙니다. 통제는 프롬프트이므로 읽어 봅니다.
기존 페이지와 작업
AX Code에 페이지의 능력을 살펴보거나, 네이티브 도구를 개발하거나, 특정 동작을 진단하라고 요청합니다. browser_workflow 도구는 보통의 관찰을 위해 테스트 서버를 시작하지 않아도 이 작업을 묶습니다. 먼저 브리지를 켜고 의도한 페이지를 식별합니다. 이 동작들은 페이지를 열거나, 로그인하거나, 브라우저 프로필을 바꾸거나, 이후 작업을 예약하지 않습니다.
예: “로컬 앱의 도구를 살펴보고 어떤 애플리케이션 함수에 대응하는지 보여 주세요”, 또는 “빈 결과를 재현하기 전에 이 페이지를 캡처한 다음 오류를 비교하고 후보 소스 파일을 알려 주세요.”
네이티브 도구와 소스 살펴보기
status을 server, pageId, 정확한 origin와 함께 호출하면 실제로 허용된 도구와 네이티브/스냅샷 가용성을 봅니다. 빈 목록은 접근할 수 없는 프레임에 도구가 없다고 확정하지 않습니다. 페이지 컨텍스트가 필요 없는 작업에는 기존 커넥터가 더 적합할 수 있습니다.
{
"action": "inventory",
"server": "webmcp",
"pageId": 1,
"origin": "http://localhost:3000",
"sourceFiles": ["src/tools.ts", "public/search.html"]
}
반환된 inventoryId를 보관합니다. 이후 인벤토리 호출에서 baselineId으로 전달하면 추가되거나 제거된 도구와 바뀐 스키마 필드를 봅니다. 파일은 명시적으로 권한이 확인되고, 저장소 안에 있으며, 범위가 제한됩니다. 정적 명령형 등록과 인용된 HTML 양식 속성은 소스 후보를 만듭니다. 계산된 이름, 중복 정의, 지원되지 않는 템플릿은 미해결이거나 모호합니다. 이름과 스키마가 맞으면 후보를 뒷받침하지만, 브라우저가 그 소스 리비전을 로드했다는 증명은 아닙니다.
애플리케이션 통합 생성
검토할 수 있는 통합 코드를 받으려면 author을 사용합니다.
{
"action": "author",
"name": "find_products",
"description": "Find products matching a query in the current catalog.",
"module": "./src/catalog.js",
"exportName": "findProducts",
"schema": {
"type": "object",
"properties": { "query": { "type": "string" } },
"required": ["query"]
},
"format": "imperative",
"effect": "read"
}
이름 붙인 함수는 직접 export여야 합니다. 생성된 등록은 컴포넌트와 라우트 정리를 위해 AbortSignal을 받습니다. acceptsSignal: true은 애플리케이션 함수가 두 번째 {signal} 인자를 받고 그것을 지킬 때만 설정합니다. format: "declarative"은 사람이 제출할 양식과 모듈 바인딩을 반환합니다. 그 webmcp-result 이벤트를 애플리케이션 UI에 연결합니다. 원시 필드는 지원됩니다. 지원되지 않는 스키마 제약은 조용히 버리지 않고 거부됩니다. 어느 템플릿이든 적용하기 전에 애플리케이션 검증, 권한 부여, 실제 효과를 검토합니다. 양식이 사람 제출을 요구해도 필드 편집이 자동 저장을 유발할 수 있습니다.
실행과 모델 선택을 따로 확인
기존 contract 단계는 고정 입력과 기대 결과를 검증합니다. 라우트나 역할이 바뀐 뒤 {"action":"tool_presence","name":"admin_reset","present":false}을 추가하면, 사용할 수 없는 연산이 등록 해제되었는지 확인합니다. present: true는 descriptorHash를 고정할 수도 있습니다. 이들은 수명 주기 확인점이며 이벤트 추적이 아닙니다. 내보낸 회귀에도 같은 확인이 포함됩니다.
모델이 올바른 도구와 인자를 고르는지 알아보려면 별도의 선택 평가를 사용합니다.
{
"action": "selection_eval",
"inventoryId": "<returned inventory UUID>",
"cases": [
{ "task": "Find AX products", "expected": { "name": "find_products", "arguments": { "query": "AX" } } },
{ "task": "Delete every product", "expected": { "name": null, "arguments": {} } }
],
"repeats": 2
}
선택된 API 모델은 작업과 캡처된 카탈로그만 받으며, 실행 도구와 기대 답은 없습니다. 호출은 승인되고 12건, 반복 세 번, 평가 기한 2분으로 제한됩니다. 보고서는 모델 ID, 스위트 해시, 정확한 선택 개수와 인자 개수를 따로, 공동 정확도, 알 수 없는 결과를 기록합니다. 실패는 분모에 남습니다. CLI 모델은 자체 도구를 실행할 수 있어 이 평가에 쓸 수 없습니다. 선택 점수는 도구 정확성을 증명하거나 Arena 자격을 주지 않습니다.
동작 전후 진단
observe을 호출합니다. 인자는 같은 페이지 대상, 선택적 sourceFiles, 그리고 기존 role/name과 count/value/checked/disabled 스키마를 쓰는 명시적 assertions입니다. 요청한 동작을 승인된 도구나 손으로 한 번 수행합니다. 그다음 {"action":"diagnose","observationId":"<returned UUID>"}를 호출합니다. 결과가 어서션 결과, 스냅샷 해시, 제한된 콘솔과 요청 메타데이터 델타, 의미 인벤토리 변화, 소스 후보를 비교합니다. 상관은 조사할 증거이며 증명된 근본 원인이 아닙니다. 어서션이 없으면 상태는 observed이며 pass이 아닙니다.
기준선은 현재 런타임 세션에만 보관되고, 30분 뒤 만료되며, 세션당 16개로 제한됩니다. 연결이나 페이지 위치가 바뀌면 재사용이 무효가 됩니다. 고정된 브리지는 같은 URL의 새로고침을 식별할 수 없으므로 이 비교는 조언으로 남습니다. 페이지 위치와 스냅샷의 해시만 유지됩니다. 제한된 진단 텍스트와 도구 설명자는 신뢰할 수 없는 증거입니다.
재현 가능한 localhost 문제에는 promote가 관찰 ID와 명시적 일반 manifest을 받습니다. 그 내용에는 로컬 테스트 서버 명령과 단계가 들어 있습니다. 새 통제 시나리오를 고정합니다. 관찰 결과는 수용으로 복사되지 않습니다. 편집 전에 실패하는 통제를 실행하고, 기존 워크플로를 통해 수정된 실행을 자격 부여합니다.
매일의 관찰 작업 반복
요청 시 레시피는 탐색이나 예약 없이 기존 페이지를 확인합니다.
{
"action": "recipe",
"server": "webmcp",
"pageId": 1,
"definition": {
"version": 1,
"name": "Preview health",
"origin": "http://localhost:3000",
"assertions": [{ "locator": { "role": "status", "name": "Ready" }, "property": "count", "equals": 1 }]
}
}
기본값은 스냅샷뿐입니다. 선택적 queries에는 정확한 도구 name, descriptorHash, 객체 input, resultPath, equals가 들어 있습니다. 이들은 기존 호출별 승인 아래에서 실제 애플리케이션 도구를 호출합니다. 읽기 전용 힌트는 효과를 인증하지 않습니다. 결과는 스냅샷 관찰과, 효과가 검증되지 않은 애플리케이션 호출을 명시적으로 구분하고, 질의 뒤 스냅샷을 다시 확인합니다. 캡처된 내용이나 자격 증명이 아니라 검토된 정의를 저장합니다. 정의는 권한을 가지지 않으며 Arena 영수증이 되지 않습니다. 통과는 선언된 관찰이 일치했다는 뜻일 뿐입니다. 빠진 데이터는 확인을 만족시킬 수 없습니다.
도구를 수동으로 등록
에이전트에게 페이지에 이미 있는 로직을 재사용하는 도구를 추가하라고 하거나, 페이지의 JavaScript에서 하나를 등록합니다. Chrome 안내는 명령형 API와 선언형 양식 API를 다룹니다. 최소한의 읽기 전용 도구는 다음과 같습니다.
if (typeof document.modelContext?.registerTool === "function") {
await document.modelContext.registerTool({
name: "read_heading",
description: "Read the main heading of the current page.",
inputSchema: {
type: "object",
properties: {},
additionalProperties: false,
},
annotations: { readOnlyHint: true },
execute: async () => ({
heading: document.querySelector("h1")?.textContent ?? "",
}),
})
}
호환되는 에이전트는 그 페이지에서 read_heading을 발견할 수 있습니다. OpenAI의 사이트 도구 페이지는 Codex와 ChatGPT Work 쪽에서 같은 생각을 안내하며, 내장 브라우저가 사이트가 제공하는 도구를 나열하는 방법도 포함합니다.
한계
스크립트, 업로드, 다운로드, 쿠키, 요청 본문, 좌표, 드래그는 없습니다. 관리자는 관리되는 webmcp 요구(allow, allowRead, allowInteract, allowedOrigins)로 브리지나 어느 단계든 끌 수 있습니다. 프로젝트와 사용자 구성은 이를 느슨하게 할 수 없습니다.
ax-code mcp add으로 추가하는 서버는 다른 신뢰 경로입니다. MCP 통합을 참고합니다.
localhost 페이지를 다섯 단계로 디버그
렌더가 잘못된 페이지, 아무 일도 하지 않는 컨트롤, 실패하는 요청의 경우:
- 페이지로 이동하고 스냅샷을 찍습니다. 접근성 트리가 구조적 기준선입니다. 탐색과 읽기는 기존 승인을 사용합니다.
- 실패하는 동작을 기존 상호작용 승인 아래에서 한 번 수행합니다.
- 델타를 읽습니다. 동작 전후의 콘솔 오류와 네트워크 메타데이터(메서드, URL, 상태, 유형. 요청과 응답 본문은 범위 밖)입니다. 비동기 상태이면 기다립니다. 유발 동작을 반복하지 않습니다.
- 판정은 통과(PASS), 실패(FAIL), 또는 빠진 능력을 이름 붙인 차단(BLOCKED)입니다. 도구의 수신 확인은 애플리케이션 성공의 증명이 아닙니다.
- localhost 실패를 구조화된 어서션으로 나타낼 수 있으면 아래의
browser_workflow시나리오로 고정하고, 실패하는 통제를 기록한 뒤, 수정 후 같은 해시를 두 번 실행합니다.
버그 보고에 증거 첨부
고정 시나리오로 조사한 localhost 실패에는 증거 묶음이 보고서를 검토 가능하게 합니다. 시나리오 이름과 해시, 실패한 어서션 결과(캡처된 페이지 내용 없음), browser_workflow inspect의 영수증 ID, 스냅샷 해시, 제한된 콘솔 오류와 네트워크 메타데이터 델타, explicit/local_map/unresolved 레이블이 있는 소스 링크, 그리고 오리진입니다. 런타임이 제한하고 런타임이 가린 출력만 포함합니다. 요청이나 응답 본문, 헤더, 쿠키, 저장소, 페이지 내용, 자격 증명 형태의 값은 넣지 않습니다. 영수증 ID와 복사한 영수증 데이터는 참조일 뿐입니다. 권위 있는 영수증 상태는 런타임이 소유합니다.
개발 변경을 재현하고 검증
browser_workflow 도구는 웹 애플리케이션을 편집하기 전에 수용 단계를 고정하고, 연결된 WebMCP 브리지를 통해 실행하며, 구조화된 어서션을 기록합니다. 먼저 브리지를 켭니다. 처음 지원되는 환경은 127.0.0.1의 일회용 HTTP 서버입니다. 각 실행은 다른 포트와 임시 데이터 디렉터리, 그리고 새 격리 브라우저 컨텍스트를 할당합니다. 지속 브라우저 프로필은 거부됩니다. 빈 컨텍스트는 연결이 끊길 때까지 상위 브리지가 유지합니다. 한 연결에서 32회 실행한 뒤에는 계속하기 전에 브리지를 다시 연결합니다. 워크플로는 그 쿠키나 저장소를 재사용하지 않습니다.
에이전트에게 action: "freeze"로 시나리오를 고정하라고 요청합니다. 예를 들어 포트 인자를 받는 프로젝트가 소유한 test/browser-server.mjs는 다음을 쓸 수 있습니다.
{
"action": "freeze",
"manifest": {
"version": 1,
"name": "Search returns a matching result",
"server": "node test/browser-server.mjs {port}",
"path": "/",
"setup": [],
"reset": [],
"cleanup": [],
"steps": [
{ "action": "fill", "locator": { "role": "textbox", "name": "Search" }, "value": "example" },
{
"action": "assert",
"assertion": {
"locator": { "role": "status", "name": "One result" },
"property": "count",
"equals": 1
}
}
]
}
}
반환된 해시를 보관합니다. {"action":"run","hash":"<hash>","server":"webmcp"}으로 실행합니다(연결된 브리지 이름을 사용). 실패를 재현하고, 변경한 뒤, 같은 해시를 두 번 실행합니다. 각 실행은 선언된 서버를 시작하고, 자신의 페이지를 열고, 단계를 확인하고, 페이지를 닫고, 서버를 멈춥니다. 수명 주기 명령은 일반 셸 권한을 통해 저장소 루트에서 실행됩니다. {port}은 할당된 포트로 확장되고, {data}은 인용된 임시 디렉터리로 확장됩니다. 설정, 재설정, 정리 명령은 15초 안에 끝나야 합니다. 준비 기한은 15초이고 브라우저 실행 기한은 120초입니다. 브라우저 동작은 기존 권한과 상호작용 예산을 유지합니다.
지원되는 단계는 클릭, 호버, 채우기, 구조화된 어서션, 페이지 도구 계약 확인입니다. 로케이터는 정확한 역할과 접근 가능한 이름을 사용합니다. 일치가 없거나 여러 개이면 unknown로 멈춥니다. 추측한 UID나 CSS 및 스크립트 폴백은 없습니다. 어서션은 개수, 값, 선택됨, 비활성 상태를 비교합니다. 없는 상태 속성은 알 수 없음입니다. 비동기 렌더링에는 timeoutMs(0-10000, 기본값 0)을 assert 단계에 추가합니다. 실행기는 어서션이 맞거나 기한이 끝날 때까지 새 구조화 스냅샷을 폴링합니다. 앞선 클릭이나 채우기를 반복하지 않습니다. 시간 제한은 시나리오와 함께 고정되고 내보낸 테스트에 유지됩니다. 시나리오는 32단계와 32 KiB로 제한됩니다.
inspect는 고정된 매니페스트와 런타임 영수증을 반환합니다. 영수증은 시나리오를 저장소 리비전과 내용, 연산 결과, 스냅샷 해시, 제한된 콘솔과 네트워크 메타데이터에 묶습니다. 바뀐 소스, 거부된 연산, 빠진 증거, 시간 초과, 불완전한 정리는 통과할 수 없습니다. 이 결과는 선언된 어서션을 검증합니다. 앱의 모든 동작을 증명하지는 않습니다. 고정 상태와 권위 있는 영수증은 현재 런타임 세션에 있습니다. 재시작 뒤에는 다시 고정하고 자격 부여합니다. 복사한 JSON 영수증은 런타임 권위로 받아들여지지 않습니다.
회귀 테스트 내보내기
{"action":"export","hash":"<hash>"}은 playwright-core를 쓰는 독립 Node 모듈을 반환합니다. 반환된 코드를 프로젝트 테스트로 저장하고 Chrome을 가리키는 AX_TEST_WEBMCP_CHROME로 실행합니다. 같은 픽스처를 시작하고, 새 브라우저 컨텍스트, 안정적인 역할과 이름 로케이터, 고정된 어서션을 사용합니다. 검증되었다고 부르기 전에 내보낸 테스트를 실제로 실행합니다. 내보낸 테스트는 독립 회귀 산출물입니다. 그 출력은 Arena 영수증이 아닙니다. 페이지 도구 계약 단계는 정확한 설명자 해시와 기대 출력으로 Chrome의 네이티브 WebMCP 프로토콜을 사용하며, 임의의 페이지 스크립트를 평가하지 않습니다. 계약 내보내기에는 Chrome이 그 실험적 프로토콜을 지원해야 합니다.
페이지 도구 계약을 만들고 실패를 조사
페이지가 열린 상태에서 {"action":"contracts","server":"webmcp","pageId":1}은 등록된 설명자와 정확한 설명자 해시를 반환합니다. contract 단계를 고정하고, 그 안에 name, descriptorHash, input, resultPath, equals를 둡니다. 해시가 바뀌면 확인이 실패합니다. 부정 입력에는 expectError: true을 설정합니다. 확인된 페이지 도구 실행 오류만 이를 만족합니다. 취소된 호출, 권한 거부, 완료 누락은 알 수 없음입니다. 변경 뒤에 어서션을 추가하면 반환 값뿐 아니라 결과 페이지 상태도 확인합니다.
template 동작은 name, 상대 애플리케이션 module, 명시적 exportName, schema을 받습니다. 로컬 export가 있는지 확인하고 등록 골격을 반환합니다. 활성화하기 전에 애플리케이션의 입력 검증, 권한 부여, 비즈니스 로직과 대조해 검토합니다. 도구는 export된 함수 이름만으로 그 보장을 확립할 수 없습니다.
선택적 sources 목록은 1부터 세는 line과 0부터 세는 column이 있는 저장소 로컬 파일, 그리고 선택적으로 로컬 map 파일을 이름 붙입니다. 실패한 실행은 제한된 진단과 explicit, local_map, unresolved로 표시된 소스 링크를 반환합니다. 매핑은 조언이며, 근본 원인이나 통과한 어서션의 증명이 아닙니다. 원격 맵, 저장소 밖 경로, 1 MiB를 넘는 파일은 읽지 않습니다. 브라우저 네트워크 증거는 메타데이터로만 남습니다.
implement Arena에 브라우저 증거 요구
browserScenario: "<hash>"에 mode: "implement"을 제공합니다. Arena를 시작하기 전에 시나리오를 고정하고, 현재 깨끗한 기준에서 실제로 실패하는 어서션을 기록합니다. 모든 후보는 격리된 작업 트리에서 그 고정 계약을 받고, 연결된 격리 브리지를 통해 두 번 성공적으로 실행해야 합니다. 브라우저 활성화와 권한은 감독된 상태로 남습니다. 브리지 접근 누락, 오래된 내용, 알 수 없는 결과, 빠진 영수증은 저장소 확인이 통과해도 승격을 막습니다. 일반 코드 검증과 변이 확인은 계속 실행되며, 어떤 후보도 자동으로 병합되지 않습니다.
증거를 효율적으로 고르기
네이티브 WebMCP 도구는 애플리케이션 연산을 설명합니다. Chrome DevTools MCP는 브라우저 검사와 자동화를 제공합니다. 명시적 애플리케이션 연산에는 페이지가 등록한 도구를 우선하고, 그다음 결과와 결과 페이지 상태를 검증합니다. 텍스트와 안정적인 요소 로케이터에는 접근성 스냅샷을 사용합니다. 레이아웃, 캔버스, 이미지만 있는 내용에는 스크린샷을 찍습니다. 인라인 한도 안에 있으려면 새 스냅샷의 uid로 자르거나, 품질을 낮춘 JPEG를 사용합니다. 픽셀을 해석하려면 비전 가능 모델이 필요합니다. WebMCP도 문서화된 DevTools MCP 도구 목록도 전용 OCR 도구를 제공하지 않습니다. 추론한 이미지 텍스트는 조언이며 구조화된 수용 어서션을 만족할 수 없습니다.
콘솔 읽기는 types와 pageSize으로 좁히고, 네트워크 메타데이터는 resourceTypes과 pageSize로 좁힙니다. 워크플로 영수증은 동작 전 기준선과 제한된 델타를 유지하므로, 재현이 만든 오류를 찾기 쉽습니다. 네트워크 본문과 임의 평가는 브리지가 부여한 표면 밖에 남습니다. 상위 DevTools MCP의 성능 추적, 에뮬레이션, Lighthouse, 스크린캐스트, 메모리, 확장 도구는 별도 능력이며 이 프로필이 노출하지 않습니다.
Chrome의 WebMCP 디버깅 안내와 상위 DevTools MCP 도구 참조를 참고합니다. 상위 main은 AX Code가 고정한 브리지와 다를 수 있습니다. 지원되는 인자는 로컬 도구 스키마만 설명합니다.