Skip to content

devtools-MCP CDP-first 재설계 — CDP passthrough whitelist + tool surface 축소 #253

@DaveDev42

Description

@DaveDev42

배경

현재 MCP tool surface는 13개:

  • read-only: `list_pages`, `list_console_messages`, `list_network_requests`, `get_dom_document`, `take_snapshot`, `take_screenshot`, `measure_safe_area`, `AIT_getOperationalEnvironment`, `AIT_getMockState`, `AIT_getSdkCallHistory`
  • side-effect: `call_sdk`, `evaluate`, `build_attach_url`

대부분은 CDP method를 1:1 wrapping한 syntactic sugar. 예시:

  • `evaluate` = `Runtime.evaluate` wrap
  • `take_screenshot` = `Page.captureScreenshot` wrap
  • `take_snapshot` = `DOMSnapshot.captureSnapshot` wrap
  • `get_dom_document` = `DOM.getDocument` wrap
  • `call_sdk` = `Runtime.evaluate("window.__sdk.X(...)")` wrap

이 sugar들은:

  • agent 학습 비용 (한 시점에 13개 → 점점 늘어남)
  • 유지 보수 비용 (CDP 시그니처 변경 시 우리도 갱신)
  • 일관성 비용 (어떤 건 sugar, 어떤 건 raw가 가능 → 어디까지 sugar로 만들지 자의적)

대안: CDP를 raw passthrough로 노출하고, AIT 환경 특화 helper만 별도 유지. agent는 Chrome DevTools Protocol docs(표준)를 직접 학습 가능.

설계

A — `cdp_send(method, params)` raw passthrough + whitelist

미니앱 환경에서 유효한 CDP domain만 허용:

domain 유효 비고
`Runtime.*` evaluate, callFunctionOn, console
`DOM.`, `CSS.`, `DOMSnapshot.*`
`Network.`, `Log.`, `Performance.*`
`Page.*` captureScreenshot/navigate/reload만. bringToFront 등 desktop은 거부
`Storage.`, `IndexedDB.`, `CacheStorage.*`
`Profiler.`, `HeapProfiler.`, `Debugger.*` iOS WebKit-CDP bridge(Chii) 지원 여부 확인 후
`Input.*` iOS WebKit dispatchTouchEvent 지원 확인 후
`Memory.`, `Security.`, `Animation.*` 빈도 낮음, 검토 후
`Target.`, `Browser.`, `Tethering.*` multi-target/window 데스크톱 전용
`Emulation.*` 실기기에서 무의미

화이트리스트 외 method 호출 → 명시 에러 + "이 domain은 미니앱 환경에서 유효하지 않습니다" 안내.

B — AIT helper 정말 필요한 것만

current 결정 이유
`build_attach_url` 유지 relay 진입 — CDP에 없음
`list_pages` 유지 Chii relay listTargets — `Target.getTargets`와 의미 다름
`measure_safe_area` 유지 다단 probe 패키지 (cssEnv + sdk + dom + viewport + dpr + UA)
`list_console_messages` 유지 (buffer) CDP stream → buffer query — 다른 형태 없음
`list_network_requests` 유지 (buffer) 동상
`AIT_getMockState` 유지 (env 1 marker) mock 환경 메모리 — raw CDP로 못 가져옴
`AIT_getSdkCallHistory` 유지 (env 1 marker) 동상
`call_sdk` deprecate `cdp_send("Runtime.evaluate", {expression: "window.__sdk.X(...)"})` 동등
`evaluate` deprecate `cdp_send("Runtime.evaluate", ...)` 동등
`take_screenshot` deprecate `cdp_send("Page.captureScreenshot", ...)` 동등
`take_snapshot` deprecate `cdp_send("DOMSnapshot.captureSnapshot", ...)` 동등
`get_dom_document` deprecate `cdp_send("DOM.getDocument", ...)` 동등
`AIT_getOperationalEnvironment` deprecate `cdp_send("Runtime.evaluate", {expression: "window.__sdk.getOperationalEnvironment()"})` 동등

최종 tool 8개: `cdp_send` + `build_attach_url` + `list_pages` + `measure_safe_area` + `list_console_messages` + `list_network_requests` + `AIT_getMockState` + `AIT_getSdkCallHistory`.

13 → 8 (38% 감소). 그리고 `cdp_send`는 CDP 전체를 노출하므로 실제 능력은 ↑.

마이그레이션

  • 점진 deprecate: 한 번에 다 빼지 말고, 1.0.0까지는 deprecated tool도 작동하되 description에 "deprecated, use cdp_send instead" 명시.
  • 1.0.0 시점에 모두 제거.
  • agent-plugin / agent 사용 패턴 점검 — sdk-example skill, devtools panel skill 등이 어디까지 deprecated tool에 의존하는지 grep.

SECRET-HANDLING

  • `cdp_send`의 params는 raw passthrough — caller가 attach URL/at= 코드를 expression에 넣으면 그대로 evaluate됨. tool description에 "params에 secret 노출 금지" 명시.
  • whitelist 위반 시 method/domain은 에러 메시지에 노출 가능 (secret 아님).

acceptance

  • `cdp_send(method, params)` MCP tool 추가, whitelist domain만 허용.
  • 화이트리스트 명세 문서화 (`docs/cdp-passthrough.md` 또는 README).
  • 위 13개 중 deprecate 6개를 description에 표기 (1.0.0에서 제거 예고).
  • 단위 테스트: whitelist 통과 + 거부 + 1:1 passthrough.
  • agent-plugin `/ait debug` skill 갱신 — 새 `cdp_send` 사용 패턴 안내.
  • 1.0.0 시점에 deprecated 6개 제거.

Out of scope

관련

Metadata

Metadata

Assignees

No one assigned

    Labels

    roadmapharness roadmap 작업 항목 (Project #1)

    Type

    No type
    No fields configured for issues without a type.

    Projects

    Status
    Todo

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions