browser-compat-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@browser-compat-mcp-serverCheck Baseline status for CSS :has() selector"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Overview
Web platform compatibility for frontend work: per-browser support from MDN's @mdn/browser-compat-data, Baseline state and dates from web-features, and browserslist target resolution weighted by caniuse-lite usage figures. Every dataset ships inside the package, so there are no runtime network calls, no API key, no rate limit, and no upstream to be down — the same answers come back air-gapped. Runs as a stdio process or a local Streamable HTTP server.
Tools
Tool | Description |
| Enumerate the reference vocabulary the other tools expect — BCD namespaces and browser ids, browserslist agents, Baseline states, groups, and ECMAScript snapshots. |
| Full compatibility record for one feature: Baseline state, standards status, per-browser versions with flags and prefixes, MDN and specification links. |
| Ship-or-not across up to 20 features: Baseline state and date, the limiting browser, deprecation flags, and the traffic share requiring it would exclude. |
| Find features by plain name or keyword when the canonical key is unknown, ranked with the field that matched. |
| Check features against an explicit browserslist target query, reporting the failing target per feature and every target that could not be evaluated. |
Related MCP server: caniuse-mcp
Capability reference
browsercompat_list_reference tool
One required
topic:bcd_namespaces(12),bcd_browsers(17),browserslist_agents(19),baseline_states(4),groups(103),snapshots(11)Entries carry
id,label, anddetail, pluscount,reported,bcd_browser,usage_percent,maps_from, orspec_urlwhere the topic has thembrowserslist_agentsgives each agent's browser-compat-data counterpart ornull— thenullones can never be evaluated and always land inunchecked_targets
browsercompat_get_feature tool
One
featurestring, 1–200 characters: a BCD key (css.selectors.has) or a web-features id (has);resolved_asechoes which one matched and howresolve: trueaccepts the search index's single unambiguous top hit; off by default, so a typo returns a miss rather than a confident answer about the wrong featureinclude_runtimes: trueaddsbun,deno,nodejs, andoculusrows to the 13 reported desktop and mobile browsersoutcomeisfound|no_compat_data|miss— a miss isfound: falsewithguidance, never an errorA web-features id spanning more than one BCD key omits the per-key fields (
support,status,limiting_browser,mdn_url,spec_urls) and returnscompat_keysto re-call withTyped failure:
invalid_feature_input(whitespace-onlyfeature)
browsercompat_check_baseline tool
Up to 20 BCD keys or web-features ids per call, 1–200 characters each; one result per entry, in input order
Each result carries Baseline state and dates,
limiting_browser,deprecated/experimental/discouraged, andusage_percent_excludedalongside theusage_sourceit is a share ofusage_percent_excludedis absent — never zero — when the feature reaches no caniuse idall_widely_availableanswers the Baseline question alone: every entry resolved atwidely, one miss forces it false, and deprecation does not enter itTyped failure:
invalid_feature_input(a whitespace-only entry)
browsercompat_search_features tool
query1–100 characters, with optionalnamespace(one of the 12 BCD namespaces) andbaseline(widely|newly|limited|not_mapped) filters;limit1–50, default 10Every hit carries
matched_on, the field that matched, so the six-tier ranking is inspectable rather than a scoresupport_summaryis one line across the seven Baseline core browsers, with—for unsupported and?for unknownZero hits are a successful empty result plus a notice naming which filter to drop;
totalCountandtruncatedreport matches beyondlimitTyped failure:
invalid_query(a query that normalizes to zero tokens)
browsercompat_compare_support tool
Up to 20 features against a required
targetsbrowserslist query (defaults,> 0.5%, last 2 versions) — required so browserslist never falls back to config in the server's working directoryverdictper feature:clears|fails|inconclusive|miss|ambiguous;failing_targetsnames each failing target with the verdict behind it (partial,prefixed,flagged,removed,unsupported,preview_only)unchecked_targetslists every target the server declined to judge, withno_bcd_browser|unknown_version|no_bcd_data;all_clearrequires that list to be emptytarget_coverage_percentandunchecked_coverage_percentgive the caniuse-derived traffic share of the evaluated and unevaluated tokensTyped failures:
invalid_target_query,no_targets_resolved,invalid_feature_input
Data sources
Package | Version | License | Supplies |
| CC0-1.0 | Per-browser support, standards status, MDN and specification links | |
| Apache-2.0 | Baseline state and dates, discouraged flags, groups, ECMAScript snapshots | |
| CC-BY-4.0 | Usage weighting, plus feature titles for the search index | |
| MIT | Target query resolution and coverage figures |
CC BY 4.0 requires attribution wherever the caniuse data travels, so every response carrying a usage figure carries this string: Usage data from caniuse.com, © Can I Use contributors, CC BY 4.0. Figures are a share of the ~96.7% of global traffic caniuse tracks. Full license texts and notices are in THIRD_PARTY_NOTICES.md.
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
Browser-compat-specific:
All four datasets are bundled and loaded in process — no runtime network calls, no API key, no rate limit, and nothing to configure
Baseline is read per browser-compat-data key from
status.by_compat_key, never rolled up from the feature level, because keys under one feature legitimately disagreeOne shared resolver behind every tool: exact BCD key, then web-features id, then a
movedredirect, and only underresolve: truethe search index's single unambiguous hitTarget versions are ordered by browser-compat-data's release index rather than parsed version strings, with the caniuse spellings normalized both directions (
safari 16.0↔16,samsung 20↔20.0)
Agent-friendly output:
Every response echoes
data_version— the version of each bundled dataset behind the answer, since a pinned snapshot goes stale on exactly the newest featuresA verdict is never claimed for a browser that was not evaluated: unknown support moves the target into
unchecked_targetsand the feature toinconclusiveMisses are results, not failures —
found: falsewithguidancenaming the next call, and typed error reasons carrying recovery hints for the input a caller has to fixUsage figures state the population they are a share of, and carry the caniuse attribution on every response that reports one
Getting started
Add the following to your MCP client configuration file:
{
"mcpServers": {
"browser-compat-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/browser-compat-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"browser-compat-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/browser-compat-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"browser-compat-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/browser-compat-mcp-server:latest"
]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.4.0 or higher (or Node.js v24+).
No API keys, accounts, or network access required — every dataset ships with the package.
Installation
Clone the repository:
git clone https://github.com/cyanheads/browser-compat-mcp-server.gitNavigate into the directory:
cd browser-compat-mcp-serverInstall dependencies:
bun installConfigure environment (optional):
cp .env.example .env
# edit .env if you want to override transport or logging defaultsConfiguration
There are no server-specific environment variables: no API keys, no base URLs, and deliberately no browserslist configuration variable — the target query is always a tool input rather than ambient state. Only the framework transport settings apply.
Variable | Description | Default |
| Transport: |
|
| Port for the HTTP server. |
|
See .env.example for the full list of optional framework overrides.
Running the server
Local development
# One-time build
bun run rebuild
# Run the built server
bun run start:stdio
# or
bun run start:httpbun run devcheck # Lint, format, typecheck, security
bun run test # Vitest test suite
bun run lint:mcp # Validate MCP definitions against specDocker
docker build -t browser-compat-mcp-server .
docker run --rm -p 3010:3010 browser-compat-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/browser-compat-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
| The browserslist agent to browser-compat-data browser map. |
| Tool definitions ( |
| bcd, baseline, targets, search, and data-version services over the bundled datasets. |
| Ambient module declaration for |
| Vitest suites mirroring |
|
|
| Per-version changelog files. |
The generated file tree is docs/tree.md.
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools directly in
src/index.tsData integrity: read the bundled datasets as they are and preserve their uncertainty; never fabricate a support fact the data does not carry
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Browser support for web features, live from caniuse. From which version, and is it safe to ship?
What CSS you can actually ship today, from live Baseline data and MDN browser-compat-data.
DevDocs.io keyless docs index + entry search + content (Angular, MDN, Rust, etc.).
Explore, query, and inspect SQLite databases with ease. List tables, preview results, and view det…
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides intelligent CSS/JS feature compatibility checking with configurable browser targets, polyfill support, and smart project scanning. Enables developers to automatically detect browser compatibility issues and get actionable remediation steps with build tool configurations.511 npm3MIT
- AlicenseAqualityCmaintenanceAn MCP server that provides browser compatibility data and web API support information using caniuse.com, MDN BCD, and Web Features, enabling developers to check feature support across browsers and against browserslist configurations.317 npm5MIT
- AlicenseAqualityDmaintenanceEnables checking web feature compatibility with Baseline standards, analyzing HTML, CSS, and JavaScript code to provide detailed reports on Baseline status, browser support, and recommendations.2MIT
- AlicenseNot gradedqualityBmaintenanceEnables MIME type lookup and extension resolution for filenames and extensions, supporting offline, keyless queries.4 npmMIT