GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
作者提供的说明(英文原文)
MCP server and CLI that makes CSS legible to AI agents — explains what applies and why.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"stylespeak": {
"command": "npx",
"args": [
"-y",
"@patrizzos/stylespeak"
]
}
}
}在终端中运行这条命令
claude mcp add stylespeak -- npx -y @patrizzos/stylespeak粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"stylespeak": {
"command": "npx",
"args": [
"-y",
"@patrizzos/stylespeak"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"stylespeak": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@patrizzos/stylespeak"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 patrizzos 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(1.2.0)于3个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。
同一分类中有:GitHub, Desktop Commander, Cloudflare MCP
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
MCP server for terminal commands, file operations, and process management
Cloudflare MCP servers
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
A companion MCP server and CLI to stylesafe that makes CSS legible to AI agents — resolving cascade, tracing properties, predicting change impact, and explaining what applies and why before an agent touches a single line of styles.
AI coding agents write CSS without being able to see its effect. They modify a rule, assume it worked, and move on — unaware that a higher-specificity rule elsewhere already overrides it, a combinator rule in another file is silently winning, or a CSS variable resolves to something entirely different than expected. stylespeak gives agents a structured knowledge layer to consult *before* making changes.
`resolve_styles` — answers "what CSS actually applies to this selector?"
Given a selector and a set of files, returns every CSS property the selector would receive, which rule wins for each, and which rules were overridden — with confidence levels since no real DOM is available. CSS custom properties (var()) are resolved to their actual values, including chained variables, fallbacks, and media-context overrides.
`trace_property` — answers "everywhere this property is set, who wins?"
Given a property name and a set of files, returns every rule that sets it, groups competing rules that target overlapping selectors, and shows the full cascade chain for each group — with resolved variable values included.
`impact_preview` — answers "if I change this, what else breaks?"
Given a selector, property, and optional new value, predicts the full blast radius of the change before it's made — showing which selectors will see a different value, which are shielded by higher specificity, which cascade relationships are uncertain, and which downstream rules are affected through CSS variable chains or property inheritance. Works without a browser.
`style_manifest` — answers "what does this entire project's CSS look like at a glance?"
Builds a compressed, structured summary of a project's entire CSS knowledge — selectors, properties, variables, competition groups, and risk hotspots — that an agent can load once at the start of a session and keep in context instead of repeatedly querying individual files.
`live_resolve` — answers "what does the browser actually compute for this selector?"
Queries a running Chromium browser via CDP and returns exact computed styles and matched rules. No heuristics, no confidence levels — the browser resolved it. Requires Chrome running with --remote-debugging-port=9222.
Works on more than plain CSS. The four static tools above analyze .css, .scss, CSS Modules, and — as of v1.3 — styled-components and Emotion source files (.js / .jsx / .ts / .tsx), all through the same cascade engine.
npm install -g @patrizzos/stylespeak
stylespeak resolve ".btn.primary" src/styles/main.css
stylespeak trace "color" --projectRoot src/styles stylespeak impact ".btn" "background-color" src/styles/main.css --newValue "#ff0000" stylespeak manifest --projectRoot src/styles
-> .Button)stylespeak resolve ".Button" src/components/Button.jsx stylespeak manifest --projectRoot src
Add to your MCP client config (Cursor: .cursor/mcp.json, VS Code: .vscode/mcp.json):
{
"mcpServers": { "stylespeak": { "command": "node", "args": ["/absolute/path/to/stylespeak/src/server.js"] } } }
Once connected, agents can call:
resolve_styles({ selector, files, projectRoot, componentFiles? })trace_property({ property, files, projectRoot })impact_preview({ selector, property, newValue?, files, projectRoot })style_manifest({ files?, projectRoot?, maxSelectors? })live_resolve({ selector, port?, tabUrl? })stylespeak impact ".btn" "background-color" src/styles/buttons.css --newValue "#ff0000"
{
"change": { "selector": ".btn", "property": "background-color", "currentValue": "var(--color-primary)", "newValue": "#ff0000" }, "blastRadius": { "total": 3, "valueChanges": 1, "shielded": 1, "risks": 0, "variableDownstream": 0, "inheritanceDownstream": 1 }, "riskLevel": "low", "safeToChange": true, "impacts": [ { "type": "value-change", "affectedSelector": ".btn", "currentValue": "var(--color-primary)", "newValue": "#ff0000", "confidence": "certain" }, { "type": "shielded", "affectedSelector": ".btn.primary", "shieldingValue": "darkblue", "confidence": "certain", "reason": ".btn.primary has higher specificity — elements with both classes won't be affected" } ], "summary": "1 selector will see a different value, 1 selector is shielded by higher specificity.", "agentNote": "Change appears safe to make. Shielded selectors are safe — higher-specificity rules protect those elements." }
stylespeak resolve ".btn" src/styles/buttons.css
{
"properties": { "background-color": { "winner": { "value": "var(--color-primary)", "resolvedValue": "#2563eb", "variableChain": ["--color-primary → #2563eb"], "selector": ".btn", "specificity": "(0,0,1,0)" }, "confidence": "certain" } }, "variables": { "--color-primary": { "value": "#2563eb", "selector": ":root" } } }
| Level | Meaning |
|---|---|
certain | Exact selector match — rule definitively applies |
likely | Rule tokens are a subset of the queried selector — applies in most cases |
possible | Combinator rule — depends on DOM ancestry, unknown without rendering |
exact | Returned by live_resolve only — browser-resolved, no heuristics |
As of v0.2, stylespeak fully resolves CSS custom properties (var()) in all output:
value — the raw value as written (var(--color-primary))resolvedValue — the actual resolved value (#2563eb)variableChain — the full resolution path, including chained variablesconditionalValues — media-context overrides where the variable resolves differentlySupported: simple, fallback, nested fallback, chained, scoped, media-context, circular reference protection.
As of v1.3, stylespeak statically extracts styles from .js, .jsx, .ts, .tsx, .mjs and .cjs files that import styled-components, @emotion/styled, @emotion/react or @emotion/css, and runs them through the same cascade engine as plain CSS. resolve_styles, trace_property, impact_preview and style_manifest all work on them, and CSS-in-JS and regular CSS can be analyzed together.
Pass JS/TS files in files, or point projectRoot at a directory — files that import one of these libraries are discovered automatically and all other JS/TS files are ignored.
Generated class names are hashed at runtime, so each styled component is addressed by its variable name as a class selector:
const Button = styled.button`...`; // -> .Button
export default styled.section...; // -> .Card (named after the file, e.g. Card.jsx)
Rules are tagged cssInJs, library and component, and are treated as locally scoped (like CSS Modules): two components named Wrapper in different files are independent, never reported as conflicting, and never counted as a "declared in N locations" risk. Querying such a name is flagged as ambiguous, because results will mix both files.
| Syntax | Handling |
|---|---|
| Tagged templates | styled.div`…` , styled(Comp)`…` , styled.div.attrs(…)`…` , styled.div `…` (TypeScript generics), css`…` |
| Object syntax | styled.div({ … }), styled(Comp)({ … }), css({ … }), styled.div(props => ({ … })) |
| Global styles | createGlobalStyle / injectGlobal — real selectors, not locally scoped |
| Nesting | &, && (specificity bump), &:hover, bare :hover, nested selectors, @media / @supports / @container |
| Component selectors | ${Icon} { … } becomes .Icon, e.g. .Button .Icon |
| Constants | Same-file const strings, numbers and object paths: ${SPACING}, ${colors.primary}, @media ${bp.md} |
css helpers | Same-file const mixin = css`…` is inlined where interpolated (${mixin}, ...mixin) and is also queryable by its own name (tagged css-helper) — useful because Emotion's css={mixin} prop makes the helper the only visible record of those styles |
| Object notation | camelCase becomes kebab-case, vendor prefixes (WebkitX → -webkit-x, msX → -ms-x), unitless numbers get px (except unitless properties like opacity, z-index, line-height) |
Values that depend on props or theme can't be known statically. stylespeak keeps the original expression, marks it, and tells the agent:
"color": {
"winner": { "value": "${props => props.color}", "selector": ".Button", "cssInJs": true, "library": "styled-components", "component": "Button", "dynamic": true }, "confidence": "certain", "dynamic": true }
dynamic: true on a declaration, winner and property means the value depends on runtime props/theme — the winner may differ depending on props.${p => p.active && css…}) can't be evaluated. They are dropped and counted in dynamicInterpolations, and agentNote warns that additional styles may apply at runtime.cssInJs.skipped in style_manifest output instead of being silently ignored.styled(Base) records extends; agentNote tells the agent to also resolve the base component.This is static analysis, so there are boundaries:
styled(Base) does not merge the base component's styles into the child — resolve the base selector separately.ThemeProvider themes are not resolved.css prop on JSX elements and style blocks not assigned to a named variable are anonymous — there is no selector to target, so they are reported as skipped.keyframes are not modeled, and .attrs({ className }) is not considered.live_resolve against the real element.stylesafe catches problems in your CSS — conflicts, dead rules, Tailwind clashes — before they ship.
stylespeak explains your CSS — resolving cascade, tracing properties, predicting impact, resolving variables — so agents understand before they act.
Use stylesafe as a post-edit check. Use stylespeak as a pre-edit consultation. Together they give AI coding agents a complete feedback loop on styles.
live_resolve requires a Chromium browser running with remote debugging enabled:
# Windows
chrome.exe --remote-debugging-port=9222
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222
google-chrome --remote-debugging-port=9222
Security note: Never run
--remote-debugging-porton a machine exposed to untrusted networks or in production. This flag opens a local API that any process on the machine can connect to.
| Format | Support level |
|---|---|
.css | Full |
.scss | Full — nesting, & references, @media passthrough |
| .module.css / `.
只显示了开头部分;其余内容请在仓库中阅读