Google이 직접 만든 Apache-2.0 오픈소스. Claude·Gemini·Cursor·Copilot이 살아있는 크롬 탭을 클릭하고, 네트워크를 들여다보고, 성능 트레이스를 뜨고, Lighthouse 감사를 돌릴 수 있게 해주는 MCP 서버 1.0.
코딩 에이전트가 실제 크롬 탭을 운전하게 만드는 표준 통로
chrome-devtools-mcp는 코딩 에이전트(Claude·Gemini·Cursor·Copilot 등)가 실제로 켜져 있는 크롬 브라우저를 직접 조작하고, 그 안을 들여다보고, 성능을 측정할 수 있게 해주는 MCP 서버다. 즉 LLM이 "이 사이트 느린데 왜 그런지 봐줘"라고 하면, 진짜로 크롬 탭을 열고, 트레이스를 뜨고, 네트워크 요청을 분석해서 "LCP 3.2초의 범인은 fonts.gstatic.com에서 받는 470KB의 한글 폰트"라고 답할 수 있다.
Google이 직접 운영하는 공식 레포(ChromeDevTools/chrome-devtools-mcp)이고, Apache-2.0, v1.0.1, npm 한 줄로 설치되는 상태다.
TrendShift 3위 · "에이전트가 실제 브라우저를 다룬다"는 흐름의 정점
TrendShift 일간 3위(2026-05-22 기준, 543점). 한 줄로 말하면 "AI 코딩 비서가 더 이상 코드만 읽지 않고 실제 화면을 본다"는 흐름의 결정판이다. 2026년 들어 등장한 비슷한 결의 도구들 — browser-use, claude-in-chrome, playwright-mcp — 중에서도 이 레포가 가장 빠르게 성장하는 데에는 이유가 있다.
만든 곳이 Google의 Chrome DevTools 팀이다. 즉 devtools-frontend, Lighthouse, CrUX(Chrome User Experience Report) API를 만든 사람들이 그 도구를 LLM이 쓸 수 있는 형태로 다시 노출한 것이다. 다른 브라우저 자동화 MCP들이 "Puppeteer 래퍼"라면, 이건 "DevTools 본체에서 분기된 도구"다.
도구 48개(기본 노출 39개)를 F12 패널 구조와 똑같이 묶었다. click·drag·fill·fillForm·hover·pressKey·typeText·uploadFile 같은 입력 10개, navigate·new_page 같은 탐색 6개, emulate(모바일/네트워크) 2개, performance_start_trace·performance_stop_trace 같은 성능 3개, list_network_requests 같은 네트워크 2개, evaluate_script·get_console_message·lighthouse_audit 같은 디버깅 8개, 메모리 8개, 확장프로그램 5개(기본 비활성). LLM은 사람이 DevTools를 쓰던 멘탈 모델을 그대로 가져다 쓰면 된다.
README 한 페이지에 20+ MCP 클라이언트별 설치 명령이 적혀 있다. 표준(MCP)을 잘 따랐기 때문에 가능한 일이고, 그래서 모든 코딩 에이전트 진영이 "이거 일단 깔자"가 된다. TrendShift 점수가 빠르게 오르는 이유.
/plugin install chrome-devtools-mcp 한 줄"Claude Code에서는 단순 MCP가 아니라 Plugin(MCP + Skills)으로 설치할 수 있다. 즉 "어떻게 쓰는지"에 대한 한국어/영어 가이드까지 같이 깔리는 거다. 이게 단순 도구가 아니라 "사용법까지 LLM에 주입되는 패키지"라는 시그널.
| 도구 | 강점 | 약점 |
|---|---|---|
| chrome-devtools-mcp (이 레포) | Google 공식 · DevTools 본가 · Lighthouse·CrUX 직결 | 크롬 전용 (파이어폭스/사파리 X) |
| playwright-mcp | 크로스 브라우저 (Chromium·Firefox·WebKit) | 성능 트레이스·Lighthouse 분석은 외부 도구 별도 |
| browser-use | 비전 기반 — 사이트 디자인이 바뀌어도 안정 | 토큰 비용 큼 (스크린샷 매번 전송) |
| claude-in-chrome | 익스텐션 — 로그인된 내 크롬을 그대로 씀 | Anthropic 클로드 전용 |
이 둘은 경쟁이라기보다는 역할이 다르다. 그래서 둘 다 깔아두는 사람도 많다.
package.json·rollup·CDP까지 — "Google이 직접 쓰는 도구"의 풀스택
| 스택 | 버전 | 역할 |
|---|---|---|
| Node.js | 20.19+ / 22.12+ / 23+ | MCP 서버를 실행하는 런타임. 사용자 머신에 npm으로 깔린다. |
| TypeScript | 6.0.2 | 전체 코드. tsc로 컴파일 후 rollup 번들링 |
| @modelcontextprotocol/sdk | 1.29.0 | MCP 표준 구현체 (Anthropic 공식 SDK). 도구 등록·JSON-RPC stdio 처리 |
| puppeteer | 25.0.4 | Chrome을 띄우고 CDP로 조종하는 라이브러리 |
| chrome-devtools-frontend | 1.0.1631386 | 실제 DevTools UI 코드의 인사이트·트레이스 분석 로직을 가져다 씀 |
| lighthouse | 13.3.0 | 웹페이지 자동 감사 도구 (성능·SEO·접근성 점수) |
| 스택 | 역할 |
|---|---|
| tsc | TS → JS 컴파일 (배포 번들용) |
| rollup 4 + plugin-commonjs/json/node-resolve | 여러 모듈을 단일 파일로 묶어 npm 배포 — npm i -g chrome-devtools-mcp 후 npx로 바로 실행되게 함 |
| rollup-plugin-license | 의존성 라이선스 자동 수집·고지 (오픈소스 컴플라이언스) |
| eslint 9 + prettier 3 + @stylistic | 코드 스타일 |
| sinon 22 | 스파이·스텁·모킹 — 테스트에서 Puppeteer를 가짜로 만든다 |
| 스택 | 역할 |
|---|---|
| @google/genai 2.0 | Gemini API SDK — npm run eval에서 Gemini로 도구 동작을 자동 평가하는 회귀 테스트 |
| .claude-plugin/plugin.json | Claude Code 플러그인 매니페스트 — /plugin install로 깔리는 패키지 명세 |
| CrUX API 연동 | Chrome User Experience Report — 진짜 사용자의 실측 LCP/FID/CLS를 비교 데이터로 가져온다 |
이 레포는 "Puppeteer라는 자동차 + DevTools라는 계기판 + Lighthouse라는 정비소 + CrUX라는 도로 통계"를 하나로 묶어 LLM이 부를 수 있는 48개 버튼으로 만든 패키지다.
사람 개발자가 F12를 누를 때 머릿속에서 일어나는 일 — "성능 탭 → 녹화 → 트레이스 보고 → LCP 원인 추정" — 을 그대로 도구 시퀀스로 노출했다.
stdio JSON-RPC · CDP · Puppeteer가 만나는 4-layer 구조
MCP 서버는 본질적으로 JSON-RPC over stdin/stdout이다. 클라이언트(에이전트)가 tools/list를 부르면 서버가 등록된 도구의 JSON 스키마를 응답한다. 에이전트는 그 스키마를 LLM 프롬프트에 함수 선언으로 넣고, LLM이 도구를 부르겠다고 하면 tools/call로 다시 서버에 요청한다.
// MCP 한 사이클 (개념)
client → { jsonrpc:"2.0", method:"tools/list", id:1 }
server ← { tools:[ {name:"click", inputSchema:{...}}, ... 48개 ] }
client → { method:"tools/call", params:{
name:"performance_start_trace",
arguments:{ url:"https://example.com" } }, id:2 }
server ← { content:[{ type:"text", text:"Trace recording..." }] }
이 프로젝트의 design-principles.md에 적혀 있는 한 줄: "LCP was 3.2s"가 "50k lines of JSON"보다 낫다.
퍼포먼스 트레이스 원본은 수십 MB짜리 JSON인데, LLM 컨텍스트에 그걸 통째로 던지면 가격 폭탄 + 의미 추출 실패다. 그래서 devtools-frontend의 분석 로직을 가져다가 "LCP는 X.Xs · 원인은 Y 리소스 · 개선책 Z" 같은 의미 단위 요약을 만들어서 돌려준다. 트레이스 원본은 파일로 저장하고 경로만 알려준다.
스크린샷·트레이스·동영상 같은 무거운 자산은 raw 데이터를 절대 응답에 안 넣고 파일 경로(또는 resource URI)만 반환한다. LLM 컨텍스트를 깨끗하게 유지하는 핵심 트릭이다.
"한 번에 사이트 분석 다 해줘" 같은 매직 버튼은 의도적으로 안 만든다. 대신 click·screenshot·evaluate_script 같은 작은 결정적 블록을 늘어놓고, LLM이 그걸 조립하게 한다. 그래야 LLM이 중간 결과를 보고 다음 수를 결정할 수 있다(추론 가능성).
--categoryEmulation=false, --categoryPerformance=false, --categoryNetwork=false, --slim 같은 플래그로 노출 도구 수를 줄일 수 있다. LLM은 도구가 많을수록 잘못 선택할 확률이 커지기 때문에 "이번 작업엔 안 쓸 도구는 아예 숨긴다"는 게 정석.
navigate + screenshot + evaluate만 노출. "그냥 페이지 한번 열어보고 끝낼 거"라면 이걸로 충분하다.npx로 서버가 뜨고, 도구를 부르는 순간 Puppeteer가 새 크롬을 launch한다. user-data-dir은 ~/.cache/chrome-devtools-mcp/chrome-profile-stable에 영구 보관. 격리가 필요하면 --isolated로 임시 디렉토리 사용.
--browserUrl=http://127.0.0.1:9222 또는 Chrome 144+의 --autoConnect 사용. 로그인된 내 크롬을 그대로 쓰고 싶거나, MCP가 샌드박스 안에 있어 새 브라우저를 못 띄울 때 이 모드를 쓴다. 보안 주의 — 디버깅 포트는 같은 머신의 모든 앱에 열려 있다.
READMD가 명시한다 — "chrome-devtools-mcp exposes content of the browser instance to the MCP clients". 즉 로그인 세션·쿠키·자동완성 데이터까지 LLM 클라이언트가 다 볼 수 있다. 민감한 사이트가 열려 있는 프로필을 그대로 붙이지 말 것. --isolated가 안전한 기본값이다.
npm 패키지로 배포되는 단일 서버 레포
scripts/eval_gemini.ts — Google 답게 Gemini로 자체 회귀 테스트를 돌린다. 도구 시그니처를 바꿨을 때 LLM이 여전히 잘 부르는지를 자동 검증.scripts/count_tokens.ts — 도구 설명·스키마가 컨텍스트에서 차지하는 토큰을 측정. "도구 늘리면 비용이 얼마나 늘어나나"를 항상 추적.scripts/generate-docs.ts — tool-reference.md와 README의 도구 목록을 코드에서 자동 생성. 문서가 코드보다 늦지 않는다..claude-plugin/plugin.json — Claude Code Plugin marketplace에 등록되는 매니페스트. MCP 서버 정의가 들어있다.이 한 레포에서 뽑아 쓸 수 있는 6가지 학습 갈래
이 레포는 "MCP 서버 잘 만든 모범 사례"로 그 자체가 교과서다. @modelcontextprotocol/sdk 사용법, JSON-RPC 흐름, 도구 등록·카테고리·옵션 노출 패턴이 다 들어있다.
나만의 MCP 서버를 하나 만들어보자. 예: "내 Notion 페이지를 읽고 쓰는 MCP". tools/list·tools/call 두 메서드만 구현하면 시작이다. 이 레포의 src/index.ts를 템플릿으로 쓰면 30분 만에 동작한다.
Puppeteer를 단순 페이지 자동화가 아니라 "DevTools Protocol을 직접 부르는 도구"로 쓰는 법을 본다. page.evaluate(), page.tracing.start(), cdpSession.send('Network.enable') 같은 저수준 API가 어떻게 LLM-callable 도구로 매핑되는지.
Puppeteer만으로 "특정 URL의 LCP를 측정해서 콘솔에 출력"을 만들어보자. page.tracing → trace.json → chrome-devtools-frontend의 인사이트 모듈로 분석하는 파이프라인을 따라가본다.
lighthouse_audit 도구는 Lighthouse 13.3을 내부 모듈로 호출한다. CLI 없이 Node 안에서 audit을 돌리고 JSON 결과를 받는 방법, 그리고 그 JSON에서 LLM이 쓸 만한 요약을 추출하는 방법을 익힐 수 있다.
실제 빌드 워크플로: tsc로 src/**/*.ts를 build/에 컴파일한 뒤 rollup으로 단일 파일로 번들링해 npm 배포한다 (npm run build = tsc && node scripts/post-build.ts). Node 22.6+의 --experimental-strip-types는 이 프로젝트가 채택한 패턴이 아니다. "컴파일 → 번들링 → 배포"의 표준적인 npm 패키지 파이프라인을 잘 따르고 있다.
rollup-plugin-license로 라이선스 자동 수집, plugin-node-resolve로 의존성 인라이닝. npx chrome-devtools-mcp@latest 한 줄로 모든 게 돌아가는 이유가 여기 있다.
이건 코드보다도 docs/design-principles.md 한 페이지가 본체다. "Reference over Value", "Self-Healing Errors", "Progressive Complexity" 같은 원칙들은 MCP 서버뿐 아니라 모든 LLM-facing API 설계에 그대로 적용된다.
요약 우선, 무거운 자산은 reference, 에러는 self-healing(고치는 법 포함), 작은 결정적 블록으로 쪼개기. 이 원칙은 자기 회사 내부 도구를 만들 때도 똑같이 쓸 수 있다.
로컬 머신에서 돌리는 가벼운 도구 — 단, Chrome이 떠야 한다
| 요소 | 요구사항 | 비고 |
|---|---|---|
| OS | macOS / Linux / Windows | 3개 다 공식 지원. Windows는 cmd /c 래핑 필요 |
| Node.js | 20.19+ / 22.12+ / 23+ | 최신 maintenance LTS |
| Chrome | current stable 이상 | Chrome for Testing도 OK. 다른 Chromium 파생(Edge, Brave...)은 보장 안 함 |
| npm | 최신 | npx가 동작해야 함 |
| 메모리 | 크롬 1탭 + Node 서버 | 대략 500MB~1GB. 트레이스 뜰 때 일시적으로 더 씀 |
| 네트워크 | npm 레지스트리 + (선택) CrUX API | --no-performance-crux로 CrUX 끄기 가능 |
| ffmpeg (선택) | 실험 스크린캐스트 쓰면 필요 | --experimentalScreencast |
| 디스크 | user-data-dir 수십~수백 MB | ~/.cache/chrome-devtools-mcp/에 프로필 영구 보관 |
샌드박스(Docker, devcontainer, 원격 SSH 머신, VM) 안에서 돌릴 때는 크롬 자체를 띄울 수 없는 경우가 많다. 이때는 --browserUrl로 호스트의 크롬에 붙이는 방식을 써야 한다. README의 "VM ↔ host 포트 포워딩" 트러블슈팅을 미리 읽어두자.
난이도 ★~★★★★★ · 손이 더러워질수록 배우는 게 많다
Claude Code(또는 Cursor·Gemini CLI 아무거나)에 chrome-devtools-mcp 설치하고, 첫 프롬프트 "Check the performance of https://developers.chrome.com"을 그대로 입력. 크롬이 자동으로 뜨고 트레이스 결과가 나오는 것 확인.
배우는 것: MCP 클라이언트 설정 위치, 첫 도구 호출이 어떻게 일어나는지의 체감.
본인 블로그/포트폴리오 URL을 줘서 LLM에게 시키기: "이 사이트의 모바일 3G 환경에서 LCP·CLS·INP를 측정하고, 가장 큰 3개의 성능 병목과 해결책을 마크다운으로 정리해줘". emulate(네트워크/CPU throttling) + performance_start_trace + performance_analyze_insight를 LLM이 자동으로 조합하는 걸 본다.
배우는 것: 코어 웹 바이탈 의미, LLM이 도구를 어떻게 조립하는지, 자동 보고서 작성 패턴.
--browserUrl 모드로 이미 로그인된 내 크롬에 붙이고, "내 GitHub 알림 페이지에 들어가서 unread를 다 읽음 처리해줘" 같은 시나리오 실행. click·wait_for·list_pages를 결합한 자동화 흐름 체험.
배우는 것: 세션 유지 자동화, 비결정적 UI에서 wait_for 패턴, 보안 위험 체감.
매일 새벽 chrome-devtools-mcp를 CI에서 돌려 우리 서비스의 LCP를 측정 → 어제 대비 +200ms 이상 회귀하면 Slack 알림. headless 모드 + --isolated + 결과 파일을 GH artifact로 업로드. CHROME_DEVTOOLS_MCP_NO_USAGE_STATISTICS=1 환경변수 잊지 말 것.
배우는 것: CI 환경의 크롬 동작, headless의 함정, 시계열 메트릭 저장 전략.
이 레포의 구조(src/index.ts + src/tools/*)를 그대로 베껴 "내 Obsidian vault를 검색·수정하는 MCP" 만들기. @modelcontextprotocol/sdk로 시작 → 도구 5~10개 정의 → Claude Code에 연결해서 자연어로 노트 작성. design-principles.md 7원칙을 의식적으로 따라본다.
배우는 것: MCP 서버 설계의 모든 디테일, 토큰 효율적인 도구 응답 만들기, eval 자동화의 가치.
8주 코스 — "에이전트가 브라우저를 다루게 만드는 사람"이 되는 길
| 주차 | 주제 | 해야 할 일 |
|---|---|---|
| 1주차 | MCP 기초 | Anthropic의 MCP 스펙(modelcontextprotocol.io) 정독. JSON-RPC 2.0 복습. chrome-devtools-mcp를 깔고 4~5가지 도구를 직접 호출해본다. |
| 2주차 | Puppeteer | puppeteer 공식 튜토리얼. page.evaluate·page.screenshot·page.tracing 직접 써보기. Headless vs Headful 차이 이해. |
| 3주차 | Chrome DevTools Protocol | CDP 메서드 카탈로그 훑기. Network.enable·Performance.getMetrics·Runtime.evaluate가 Puppeteer 안에서 어떻게 호출되는지 추적. |
| 4주차 | Lighthouse 내부 | Lighthouse를 Node 모듈로 직접 호출. category·audit 구조 이해. 결과 JSON에서 의미 있는 요약을 뽑는 코드 작성. |
| 5주차 | Core Web Vitals + CrUX | LCP/CLS/INP가 실제로 어떻게 계산되는지. CrUX API로 실측 데이터 받기. 랩 데이터와 필드 데이터의 차이. |
| 6주차 | MCP 서버 직접 작성 | 실습 5번 — 본인 도메인의 MCP 서버 하나 완성. 도구 5~10개, design-principles 준수. |
| 7주차 | 에이전트 평가(eval) | 이 레포의 scripts/eval_gemini.ts 따라 만들기. 도구를 LLM이 정확히 부르는지 자동 테스트. token 비용 측정 자동화. |
| 8주차 | 프로덕션 배포 | Claude Code Plugin 마켓플레이스에 등록 시도. plugin.json 작성, README 다국어, CI eval 게이트. |
이 레포를 읽다 만나는 모든 약자·전문용어를 한 번에
page.goto()·page.click()·page.evaluate()가 시그니처 함수.--isolated는 매번 임시 디렉토리./plugin install로 설치, marketplace 등록 가능.시작하기·깊게 가기·이슈 트래킹