browser-compat-mcp-server
What this MCP does
Queries bundled MDN compatibility data to check browser support, Baseline status, deprecation, and browserslist targets for web features.
Tools
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['features'], 'properties': {'resolve': {'type': 'boolean', 'default': False, 'description': 'When true, an entry that is neither a key nor an id falls back to the search index, such as "Container queries (size)" or "Element.prototype.animate". Its best exact matches are accepted only when they name one feature: a single key resolves to that key, several keys of one web-features feature resolve to the feature with its feature-level Baseline and compat_keys, and matches spanning two features are a miss. Off by default so a typo returns a miss you can correct.'}, 'features': {'type': 'array', 'items': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'maxItems': 20, 'minItems': 1, 'description': 'Up to 20 entries, each a browser-compat-data key such as css.selectors.has or a web-features id such as has, 1 to 200 characters. An empty or longer entry is rejected against this schema; a whitespace-only entry returns invalid_feature_input. Call browsercompat_search_features first for any entry whose key you do not already know.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'all_widely_available', 'data_version', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_feature_input'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_feature_input`: An entry in features is whitespace-only. An empty or over-200-character entry is rejected against the input schema instead. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['input', 'found', 'outcome', 'resolved_as'], 'properties': {'name': {'type': 'string', 'description': 'web-features display name for the feature.'}, 'found': {'type': 'boolean', 'description': 'True when the feature string resolved to a tracked entry.'}, 'input': {'type': 'string', 'description': 'The feature string as the caller sent it.'}, 'outcome': {'enum': ['found', 'no_compat_data', 'miss'], 'type': 'string', 'description': 'found when Baseline data was returned, no_compat_data when the entry owns no browser-compat-data keys, miss when nothing matched.'}, 'baseline': {'type': 'object', 'required': ['state'], 'properties': {'state': {'enum': ['widely', 'newly', 'limited', 'not_mapped'], 'type': 'string', 'description': 'widely and newly are Baseline availability, limited means not yet in every core browser, not_mapped means the key sits outside the web-features mapping.'}, 'high_date': {'type': 'string', 'description': 'Date the feature became widely available, verbatim from web-features â\x80\x94 may carry a â\x89¤ prefix.'}, 'since_date': {'type': 'string', 'description': 'Date the feature became newly available, verbatim from web-features â\x80\x94 may carry a â\x89¤ prefix.'}, 'date_is_upper_bound': {'type': 'boolean', 'description': 'True when a date above is â\x89¤-prefixed, so it is an upper bound rather than exact.'}}, 'description': 'Baseline state and the dates it crossed.', 'additionalProperties': False}, 'guidance': {'type': 'string', 'description': 'What to do next when the feature did not resolve.'}, 'deprecated': {'type': 'boolean', 'description': 'True when browser-compat-data marks the key deprecated. Absent for keys that record no status and for ids spanning more than one key.'}, 'compat_keys': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Present when the web-features id spans more than one browser-compat-data key. Call browsercompat_get_feature with one of them for per-browser data.'}, 'discouraged': {'type': 'object', 'required': ['reason', 'according_to'], 'properties': {'reason': {'type': 'string', 'description': 'Why the feature is discouraged, as web-features states it.'}, 'according_to': {'type': 'array', 'items': {'type': 'string'}, 'description': 'URLs of the bodies that discourage the feature.'}}, 'description': 'Present when web-features records that the feature is discouraged.', 'additionalProperties': False}, 'resolved_as': {'anyOf': [{'type': 'object', 'required': ['input', 'bcd_key', 'baseline_id', 'resolved_via'], 'properties': {'input': {'type': 'string', 'description': 'The feature string as the caller sent it, trimmed.'}, 'bcd_key': {'type': ['string', 'null'], 'description': 'The single browser-compat-data key this resolved to, or null when the web-features id spans more than one key.'}, 'baseline_id': {'type': ['string', 'null'], 'description': 'The web-features id this resolved to, or null when no web-features entry covers the key.'}, 'resolved_via': {'enum': ['bcd_key', 'web_features_id', 'web_features_id_normalized', 'redirect', 'search'], 'type': 'string', 'description': 'Which step of the resolution order matched: bcd_key or web_features_id for an exact match, web_features_id_normalized when it matched only after lowercasing, redirect when the input pointed to a browser-compat-data entry that has moved or split, or search when resolve was true and the best exact matches in the search index all named one feature or key â\x80\x94 treat a search match as a best guess, not a confirmed key.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'How the feature string was matched, or null on a miss.'}, 'experimental': {'type': 'boolean', 'description': 'True when browser-compat-data marks the key experimental. Absent under the same conditions as deprecated.'}, 'usage_source': {'type': 'string', 'description': 'What usage_percent_excluded is a share of. Present whenever that figure is.'}, 'limiting_browser': {'type': 'object', 'required': ['browser_id', 'name', 'version'], 'properties': {'name': {'type': 'string', 'description': 'Human-readable browser name.'}, 'version': {'type': 'string', 'description': 'Release of that browser the feature requires.'}, 'browser_id': {'type': 'string', 'description': 'browser-compat-data browser id.'}}, 'description': 'Among the Baseline core browsers, the one requiring the newest release. Present only when every core browser has full, unprefixed, unflagged support at a resolvable added release.', 'additionalProperties': False}, 'usage_percent_excluded': {'type': 'number', 'description': 'Feature-level share of tracked traffic excluded. A resolved BCD key receives it only when it is the featureâ\x80\x99s sole declared compat key. Absent without caniuse data â\x80\x94 never zero in that case.'}}, 'description': 'One result per input entry, in input order.', 'additionalProperties': False}, 'description': 'One result per requested feature. A miss is a result, not a failure.'}, 'totalCount': {'type': 'number', 'description': 'Number of results returned.'}, 'attribution': {'type': 'string', 'description': 'Required attribution for the caniuse-derived usage figures in this response.'}, 'data_version': {'type': 'object', 'required': ['bcd', 'bcd_generated', 'web_features', 'caniuse_lite', 'browserslist'], 'properties': {'bcd': {'type': 'string', 'description': 'Version of the bundled @mdn/browser-compat-data snapshot.'}, 'browserslist': {'type': 'string', 'description': 'Version of the bundled browserslist query resolver.'}, 'caniuse_lite': {'type': 'string', 'description': 'Version of the bundled caniuse-lite snapshot.'}, 'web_features': {'type': 'string', 'description': 'Version of the bundled web-features snapshot.'}, 'bcd_generated': {'type': 'string', 'description': 'ISO 8601 timestamp the browser-compat-data snapshot was generated at.'}}, 'description': 'Vintage of each bundled dataset behind this answer.', 'additionalProperties': False}, 'unresolvedNotice': {'type': 'string', 'description': 'Names the entries that did not resolve and how to find the right key.'}, 'all_widely_available': {'type': 'boolean', 'description': 'True only when every entry resolved and reports Baseline widely. A single miss forces false. Deprecation and discouragement do not enter this answer.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['features', 'targets'], 'properties': {'resolve': {'type': 'boolean', 'default': False, 'description': 'When true, an entry that is neither a key nor an id falls back to the search index, such as "Container queries (size)" or "Element.prototype.animate". Its best exact matches are accepted only when they name one feature: a single key resolves to that key and gets a verdict, several keys of one web-features feature resolve to the feature as verdict ambiguous with compat_keys, and matches spanning two features are a miss. Off by default so a typo returns a miss you can correct rather than a confident answer about the wrong feature.'}, 'targets': {'type': 'string', 'maxLength': 500, 'minLength': 1, 'description': 'A browserslist query, for example "defaults" or "> 0.5%, last 2 versions", 1 to 500 characters. Required: with no query browserslist would read config from the process working directory rather than from your project.'}, 'features': {'type': 'array', 'items': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'maxItems': 20, 'minItems': 1, 'description': 'Up to 20 entries, each a browser-compat-data key such as css.selectors.has or a web-features id such as has, 1 to 200 characters. An empty or longer entry is rejected against this schema; a whitespace-only entry returns invalid_feature_input. Call browsercompat_search_features first for any entry whose key you do not already know.'}, 'target_limit': {'type': 'integer', 'default': 10, 'maximum': 10, 'minimum': 1, 'description': 'How many query targets this page covers, 1 to 10. It bounds every list of target rows in the response and never the evaluation: verdicts, coverage, and totals always describe the whole query.'}, 'target_offset': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Zero-based position in the target list of the query at which this page of target rows starts. Pass the nextOffset of the previous response to continue. An offset at or past the number of targets returns the whole-query verdicts and totals with no target rows.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['query_echo', 'comparable_features', 'targets_resolved', 'targets_resolved_total', 'evaluated_targets_total', 'unchecked_targets', 'unchecked_targets_total', 'target_coverage_percent', 'unchecked_coverage_percent', 'results', 'all_clear', 'data_version', 'totalCount', 'shown', 'cap', 'truncated', 'attribution']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The target_limit that was applied.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_target_query', 'no_targets_resolved', 'invalid_feature_input'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_target_query`: browserslist rejected the targets query. `no_targets_resolved`: The query matched no browser versions at all, or only agents with no browser-compat-data counterpart. A mapped agent whose version token does not resolve is reported in unchecked_targets instead. `invalid_feature_input`: An entry in features is whitespace-only. An empty or over-200-character entry is rejected against the input schema instead. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Number of query targets this page covers.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['input', 'found', 'resolved_as', 'verdict', 'failing_targets'], 'properties': {'name': {'type': 'string', 'description': 'web-features display name for the feature.'}, 'found': {'type': 'boolean', 'description': 'True when the feature string resolved to a tracked entry.'}, 'input': {'type': 'string', 'description': 'The feature string as the caller sent it.'}, 'verdict': {'enum': ['clears', 'fails', 'inconclusive', 'miss', 'ambiguous'], 'type': 'string', 'description': 'Judged over the whole query, never over one page. fails when any evaluated target does not support the feature; inconclusive when nothing failed but at least one target in the query was not evaluated for this feature, including when none was; clears only when every target in the query was evaluated and supports it; miss when the entry did not resolve; ambiguous when the id spans more than one compat key or owns none.'}, 'guidance': {'type': 'string', 'description': 'What to do next on a miss or an ambiguous verdict.'}, 'compat_keys': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Present on an ambiguous verdict â\x80\x94 the browser-compat-data keys the feature owns. Re-run with one of them.'}, 'resolved_as': {'anyOf': [{'type': 'object', 'required': ['input', 'bcd_key', 'baseline_id', 'resolved_via'], 'properties': {'input': {'type': 'string', 'description': 'The feature string as the caller sent it, trimmed.'}, 'bcd_key': {'type': ['string', 'null'], 'description': 'The single browser-compat-data key this resolved to, or null when the web-features id spans more than one key.'}, 'baseline_id': {'type': ['string', 'null'], 'description': 'The web-features id this resolved to, or null when no web-features entry covers the key.'}, 'resolved_via': {'enum': ['bcd_key', 'web_features_id', 'web_features_id_normalized', 'redirect', 'search'], 'type': 'string', 'description': 'Which step of the resolution order matched: bcd_key or web_features_id for an exact match, web_features_id_normalized when it matched only after lowercasing, redirect when the input pointed to a browser-compat-data entry that has moved or split, or search when resolve was true and the best exact matches in the search index all named one feature or key â\x80\x94 treat a search match as a best guess, not a confirmed key.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'How the feature string was matched, or null on a miss.'}, 'failing_total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Failing targets across the whole query. Present when the feature was compared, as are the five fields after it.'}, 'evaluated_total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Query targets this feature has compatibility data for, across the whole query.'}, 'failing_targets': {'type': 'array', 'items': {'type': 'object', 'required': ['agent', 'version_token', 'bcd_browser', 'bcd_version', 'verdict'], 'properties': {'agent': {'type': 'string', 'description': 'browserslist agent id the target came from.'}, 'verdict': {'enum': ['partial', 'prefixed', 'flagged', 'removed', 'unsupported', 'preview_only'], 'type': 'string', 'description': 'Why this target failed: partial means the implementation does not meet the mandatory specified behavior, prefixed means it only ships under a vendor prefix or a different name, flagged means it only works behind a preference or runtime flag, removed means it shipped and was later removed before this target version, unsupported means it was never added, preview_only means it only works in a preview channel.'}, 'bcd_browser': {'type': 'string', 'description': 'browser-compat-data browser the agent maps to.'}, 'bcd_version': {'type': ['string', 'null'], 'description': 'browser-compat-data release the token mapped to, or null when it predates them all.'}, 'version_token': {'type': 'string', 'description': 'Version token browserslist produced for that agent.'}}, 'description': 'A target this feature does not clear.', 'additionalProperties': False}, 'description': 'The failing targets among the query targets on this page, with the verdict that caused each. Empty on a page that holds none even when failing_total is above zero.'}, 'unchecked_total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Query targets not evaluated for this feature, across the whole query. evaluated_total plus unchecked_total is the number of targets in the query.'}, 'unchecked_targets': {'type': 'array', 'items': {'type': 'object', 'required': ['agent', 'version_token', 'reason', 'usage_percent'], 'properties': {'agent': {'type': 'string', 'description': 'browserslist agent id.'}, 'reason': {'enum': ['no_bcd_browser', 'unknown_version', 'no_bcd_data', 'no_comparable_feature'], 'type': 'string', 'description': 'no_bcd_browser when the agent has no browser-compat-data counterpart, unknown_version when the token maps to no release, no_bcd_data when a compared feature records nothing for that browser, no_comparable_feature when every entry in features was a miss or ambiguous so nothing was compared.'}, 'usage_percent': {'type': 'number', 'description': 'Share of tracked global traffic this target covers.'}, 'version_token': {'type': 'string', 'description': 'Version token browserslist produced for that agent.'}}, 'description': 'A target this feature was not evaluated against.', 'additionalProperties': False}, 'description': 'The targets not evaluated for this feature among the query targets on this page, each with its reason.'}, 'evaluated_coverage_percent': {'type': 'number', 'description': 'Share of tracked global traffic the targets evaluated for this feature cover.'}, 'unchecked_coverage_percent': {'type': 'number', 'description': 'Share of tracked global traffic the targets not evaluated for this feature cover.'}}, 'description': 'One result per input entry, in input order.', 'additionalProperties': False}, 'description': 'Per-feature verdicts and totals over the whole query, each with its own target rows for this page.'}, 'all_clear': {'type': 'boolean', 'description': 'True only when every feature clears, which requires every target in the query to have been evaluated for it.'}, 'truncated': {'type': 'boolean', 'description': 'True when more query targets remain past this page.'}, 'nextOffset': {'type': 'number', 'description': 'The target_offset of the next page. Present only while targets remain past this page.'}, 'query_echo': {'type': 'string', 'description': 'The targets query as the server parsed it.'}, 'totalCount': {'type': 'number', 'description': 'Number of targets the query resolved to, across every page.'}, 'attribution': {'type': 'string', 'description': 'Required attribution for the caniuse-derived coverage figures in this response.'}, 'data_version': {'type': 'object', 'required': ['bcd', 'bcd_generated', 'web_features', 'caniuse_lite', 'browserslist'], 'properties': {'bcd': {'type': 'string', 'description': 'Version of the bundled @mdn/browser-compat-data snapshot.'}, 'browserslist': {'type': 'string', 'description': 'Version of the bundled browserslist query resolver.'}, 'caniuse_lite': {'type': 'string', 'description': 'Version of the bundled caniuse-lite snapshot.'}, 'web_features': {'type': 'string', 'description': 'Version of the bundled web-features snapshot.'}, 'bcd_generated': {'type': 'string', 'description': 'ISO 8601 timestamp the browser-compat-data snapshot was generated at.'}}, 'description': 'Vintage of each bundled dataset behind this answer.', 'additionalProperties': False}, 'offsetNotice': {'type': 'string', 'description': 'Why this page carries no target rows, and the offsets that do.'}, 'uncheckedNotice': {'type': 'string', 'description': 'How many of the query targets were not evaluated for every compared feature, the agents they belong to, and their combined usage share.'}, 'targets_resolved': {'type': 'array', 'items': {'type': 'object', 'required': ['agent', 'version_token', 'bcd_browser', 'bcd_version', 'bcd_release_index', 'evaluated'], 'properties': {'agent': {'type': 'string', 'description': 'browserslist agent id.'}, 'evaluated': {'type': 'boolean', 'description': 'True when every compared feature has compatibility data for this target. False when at least one compared feature records nothing for its browser, or when no feature in the call was comparable â\x80\x94 the target then also appears in unchecked_targets. Mapping onto a release is not evaluation.'}, 'bcd_browser': {'type': 'string', 'description': 'browser-compat-data browser the agent maps to.'}, 'bcd_version': {'type': ['string', 'null'], 'description': 'browser-compat-data release the token mapped to, or null when it predates them all.'}, 'version_token': {'type': 'string', 'description': 'Version token browserslist produced for that agent.'}, 'bcd_release_index': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Release ordinal used for comparison; -1 when the token predates every release.'}}, 'description': 'A target that mapped onto a concrete release.', 'additionalProperties': False}, 'description': 'The mapping inventory for the query targets on this page: each target that maps onto a browser-compat-data release, and whether it was evaluated. A target with no mapping appears only in unchecked_targets.'}, 'unchecked_targets': {'type': 'array', 'items': {'type': 'object', 'required': ['agent', 'version_token', 'reason', 'usage_percent'], 'properties': {'agent': {'type': 'string', 'description': 'browserslist agent id.'}, 'reason': {'enum': ['no_bcd_browser', 'unknown_version', 'no_bcd_data', 'no_comparable_feature'], 'type': 'string', 'description': 'no_bcd_browser when the agent has no browser-compat-data counterpart, unknown_version when the token maps to no release, no_bcd_data when a compared feature records nothing for that browser, no_comparable_feature when every entry in features was a miss or ambiguous so nothing was compared.'}, 'usage_percent': {'type': 'number', 'description': 'Share of tracked global traffic this target covers.'}, 'version_token': {'type': 'string', 'description': 'Version token browserslist produced for that agent.'}}, 'description': 'A target that was not evaluated.', 'additionalProperties': False}, 'description': 'The query targets on this page that were not evaluated for every compared feature, each with the reason.'}, 'comparable_features': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many entries in features were compared against the targets. A miss or an ambiguous entry is not comparable; at 0 nothing was evaluated.'}, 'targets_resolved_total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Query targets that map onto a browser-compat-data release, across every page.'}, 'evaluated_targets_total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Query targets evaluated for every compared feature, across every page. evaluated_targets_total plus unchecked_targets_total is the number of targets in the query.'}, 'target_coverage_percent': {'type': 'number', 'description': 'Share of tracked global traffic covered by the targets evaluated for every compared feature; 0 when no feature was comparable.'}, 'unchecked_targets_total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Query targets not evaluated for every compared feature, across every page.'}, 'unchecked_coverage_percent': {'type': 'number', 'description': 'Share of tracked global traffic covered by the targets counted in unchecked_targets_total.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['feature'], 'properties': {'feature': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'A browser-compat-data key such as css.selectors.has, or a web-features id such as has, 1 to 200 characters. An empty or longer string is rejected against this schema; a whitespace-only string returns invalid_feature_input. Call browsercompat_search_features first if you do not already know the key.'}, 'resolve': {'type': 'boolean', 'default': False, 'description': 'When true, a string that is neither a key nor an id falls back to the search index, such as "Container queries (size)" or "Element.prototype.animate". Its best exact matches are accepted only when they name one feature: a single key resolves to that key, several keys of one web-features feature resolve to the feature with compat_keys, and matches spanning two features are a miss. Off by default so a typo returns a miss you can correct rather than a confident answer about the wrong feature.'}, 'subkeys_offset': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Direct child keys to skip, default 0. Each subkeys page contains at most 100 keys; pass its next_offset to continue.'}, 'include_runtimes': {'type': 'boolean', 'default': False, 'description': 'Add the bun, deno, nodejs, and oculus rows to support. Leave off for browser ship decisions.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['found', 'outcome', 'resolved_as', 'data_version']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'name': {'type': 'string', 'description': 'web-features display name for the feature.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_feature_input'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_feature_input`: feature is whitespace-only. An empty or over-200-character string is rejected against the input schema instead. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'found': {'type': 'boolean', 'description': 'True when the feature string resolved to a tracked entry.'}, 'status': {'type': 'object', 'required': ['deprecated', 'experimental', 'standard_track'], 'properties': {'deprecated': {'type': 'boolean', 'description': 'True when browser-compat-data marks the feature deprecated.'}, 'discouraged': {'type': 'object', 'required': ['reason', 'according_to'], 'properties': {'reason': {'type': 'string', 'description': 'Why the feature is discouraged, as web-features states it.'}, 'according_to': {'type': 'array', 'items': {'type': 'string'}, 'description': 'URLs of the bodies that discourage the feature.'}}, 'description': 'Present when web-features records that the feature is discouraged.', 'additionalProperties': False}, 'experimental': {'type': 'boolean', 'description': 'True when browser-compat-data marks the feature experimental.'}, 'standard_track': {'type': 'boolean', 'description': 'True when the feature is part of an active specification process.'}}, 'description': 'Standards status for the resolved key. Absent for webextensions keys, which record none, and when the id spans more than one key.', 'additionalProperties': False}, 'mdn_url': {'type': 'string', 'description': 'MDN reference page for the resolved key.'}, 'outcome': {'enum': ['found', 'no_compat_data', 'miss'], 'type': 'string', 'description': 'found when per-feature data was returned, no_compat_data when the entry is tracked but owns no browser-compat-data keys, miss when nothing matched.'}, 'subkeys': {'type': 'object', 'required': ['total', 'keys', 'truncated'], 'properties': {'keys': {'type': 'array', 'items': {'type': 'string'}, 'description': 'At most 100 direct child keys, in BCD traversal order. Call browsercompat_get_feature for one, or browsercompat_check_baseline for up to 20.'}, 'total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Total direct callable child keys, before paging.'}, 'truncated': {'type': 'boolean', 'description': 'True when more direct children remain after this page.'}, 'next_offset': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Offset for the next page; absent at or past the end.'}}, 'description': 'Direct child compat records of the resolved BCD key. Absent for childless keys and resolutions without a single key.', 'additionalProperties': False}, 'support': {'type': 'array', 'items': {'type': 'object', 'required': ['browser_id', 'browser_name', 'verdict'], 'properties': {'flags': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'type'], 'properties': {'name': {'type': 'string', 'description': 'Name of the flag or preference to configure.'}, 'type': {'enum': ['preference', 'runtime_flag'], 'type': 'string', 'description': 'Whether the gate is a user preference or a runtime flag.'}, 'value_to_set': {'type': 'string', 'description': 'Value the flag must be set to.'}}, 'description': 'A flag that must be configured for support.', 'additionalProperties': False}, 'description': 'Flags gating support in this browser.'}, 'notes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Notes from browser-compat-data about this support, always an array.'}, 'prefix': {'type': 'string', 'description': 'Vendor prefix the feature ships under.'}, 'partial': {'type': 'boolean', 'description': 'True when the implementation does not meet the mandatory specified behavior.'}, 'verdict': {'enum': ['supported', 'partial', 'prefixed', 'flagged', 'removed', 'unsupported', 'preview_only', 'unknown'], 'type': 'string', 'description': 'supported means full support with no flags, prefix, or partial implementation; partial means the implementation does not meet the mandatory specified behavior; prefixed means it ships under a vendor prefix or an entirely different name; flagged means it only works behind a preference or runtime flag; removed means it shipped and was later removed; unsupported means it was never added; preview_only means it only works in a preview channel; unknown means the browser is absent from the data or support predates a â\x89¤ bound â\x80\x94 unknown never means unsupported.'}, 'impl_url': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Links to bugs or issues tracking the implementation, always an array.'}, 'browser_id': {'type': 'string', 'description': 'browser-compat-data browser id.'}, 'browser_name': {'type': 'string', 'description': 'Human-readable browser name.'}, 'version_last': {'type': 'string', 'description': 'Last release that still supported the feature.'}, 'version_added': {'type': 'string', 'description': 'Release that added support.'}, 'version_removed': {'type': 'string', 'description': 'Release that removed support.'}, 'alternative_name': {'type': 'string', 'description': 'Entirely different name the feature is implemented under.'}, 'version_added_is_upper_bound': {'type': 'boolean', 'description': 'True when the data says support arrived at or before version_added, not exactly at it.'}}, 'description': 'Support for one reported browser.', 'additionalProperties': False}, 'description': 'One row per reported browser. Absent when the id spans more than one browser-compat-data key.'}, 'baseline': {'type': 'object', 'required': ['state'], 'properties': {'state': {'enum': ['widely', 'newly', 'limited', 'not_mapped'], 'type': 'string', 'description': 'widely and newly are Baseline availability, limited means not yet in every core browser, not_mapped means the key sits outside the web-features mapping.'}, 'high_date': {'type': 'string', 'description': 'Date the feature became widely available, verbatim from web-features â\x80\x94 may carry a â\x89¤ prefix.'}, 'since_date': {'type': 'string', 'description': 'Date the feature became newly available, verbatim from web-features â\x80\x94 may carry a â\x89¤ prefix.'}, 'date_is_upper_bound': {'type': 'boolean', 'description': 'True when a date above is â\x89¤-prefixed, so it is an upper bound rather than exact.'}}, 'description': 'Baseline state for the resolved key, or the feature rollup when a web-features id resolved to more than one key.', 'additionalProperties': False}, 'guidance': {'type': 'string', 'description': 'What to do next on a miss or with no compat data.'}, 'spec_urls': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Specification URLs for the resolved key, always an array.'}, 'compat_keys': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Present when the web-features id spans more than one browser-compat-data key. Call this tool again with one of them for the per-browser fields.'}, 'description': {'type': 'string', 'description': 'web-features description, or the browser-compat-data description with tags stripped.'}, 'discouraged': {'type': 'object', 'required': ['reason', 'according_to'], 'properties': {'reason': {'type': 'string', 'description': 'Why the feature is discouraged, as web-features states it.'}, 'according_to': {'type': 'array', 'items': {'type': 'string'}, 'description': 'URLs of the bodies that discourage the feature.'}}, 'description': 'Feature-level discouragement, independent of leaf standards status. Also retained in status.discouraged when status exists.', 'additionalProperties': False}, 'resolved_as': {'anyOf': [{'type': 'object', 'required': ['input', 'bcd_key', 'baseline_id', 'resolved_via'], 'properties': {'input': {'type': 'string', 'description': 'The feature string as the caller sent it, trimmed.'}, 'bcd_key': {'type': ['string', 'null'], 'description': 'The single browser-compat-data key this resolved to, or null when the web-features id spans more than one key.'}, 'baseline_id': {'type': ['string', 'null'], 'description': 'The web-features id this resolved to, or null when no web-features entry covers the key.'}, 'resolved_via': {'enum': ['bcd_key', 'web_features_id', 'web_features_id_normalized', 'redirect', 'search'], 'type': 'string', 'description': 'Which step of the resolution order matched: bcd_key or web_features_id for an exact match, web_features_id_normalized when it matched only after lowercasing, redirect when the input pointed to a browser-compat-data entry that has moved or split, or search when resolve was true and the best exact matches in the search index all named one feature or key â\x80\x94 treat a search match as a best guess, not a confirmed key.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'How the feature string was matched, or null on a miss.'}, 'data_version': {'type': 'object', 'required': ['bcd', 'bcd_generated', 'web_features', 'caniuse_lite', 'browserslist'], 'properties': {'bcd': {'type': 'string', 'description': 'Version of the bundled @mdn/browser-compat-data snapshot.'}, 'browserslist': {'type': 'string', 'description': 'Version of the bundled browserslist query resolver.'}, 'caniuse_lite': {'type': 'string', 'description': 'Version of the bundled caniuse-lite snapshot.'}, 'web_features': {'type': 'string', 'description': 'Version of the bundled web-features snapshot.'}, 'bcd_generated': {'type': 'string', 'description': 'ISO 8601 timestamp the browser-compat-data snapshot was generated at.'}}, 'description': 'Vintage of each bundled dataset behind this answer.', 'additionalProperties': False}, 'limiting_browser': {'type': 'object', 'required': ['browser_id', 'name', 'version'], 'properties': {'name': {'type': 'string', 'description': 'Human-readable browser name.'}, 'version': {'type': 'string', 'description': 'Release of that browser the feature requires.'}, 'browser_id': {'type': 'string', 'description': 'browser-compat-data browser id.'}}, 'description': 'Among the Baseline core browsers, the one requiring the newest release. Present only when every core browser has full, unprefixed, unflagged support at a resolvable added release.', 'additionalProperties': False}, 'runtimesExcluded': {'type': 'string', 'description': 'Notes that the feature carries server-runtime or XR data that was left out.'}, 'baselineNotMapped': {'type': 'string', 'description': 'Explains why a resolved key carries no Baseline state.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['topic'], 'properties': {'topic': {'enum': ['bcd_namespaces', 'bcd_browsers', 'browserslist_agents', 'baseline_states', 'groups', 'snapshots'], 'type': 'string', 'description': 'Which vocabulary to list: bcd_namespaces for the 12 top-level browser-compat-data namespaces, bcd_browsers for the 17 tracked browsers, browserslist_agents for the 19 browserslist ids mapped to browser-compat-data browsers, baseline_states for the 4 Baseline states, groups for the 104 web-features groups, or snapshots for the 11 ECMAScript snapshots.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['topic', 'entries', 'data_version']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'description': 'Machine-readable failure mode.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'topic': {'type': 'string', 'description': 'The topic that was listed.'}, 'entries': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'label', 'detail'], 'properties': {'id': {'type': 'string', 'description': 'Identifier callers pass to the other tools, or filter results by.'}, 'count': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many items the entry covers â\x80\x94 compat keys for a namespace or Baseline state.'}, 'label': {'type': 'string', 'description': 'Human-readable name for this entry.'}, 'detail': {'type': 'string', 'description': 'One line explaining what the entry covers.'}, 'reported': {'type': 'boolean', 'description': 'True when this browser is in the reported set (desktop or mobile). Runtimes are added only by include_runtimes.'}, 'spec_url': {'type': 'string', 'description': 'Specification URL for this ECMAScript snapshot.'}, 'maps_from': {'anyOf': [{'type': 'string', 'const': 'high'}, {'type': 'string', 'const': 'low'}, {'type': 'boolean', 'const': False}, {'type': 'null', 'const': None}], 'description': 'Raw web-features status.baseline value this reported state maps from; null for not_mapped, which has none.'}, 'bcd_browser': {'type': ['string', 'null'], 'description': 'browser-compat-data browser this browserslist agent maps to, or null when none exists.'}, 'usage_percent': {'type': 'number', 'description': 'Share of tracked global traffic attributed to this browserslist agent.'}}, 'description': 'One vocabulary entry.', 'additionalProperties': False}, 'description': 'Every entry in the requested vocabulary.'}, 'attribution': {'type': 'string', 'description': 'Required attribution for the caniuse-derived usage figures in this response.'}, 'data_version': {'type': 'object', 'required': ['bcd', 'bcd_generated', 'web_features', 'caniuse_lite', 'browserslist'], 'properties': {'bcd': {'type': 'string', 'description': 'Version of the bundled @mdn/browser-compat-data snapshot.'}, 'browserslist': {'type': 'string', 'description': 'Version of the bundled browserslist query resolver.'}, 'caniuse_lite': {'type': 'string', 'description': 'Version of the bundled caniuse-lite snapshot.'}, 'web_features': {'type': 'string', 'description': 'Version of the bundled web-features snapshot.'}, 'bcd_generated': {'type': 'string', 'description': 'ISO 8601 timestamp the browser-compat-data snapshot was generated at.'}}, 'description': 'Vintage of each bundled dataset behind this answer.', 'additionalProperties': False}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['query'], 'properties': {'group': {'type': 'string', 'maxLength': 100, 'minLength': 1, 'description': 'Restrict results to features in one web-features group or any group nested under it, for example "selectors" or "css". Keys with no web-features mapping never match. Call browsercompat_list_reference with topic groups for valid ids.'}, 'limit': {'type': 'integer', 'default': 10, 'maximum': 50, 'minimum': 1, 'description': 'Maximum results to return, from 1 to 50.'}, 'query': {'type': 'string', 'maxLength': 100, 'minLength': 1, 'description': 'Plain-language name, keyword, or code notation, for example "container query", "fromAsync", "Array.prototype.at", "display: grid", or "<dialog>".'}, 'offset': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Number of ranked matches to skip before returning results, for paging past limit. Pass the nextOffset from the previous response.'}, 'baseline': {'enum': ['widely', 'newly', 'limited', 'not_mapped'], 'type': 'string', 'description': 'Restrict results to one Baseline state.'}, 'snapshot': {'type': 'string', 'maxLength': 100, 'minLength': 1, 'description': 'Restrict results to features in one ECMAScript snapshot, for example "ecmascript-2023". Call browsercompat_list_reference with topic snapshots for valid ids.'}, 'namespace': {'enum': ['api', 'css', 'html', 'http', 'javascript', 'manifests', 'mathml', 'mediatypes', 'svg', 'webassembly', 'webdriver', 'webextensions'], 'type': 'string', 'description': 'Restrict results to one top-level browser-compat-data namespace.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'data_version', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The limit that was applied.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_query', 'unknown_group', 'unknown_snapshot'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_query`: query is whitespace-only after normalization, or normalizes to zero tokens. `unknown_group`: group names no web-features group in the bundled data. `unknown_snapshot`: snapshot names no ECMAScript snapshot in the bundled data. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Number of results on this page.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['baseline_state', 'matched_on', 'support_summary'], 'properties': {'name': {'type': 'string', 'description': 'web-features display name.'}, 'bcd_key': {'type': 'string', 'description': 'browser-compat-data key. Absent for entries that own no compat keys.'}, 'mdn_url': {'type': 'string', 'description': 'MDN reference page for this key.'}, 'matched_on': {'enum': ['bcd_key', 'baseline_id', 'name', 'caniuse_title', 'path_suffix', 'path_segment', 'description', 'path_tokens'], 'type': 'string', 'description': 'Which field matched the query, so the ranking can be inspected. path_suffix means the key ends in the dotted or property-value notation the query used, such as Element.animate or display: grid.'}, 'baseline_id': {'type': 'string', 'description': 'web-features id covering this entry.'}, 'description': {'type': 'string', 'description': 'One-line description of the feature.'}, 'baseline_state': {'enum': ['widely', 'newly', 'limited', 'not_mapped'], 'type': 'string', 'description': 'Baseline state for this entry, reported per browser-compat-data key.'}, 'support_summary': {'type': 'string', 'description': 'One line over the Baseline core browsers, with â\x80\x94 for unsupported and ? for unknown.'}}, 'description': 'One ranked match.', 'additionalProperties': False}, 'description': 'Ranked matches, best first. An empty array is a successful search with no hits.'}, 'truncated': {'type': 'boolean', 'description': 'True when more matches remain past this page.'}, 'nextOffset': {'type': 'number', 'description': 'The offset of the next page. Present only while matches remain past this page.'}, 'totalCount': {'type': 'number', 'description': 'Matches across every page, before offset and limit apply.'}, 'data_version': {'type': 'object', 'required': ['bcd', 'bcd_generated', 'web_features', 'caniuse_lite', 'browserslist'], 'properties': {'bcd': {'type': 'string', 'description': 'Version of the bundled @mdn/browser-compat-data snapshot.'}, 'browserslist': {'type': 'string', 'description': 'Version of the bundled browserslist query resolver.'}, 'caniuse_lite': {'type': 'string', 'description': 'Version of the bundled caniuse-lite snapshot.'}, 'web_features': {'type': 'string', 'description': 'Version of the bundled web-features snapshot.'}, 'bcd_generated': {'type': 'string', 'description': 'ISO 8601 timestamp the browser-compat-data snapshot was generated at.'}}, 'description': 'Vintage of each bundled dataset behind this answer.', 'additionalProperties': False}, 'offsetNotice': {'type': 'string', 'description': 'Why a page came back empty although the search matched.'}, 'noMatchNotice': {'type': 'string', 'description': 'How to broaden a search that matched nothing.'}, 'appliedFilters': {'type': 'object', 'properties': {'group': {'type': 'string', 'description': 'web-features group filter the search applied, nested groups included.'}, 'baseline': {'type': 'string', 'description': 'Baseline filter the search applied.'}, 'snapshot': {'type': 'string', 'description': 'ECMAScript snapshot filter the search applied.'}, 'namespace': {'type': 'string', 'description': 'Namespace filter the search applied.'}}, 'description': 'Filters the server applied to this search.', 'additionalProperties': False}}, 'additionalProperties': False}
Recent tool changes
Similar MCP servers
TinyFn
Offers deterministic utility functions for mathematics, conversions, validation, hashing, encoding, arrays, dates, colors, and pa…
hyperion
Acts as a paid MCP tool marketplace and utility gateway with server discovery, HTTP and JavaScript tools, research, data conversi…
Andreax
Offers pay-per-call AI services for inference, agent and workflow design, OCR and transcription, code generation and review, clas…
Vee3
Manages Clerk authentication infrastructure, including users, organizations, domains, sessions, tokens, OAuth, SSO, machines, per…
Courier
Provides notification delivery infrastructure for users, tenants, lists, templates, preferences, journeys, automations, brands, a…
GripForge
Generates, rigs, animates, analyzes, and packages game characters, weapons, armor, effects, environments, and engine-ready assets.
IA-QA — 130+ QA & Dev Tools for AI Agents
Provides deterministic QA, evaluation, testing, code analysis, prompt and RAG checks, model comparison, and web security diagnost…
apis-io
Provides catalog search, comparison, scoring, enrichment, lists, and dataset exports for APIs, providers, specifications, workflo…