Chrome's own MCP server is CDP wearing an MCP coat. We drive it by hand and watch one tools/call move a tab on our raw debugging port.
You've built CDP from the bottom up: connect,
domains & events,
targets & sessions. This capstone connects it to
your other course. chrome-devtools-mcp — Chrome's official server for AI agents —
is an MCP server on top and CDP on the bottom. If you know both protocols, you
can see straight through it.
chrome-devtools-mcp speaks MCP upward and CDP downward. Agents
talk to it with tools/list / tools/call (your
MCP track); it turns each tool call into
CDP commands — via Puppeteer — against a real Chrome (this track).repo
We ran chrome-devtools-mcp and drove it by hand over MCP stdio — the same
handshake you decoded in the MCP course. This is the real exchange:
The full tool set (29 in v1.7.0) is exactly the vocabulary of this track, one level up:tool reference
Read that list again through CDP eyes. Each high-level tool is one or more of the domains and commands from Lessons 2–3:
| MCP tool | CDP underneath (Lesson) |
|---|---|
navigate_page | Page.navigate + lifecycle events (L2) |
evaluate_script | Runtime.evaluate (L2) |
take_screenshot | Page.captureScreenshot (L2 ref) |
list_network_requests, get_network_request | Network.* events + getResponseBody (L2) |
list_console_messages | Runtime.consoleAPICalled (L2) |
click, hover, type_text, press_key, drag | Input.dispatchMouseEvent / dispatchKeyEvent |
new_page, list_pages, select_page, close_page | Target.* + sessions (L3) |
emulate, resize_page | Emulation.* |
It doesn't send CDP by hand — it uses Puppeteer, which speaks CDP for it. But every effect bottoms out in the commands you've been sending yourself.
Here's the demonstration that ties both courses together. We pointed
chrome-devtools-mcp at the very Chrome we control — the one on
--remote-debugging-port=9222 — using its --browser-url flag. Then we
made one MCP tool call, and checked our tab over raw CDP:
An agent's tools/call (MCP) crossed into chrome-devtools-mcp, which
told Puppeteer to run Page.navigate (CDP) against our debugging port — and
we saw the result with our own raw Runtime.evaluate. Two protocols, one continuous
path, both of which you can now read on the wire.
To wire it into an MCP client you add one server entry — the same shape you saw in the MCP course:repo
By default it launches its own Chrome. The flags worth knowing map onto everything you've learned:
--browser-url http://127.0.0.1:9222 — attach to an already-running
Chrome (the bridge we just used) instead of launching one.--isolated — use a throwaway user-data-dir, auto-cleaned on exit.--headless, --channel=<stable|beta|dev|canary> — the same
launch knobs from Lesson 1.On startup the server itself prints: "chrome-devtools-mcp exposes content of the browser instance to the MCP clients allowing them to inspect, debug, and modify any data in the browser … Avoid sharing sensitive or personal information."repo That's the Lesson 1 warning restated: whatever holds the CDP connection holds the whole browser. Point it at a throwaway profile, never your logged-in one.
Run the whole bridge end-to-end. A driver verb spawns chrome-devtools-mcp,
connects it to your Chrome via --browser-url, and makes the call — then you confirm
over raw CDP. From the cdp/ directory:
The first run downloads the server via npx (give it a moment). Watch the
tools/list names go by — you now know what each one does underneath. Ask me to map
any tool you're unsure of.
chrome-devtools-mcp sit between?navigate_page bottoms out in which CDP command?The chrome-devtools-mcp repository (README for install & flags) and its tool reference. Read the tool list and, for each, name the CDP domain behind it — you now have the vocabulary to do exactly that.