Design Review
pproenca/dot-skills
Structured UI design review — existing code (React/JSX, CSS, Tailwind) and, when behaviour matters, the running app in a real browser — reported as a prioritised Before / After / Why table.
Inspect and profile the React component tree of a running Storybook story through chrome-devtools-mcp (React DevTools over the Chrome DevTools Protocol, via react-devtools-cdt-mcp).
$ npx skills add sanity-io/ui --skill react-devtools-mcp -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install sanity-io/ui react-devtools-mcp --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/sanity-io/ui.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/react-devtools-mcp .claude/skills/react-devtools-mcp && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "react-devtools-mcp" agent skill from https://github.com/sanity-io/ui/tree/main/.agents/skills/react-devtools-mcp into .claude/skills/react-devtools-mcp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "react-devtools-mcp", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/sanity-io/ui/tree/main/.agents/skills/react-devtools-mcpType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add sanity-io/ui --skill react-devtools-mcp -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install sanity-io/ui react-devtools-mcp --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/sanity-io/ui.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/react-devtools-mcp .agents/skills/react-devtools-mcp && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "react-devtools-mcp" agent skill from https://github.com/sanity-io/ui/tree/main/.agents/skills/react-devtools-mcp into .agents/skills/react-devtools-mcp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "react-devtools-mcp", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add sanity-io/ui --skill react-devtools-mcp -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install sanity-io/ui react-devtools-mcp --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/sanity-io/ui.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/react-devtools-mcp .cursor/skills/react-devtools-mcp && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "react-devtools-mcp" agent skill from https://github.com/sanity-io/ui/tree/main/.agents/skills/react-devtools-mcp into .cursor/skills/react-devtools-mcp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "react-devtools-mcp", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/sanity-io/ui.git --path .agents/skills/react-devtools-mcp--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add sanity-io/ui --skill react-devtools-mcp -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install sanity-io/ui react-devtools-mcp --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/sanity-io/ui.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/react-devtools-mcp .gemini/skills/react-devtools-mcp && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "react-devtools-mcp" agent skill from https://github.com/sanity-io/ui/tree/main/.agents/skills/react-devtools-mcp into .gemini/skills/react-devtools-mcp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "react-devtools-mcp", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install sanity-io/ui react-devtools-mcpInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add sanity-io/ui --skill react-devtools-mcp -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/sanity-io/ui.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/react-devtools-mcp .github/skills/react-devtools-mcp && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "react-devtools-mcp" agent skill from https://github.com/sanity-io/ui/tree/main/.agents/skills/react-devtools-mcp into .github/skills/react-devtools-mcp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "react-devtools-mcp", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add sanity-io/ui --skill react-devtools-mcp -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install sanity-io/ui react-devtools-mcp --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/sanity-io/ui.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/react-devtools-mcp .opencode/skills/react-devtools-mcp && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "react-devtools-mcp" agent skill from https://github.com/sanity-io/ui/tree/main/.agents/skills/react-devtools-mcp into .opencode/skills/react-devtools-mcp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "react-devtools-mcp", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
react-devtools-mcpInspect and profile the React component tree of a running Storybook story through chrome-devtools-mcp (React DevTools over the Chrome DevTools Protocol, via react-devtools-cdt-mcp).
React Devtools MCP is an agent skill from sanity-io/ui, published by the product's own GitHub organization. Inspect and profile the React component tree of a running Storybook story through chrome-devtools-mcp (React DevTools over the Chrome DevTools Protocol, via react-devtools-cdt-mcp). Use when debugging why a @sanity/ui component re-renders, finding slow components, reading props and hooks at runtime, or investigating a perf regression in a story. Works from Cursor's MCP config and from the terminal (chrome-devtools CLI daemon), so it also works for cloud agents.
Its SKILL.md is about 2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Frontend & Design, covering Browser testing, React components and MCP servers. It works with Chrome DevTools, React, Model Context Protocol and Storybook. The repository describes itself as: The Sanity UI design system. The licence is MIT.
Read from SKILL.md and the folder at commit 0930b21. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pnpmFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
React Devtools MCP loads about 2k tokens when it runs. Until then it costs about 121 tokens; SKILL.md has 451 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from sanity-io/ui at commit 0930b21, republished under its MIT licence (© sanity-io). 451 words, ~1,967 tokens.
.claude/skills/react-devtools-mcp/SKILL.md (or your agent's skills folder).react-devtools-cdt-mcp
is not an MCP server. It is a browser library that installs a lightweight React DevTools hook
in the page and registers twelve react_* tools that
chrome-devtools-mcp discovers through
its experimental third-party developer tools API (--categoryExperimentalThirdParty=true).
chrome-devtools-mcp is the MCP server; it talks to Chrome over the Chrome DevTools Protocol.
In this repo the Storybook dev server loads react-devtools-cdt-mcp/register in the preview
iframe when ENABLE_REACT_DEVTOOLS_MCP=true (plugin in apps/storybook/.storybook/main.ts).
Nothing changes for pnpm dev or the static build.
# 1. Storybook with the React DevTools hook installed (port 6006, long-running)
pnpm react-devtools-mcp:storybook
# 2. Chrome with the remote debugging port open, showing one story
# (url defaults to iframe.html?viewMode=story&id=primitives-button--default)
pnpm react-devtools-mcp:chrome
pnpm react-devtools-mcp:chrome "http://localhost:6006/iframe.html?viewMode=story&id=components-menubutton--default"
pnpm react-devtools-mcp:chrome --headless # no display (CI, cloud VM without X)
# 3. chrome-devtools-mcp attached to that Chrome — pick ONE of:
# a) Cursor: .cursor/mcp.json defines the `chrome-devtools` server (the workspace-installed,
# lockfile-pinned chrome-devtools-mcp under apps/storybook/node_modules) with
# --categoryExperimentalThirdParty=true --browserUrl=http://127.0.0.1:9222
# b) Terminal / cloud agents (same tools, no MCP client needed):
pnpm --filter sanity-ui-storybook exec chrome-devtools start \
--categoryExperimentalThirdParty=true --browserUrl=http://127.0.0.1:9222Stories must be opened through iframe.html?viewMode=story&id=<story-id>. Tool discovery
only looks at the top-level document; the manager UI at / embeds stories in an iframe and
exposes nothing. Story ids are in http://localhost:6006/index.json (primitives-button--default,
components-menubutton--default, ...).
Every command below is shown for the CLI (CD="pnpm --filter sanity-ui-storybook exec chrome-devtools").
Through MCP the tool names are identical (list_pages, list_3p_developer_tools,
execute_3p_developer_tool, take_snapshot, click, navigate_page); params is a JSON string.
$CD list_pages # page ids; the story page is normally 1
$CD list_3p_developer_tools 1 # REQUIRED once per page load: discovers the react_* tools
$CD execute_3p_developer_tool 1 react_get_component_tree --params '{"depth":40}'
$CD execute_3p_developer_tool 1 react_find_components --params '{"name":"Button"}'
$CD execute_3p_developer_tool 1 react_get_component_by_uid --params '{"uid":"r20","includeHooks":true}'
$CD execute_3p_developer_tool 1 react_get_component_source --params '{"uid":"r20"}'
$CD execute_3p_developer_tool 1 react_get_parent_stack --params '{"uid":"r20"}'
# Profile an interaction
$CD execute_3p_developer_tool 1 react_start_profiling --params '{"traceName":"open-menu"}'
$CD take_snapshot 1 # find the element uid to interact with (e.g. 1_1)
$CD click 1 1_1
$CD execute_3p_developer_tool 1 react_stop_profiling
$CD execute_3p_developer_tool 1 react_get_trace_overview --params '{"traceName":"open-menu"}'
$CD execute_3p_developer_tool 1 react_get_commit_report --params '{"traceName":"open-menu","commitIndex":1}'
$CD navigate_page 1 --type url --url "http://localhost:6006/iframe.html?viewMode=story&id=<id>"
$CD stop # stop the daemon when doneAdd --output-format json for machine-readable output: the result is {"message": "<json>"},
i.e. parse message a second time.
Tools: react_get_component_tree, react_get_component_by_uid, react_get_component_by_dom_element
({"element":{"uid":"1_1"}} from take_snapshot), react_find_components,
react_get_component_source, react_get_owner_stack_trace, react_get_parent_stack,
react_get_owner_stack, react_start_profiling, react_stop_profiling,
react_get_trace_overview, react_get_commit_report.
Component uids (r20) are stable across tools and re-renders but reset on page reload — re-run
list_3p_developer_tools and react_get_component_tree after navigate_page or a reload.
React Compiler output shows as Forget(ButtonComponent); styled-components as styled.button.
Durations are milliseconds; componentsChanged counts fibers that rendered in that commit.
Real run against components-menubutton--default (profile around a click on the "Open" button):
$CD execute_3p_developer_tool 1 react_stop_profiling
{"status": "stopped", "traceName": "open-menu", "commits": 5}
$CD execute_3p_developer_tool 1 react_get_trace_overview --params '{"traceName":"open-menu"}'
[{"commit":0,"committedAt":732,"renderDuration":2.3,"layoutDuration":0.6,"passiveDuration":0.8,"componentsChanged":166},
{"commit":1,"committedAt":739,"renderDuration":2.5,"layoutDuration":2.5,"passiveDuration":0.2,"componentsChanged":156},
...]
$CD execute_3p_developer_tool 1 react_get_commit_report --params '{"traceName":"open-menu","commitIndex":1}'
priority: Sync, 156 components, sorted by actualDuration:
r150 forwardRef styled.div actual=3.00 self=0.30
r152 function Forget(FlexComponent) actual=2.70 self=0.10
r0 function Forget(MenuButton) actual=2.50 self=0.20react_get_component_source resolves to the workspace source through Vite, e.g.
http://localhost:6006/@fs/.../packages/ui/src/core/primitives/button/button.tsx:21, and
react_get_component_by_uid with includeHooks lists hooks such as Theme_v2 with their values.
execute_3p_developer_tool answers "Tool react_... not found" until list_3p_developer_tools
has run for that page load.react group listed: the page was not loaded from the ENABLE_REACT_DEVTOOLS_MCP=true
server, or you are on the manager page (/) instead of iframe.html.chrome-devtools CLI and the MCP server are the same daemon; do not run both against the
same Chrome at once. pnpm --filter sanity-ui-storybook exec chrome-devtools status / stop.react-devtools-mcp:chrome returns (it prints the pid); the profile
is reused from apps/storybook/node_modules/.cache/react-devtools-mcp/chrome-profile. Running
the command again while that Chrome is up opens the url as a new tab in it ("Reused the
browser that was already listening") instead of starting a second Chrome.--remote-debugging-port. Close it and retry. --port must be 1–65535.--headless on machines without a display; the script turns it on automatically when
DISPLAY is unset on Linux. Set CHROME_PATH if Chrome is not found.chrome-devtools-mcp launch its own Chrome instead, drop --browserUrl (and skip step 2);
then open the story with navigate_page or new_page.© sanity-io, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/react-devtools-mcp of sanity-io/ui.
Open the folder on GitHubat commit 0930b21
React Devtools MCP next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| React Devtools MCP this skillsanity-io/ui | 176 | — | ~2k | Automated safety check: Pass | MIT | |
| Design Reviewpproenca/dot-skills | 215 | — | ~3.4k | Automated safety check: Pass | MIT | |
| Extension Puppeteer Debuggingmengxi-ream/read-frog | 10k | — | ~2k | Automated safety check: Notes | GPL-3.0 | |
| Wonder BlocksKhan/wonder-blocks | 163 | — | ~3.2k | Automated safety check: Pass | MIT | |
| Chrome Devtools MCPmanagedcode/dotnet-skills | 486 | — | ~2.2k | Automated safety check: Pass | MIT | |
| Design To Codeyonatangross/orchestkit | 289 | — | ~4.4k | Automated safety check: Notes | MIT |
pproenca/dot-skills
Structured UI design review — existing code (React/JSX, CSS, Tailwind) and, when behaviour matters, the running app in a real browser — reported as a prioritised Before / After / Why table.
mengxi-ream/read-frog
Debug the built Read Frog extension in real Chrome. An agent skill from mengxi-ream/read-frog.
Khan/wonder-blocks
Implements user interfaces using the Wonder Blocks (WB) design system — Khan Academy's React component library.
managedcode/dotnet-skills
Use Chrome DevTools MCP from .NET agents and .NET-focused repos to inspect, debug, and automate Chrome through an MCP client.
yonatangross/orchestkit
Mockup-to-component pipeline using Google Stitch, 21st.dev, and Storybook MCP.
jfarcand/mirroir-mcp
Onboard a consumer web app to mirroir's .mirroir/ dotfile by EXPLORING the running app (chrome-devtools-mcp) — derive real selectors from the accessibility tree, exercise each surface's primary…
sanity-io/ui
Record polished UI demo videos using Playwright. An agent skill from sanity-io/ui.
sanity-io/ui
Drive a Next.js route to instant navigation by setting up an agentic loop, under Cache Components / PPR, on initial load (hard navigation) and client-side navigation (soft navigation).
sanity-io/ui
Turn on Partial Prefetching in a Next.js app and work through the insights it surfaces.
sanity-io/ui
Integrates Sanity Live with Next.js Cache Components in next-sanity v13+ apps.
Categories
Inspect and profile the React component tree of a running Storybook story through chrome-devtools-mcp (React DevTools over the Chrome DevTools Protocol, via react-devtools-cdt-mcp). React Devtools MCP is an agent skill from sanity-io/ui, published by the product's own GitHub organization. Inspect and profile the React component tree of a running Storybook story through chrome-devtools-mcp (React DevTools over the Chrome DevTools Protocol, via react-devtools-cdt-mcp).
React Devtools MCP fits situations like: debugging why a @sanity/ui component re-renders; finding slow components; reading props and hooks at runtime; investigating a perf regression in a story.
Run `npx skills add sanity-io/ui --skill react-devtools-mcp -a claude-code`. Or copy the skill folder (.agents/skills/react-devtools-mcp in sanity-io/ui) into .claude/skills/react-devtools-mcp in your project. Claude Code loads it when a task matches its description.
Run `npx skills add sanity-io/ui --skill react-devtools-mcp -a codex`. Or copy the skill folder (.agents/skills/react-devtools-mcp in sanity-io/ui) into .agents/skills/react-devtools-mcp in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add sanity-io/ui --skill react-devtools-mcp -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/react-devtools-mcp, .gemini/skills/react-devtools-mcp, .github/skills/react-devtools-mcp and .opencode/skills/react-devtools-mcp in your project.
Going by SKILL.md and its folder, React Devtools MCP needs the command-line tools its instructions call (pnpm).
SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
React Devtools MCP is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2k tokens (SKILL.md is roughly 7.9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with React Devtools MCP: Design Review (pproenca/dot-skills, 215 stars), Extension Puppeteer Debugging (mengxi-ream/read-frog, 10k stars), Wonder Blocks (Khan/wonder-blocks, 163 stars) and Chrome Devtools MCP (managedcode/dotnet-skills, 486 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
sanity-io (a GitHub organization, an official publisher) maintains it in sanity-io/ui, which has 176 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 7, 2026.
Source: sanity-io/ui on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.