Skip to main content
Glama

browser-compat-mcp-server

Browsercompat Get Feature

browsercompat_get_feature
Read-onlyIdempotent

Get the compatibility record for one web feature: Baseline state and the date it crossed, deprecation and standards status, per-browser version added and removed with flags, vendor prefixes and partial-implementation notes — with every other support statement recorded for that browser, such as an earlier prefixed or flagged release, in other_statements — and the MDN and specification links. Accepts a BCD key such as css.selectors.has or a web-features id such as has; the response echoes which one it matched. A web-features id that spans several BCD keys, such as grid, returns web-features’ own feature-level release per Baseline core browser in feature_support and its compat_keys, 100 per page, in place of per-key fields. An unresolved feature returns found: false with guidance rather than an error.

Input Schema

NameRequiredDescriptionDefault
featureYesA 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.
resolveNoWhen 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 its feature_support and 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_offsetNoDirect child keys to skip, default 0. Each subkeys page contains at most 100 keys; pass its next_offset to continue.
include_runtimesNoAdd the bun, deno, nodejs, and oculus rows to support. Leave off for browser ship decisions.
compat_keys_offsetNocompat_keys to skip, default 0, for a web-features id that spans several keys. Each page of compat_keys holds at most 100; pass compat_keys_next_offset to continue. Has no effect when the feature resolves to a single key.

Output Schema

NameRequiredDescriptionDefault
nameNoweb-features display name for the feature.
errorNoPresent when the call failed. Absent on success.
foundNoTrue when the feature string resolved to a tracked entry.
statusNoStandards status for the resolved key. Absent for webextensions keys, which record none, and when the id spans more than one key.
mdn_urlNoMDN reference page for the resolved key.
outcomeNofound 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.
subkeysNoDirect child compat records of the resolved BCD key. Absent for childless keys and resolutions without a single key.
supportNoOne row per reported browser, judged at its newest shipped release, with the other statements recorded for that browser in other_statements. Absent when the id spans more than one browser-compat-data key; feature_support covers that case.
baselineNoBaseline state for the resolved key, or the feature rollup when a web-features id resolved to more than one key.
guidanceNoWhat to do next on a miss or with no compat data.
spec_urlsNoSpecification URLs for the resolved key, always an array.
compat_keysNoPresent when the web-features id spans more than one browser-compat-data key, or as an empty list when it owns none: at most 100 of its keys in declaration order, starting at compat_keys_offset. Call this tool again with one of them for the per-key support, status, and links.
descriptionNoweb-features description, or the browser-compat-data description with tags stripped.
discouragedNoFeature-level discouragement, independent of leaf standards status. Also retained in status.discouraged when status exists.
resolved_asNoHow the feature string was matched, or null on a miss.
data_versionNoVintage of each bundled dataset behind this answer.
feature_supportNoPresent only when the web-features id spans more than one browser-compat-data key: one row per Baseline core browser with the release web-features lists for the feature as a whole, the data its feature-level Baseline is computed from. It is web-features’ answer for the feature, not a combination of its keys, and a key can differ from it either way — a lists Chrome 1 while one of its keys is unsupported, and anchor-positioning lists no Chrome release though most of its keys are supported there. Call this tool with one of compat_keys for a key-level answer. Non-core browsers are not covered.
limiting_browserNoAmong the Baseline core browsers, the one whose required release is newest by release date. For a single key, present only when every core browser has full, unprefixed, unflagged support at a resolvable added release; for an id spanning more than one key, read from feature_support and present only when it lists all seven core browsers.
runtimesExcludedNoNotes that the feature carries server-runtime or XR data that was left out.
baselineNotMappedNoExplains why a resolved key carries no Baseline state.
compat_keys_totalNoEvery browser-compat-data key the id owns, before paging. Present with compat_keys.
compat_keys_next_offsetNocompat_keys_offset for the next page of compat_keys; absent at or past the end.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • addedInput schema / properties / compat_keys_offset
      Added value: +{
      +  "default": 0,
      +  "description": "compat_keys to skip, default 0, for a web-features id that spans several keys. Each page of compat_keys holds at most 100; pass compat_keys_next_offset to continue. Has no effect when the feature resolves to a single key.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedInput schema / properties / resolve / description
      Previous value: -"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."New value: +"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 its feature_support and 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."
    • changedOutput schema / properties / compat_keys / description
      Previous value: -"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."New value: +"Present when the web-features id spans more than one browser-compat-data key, or as an empty list when it owns none: at most 100 of its keys in declaration order, starting at compat_keys_offset. Call this tool again with one of them for the per-key support, status, and links."
    • addedOutput schema / properties / compat_keys_next_offset
      Added value: +{
      +  "description": "compat_keys_offset for the next page of compat_keys; absent at or past the end.",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / compat_keys_total
      Added value: +{
      +  "description": "Every browser-compat-data key the id owns, before paging. Present with compat_keys.",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / feature_support
      Added value: +{
      +  "description": "Present only when the web-features id spans more than one browser-compat-data key: one row per Baseline core browser with the release web-features lists for the feature as a whole, the data its feature-level Baseline is computed from. It is web-features’ answer for the feature, not a combination of its keys, and a key can differ from it either way — a lists Chrome 1 while one of its keys is unsupported, and anchor-positioning lists no Chrome release though most of its keys are supported there. Call this tool with one of compat_keys for a key-level answer. Non-core browsers are not covered.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "web-features’ support for one core browser.",
      +    "properties": {
      +      "browser_id": {
      +        "description": "browser-compat-data browser id of a Baseline core browser.",
      +        "type": "string"
      +      },
      +      "supported": {
      +        "description": "True when web-features lists a release for this browser for the feature as a whole; false when it lists none.",
      +        "type": "boolean"
      +      },
      +      "version": {
      +        "description": "Release web-features lists for the feature, without any ≤ prefix. Absent when supported is false.",
      +        "type": "string"
      +      },
      +      "version_is_upper_bound": {
      +        "description": "True when web-features lists the release as ≤, so support arrived at or before version, not exactly at it.",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "browser_id",
      +      "supported"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / limiting_browser / description
      Previous value: -"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."New value: +"Among the Baseline core browsers, the one whose required release is newest by release date. For a single key, present only when every core browser has full, unprefixed, unflagged support at a resolvable added release; for an id spanning more than one key, read from feature_support and present only when it lists all seven core browsers."
    • changedOutput schema / properties / limiting_browser / properties / version / description
      Previous value: -"Release of that browser the feature requires."New value: +"Release of that browser the feature requires, without any ≤ prefix — see version_is_upper_bound."
    • addedOutput schema / properties / limiting_browser / properties / version_is_upper_bound
      Added value: +{
      +  "description": "True when the data says support arrived at or before version, not exactly at it. Absent when version is exact.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / resolved_as / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "baseline_id": {
      -        "description": "The web-features id this resolved to, or null when no web-features entry covers the key.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "bcd_key": {
      -        "description": "The single browser-compat-data key this resolved to, or null when the web-features id spans more than one key.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "input": {
      -        "description": "The feature string as the caller sent it, trimmed.",
      -        "type": "string"
      -      },
      -      "resolved_via": {
      -        "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 — treat a search match as a best guess, not a confirmed key.",
      -        "enum": [
      -          "bcd_key",
      -          "web_features_id",
      -          "web_features_id_normalized",
      -          "redirect",
      -          "search"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "input",
      -      "bcd_key",
      -      "baseline_id",
      -      "resolved_via"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "baseline_id": {
      +        "description": "The web-features id this resolved to, or null when no web-features entry covers the key.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "bcd_key": {
      +        "description": "The single browser-compat-data key this resolved to, or null when the web-features id spans more than one key or owns none.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "input": {
      +        "description": "The feature string as the caller sent it, trimmed.",
      +        "type": "string"
      +      },
      +      "resolved_via": {
      +        "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 — treat a search match as a best guess, not a confirmed key.",
      +        "enum": [
      +          "bcd_key",
      +          "web_features_id",
      +          "web_features_id_normalized",
      +          "redirect",
      +          "search"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "input",
      +      "bcd_key",
      +      "baseline_id",
      +      "resolved_via"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / support / description
      Previous value: -"One row per reported browser. Absent when the id spans more than one browser-compat-data key."New value: +"One row per reported browser, judged at its newest shipped release, with the other statements recorded for that browser in other_statements. Absent when the id spans more than one browser-compat-data key; feature_support covers that case."
    • addedOutput schema / properties / support / items / properties / other_statements
      Added value: +{
      +  "description": "Every other support statement browser-compat-data records for this browser, in its declaration order: prefixed, alternative-name, flagged, partial, preview, and removed ranges. A statement the row fields above came from is never repeated here. Absent when there are none.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "One other support statement for this browser.",
      +    "properties": {
      +      "alternative_name": {
      +        "description": "Entirely different name the feature is implemented under.",
      +        "type": "string"
      +      },
      +      "flags": {
      +        "description": "Flags gating support in this browser.",
      +        "items": {
      +          "additionalProperties": false,
      +          "description": "A flag that must be configured for support.",
      +          "properties": {
      +            "name": {
      +              "description": "Name of the flag or preference to configure.",
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Whether the gate is a user preference or a runtime flag.",
      +              "enum": [
      +                "preference",
      +                "runtime_flag"
      +              ],
      +              "type": "string"
      +            },
      +            "value_to_set": {
      +              "description": "Value the flag must be set to.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "type"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "impl_url": {
      +        "description": "Links to bugs or issues tracking the implementation, always an array.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "notes": {
      +        "description": "Notes from browser-compat-data about this support, always an array.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "partial": {
      +        "description": "True when the implementation does not meet the mandatory specified behavior.",
      +        "type": "boolean"
      +      },
      +      "prefix": {
      +        "description": "Vendor prefix the feature ships under.",
      +        "type": "string"
      +      },
      +      "version_added": {
      +        "description": "Release that added support under this statement, or preview when it only works in a preview channel.",
      +        "type": "string"
      +      },
      +      "version_added_is_upper_bound": {
      +        "description": "True when the data says support arrived at or before version_added, not exactly at it.",
      +        "type": "boolean"
      +      },
      +      "version_last": {
      +        "description": "Last release that still supported the feature.",
      +        "type": "string"
      +      },
      +      "version_removed": {
      +        "description": "Release that removed support.",
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  2. Changed5 schema fields changed
    • changedInput schema / properties / resolve / description
      Previous value: -"When true, a string that is neither a key nor an id falls back to the search index, such as \"Container queries\" 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."New value: +"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."
    • addedInput schema / properties / subkeys_offset
      Added value: +{
      +  "default": 0,
      +  "description": "Direct child keys to skip, default 0. Each subkeys page contains at most 100 keys; pass its next_offset to continue.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / discouraged
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Feature-level discouragement, independent of leaf standards status. Also retained in status.discouraged when status exists.",
      +  "properties": {
      +    "according_to": {
      +      "description": "URLs of the bodies that discourage the feature.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "reason": {
      +      "description": "Why the feature is discouraged, as web-features states it.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "reason",
      +    "according_to"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / limiting_browser / description
      Previous value: -"Among the Baseline core browsers, the one requiring the newest release. Absent until every core browser has shipped a resolvable version."New value: +"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."
    • addedOutput schema / properties / subkeys
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Direct child compat records of the resolved BCD key. Absent for childless keys and resolutions without a single key.",
      +  "properties": {
      +    "keys": {
      +      "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.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "next_offset": {
      +      "description": "Offset for the next page; absent at or past the end.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "total": {
      +      "description": "Total direct callable child keys, before paging.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "truncated": {
      +      "description": "True when more direct children remain after this page.",
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "total",
      +    "keys",
      +    "truncated"
      +  ],
      +  "type": "object"
      +}
  3. Changed2 schema fields changed
    • changedInput schema / properties / resolve / description
      Previous value: -"When true, fall back to the search index and accept its single unambiguous top hit. Off by default so a typo returns a miss you can correct rather than a confident answer about the wrong feature."New value: +"When true, a string that is neither a key nor an id falls back to the search index, such as \"Container queries\" 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."
    • changedOutput schema / properties / resolved_as / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "baseline_id": {
      -        "description": "The web-features id this resolved to, or null when no web-features entry covers the key.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "bcd_key": {
      -        "description": "The single browser-compat-data key this resolved to, or null when the web-features id spans more than one key.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "input": {
      -        "description": "The feature string as the caller sent it, trimmed.",
      -        "type": "string"
      -      },
      -      "resolved_via": {
      -        "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 search index accepted a single unambiguous top hit — treat a search match as a best guess, not a confirmed key.",
      -        "enum": [
      -          "bcd_key",
      -          "web_features_id",
      -          "web_features_id_normalized",
      -          "redirect",
      -          "search"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "input",
      -      "bcd_key",
      -      "baseline_id",
      -      "resolved_via"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "baseline_id": {
      +        "description": "The web-features id this resolved to, or null when no web-features entry covers the key.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "bcd_key": {
      +        "description": "The single browser-compat-data key this resolved to, or null when the web-features id spans more than one key.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "input": {
      +        "description": "The feature string as the caller sent it, trimmed.",
      +        "type": "string"
      +      },
      +      "resolved_via": {
      +        "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 — treat a search match as a best guess, not a confirmed key.",
      +        "enum": [
      +          "bcd_key",
      +          "web_features_id",
      +          "web_features_id_normalized",
      +          "redirect",
      +          "search"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "input",
      +      "bcd_key",
      +      "baseline_id",
      +      "resolved_via"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  4. First observed

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the read-only/idempotent safety profile, and the description adds substantial behavior on top: an unresolved feature returns found: false with guidance rather than an error, results are paginated at 100 per page, and resolve is off by default so typos return a correctable miss. These are exactly the non-obvious behaviors an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with what the record contains, followed by input acceptance and the multi-key/resolve edge cases. Efficient for the complexity involved, though the enumeration of return fields is lengthy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description covers input forms, multi-key feature expansion, pagination, and the non-error miss path — everything an agent needs to invoke it correctly. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents feature, resolve, subkeys_offset, include_runtimes, and compat_keys_offset in detail. The description reinforces the key-vs-id distinction and the response echoing the matched form, but adds little semantic detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('the compatibility record for one web feature') and enumerates the payload — Baseline state, deprecation/standards status, per-browser add/remove, prefixes, other_statements, MDN/spec links. This clearly distinguishes it from sibling browsercompat_search_features, which is the lookup-oriented tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the two accepted input forms (BCD key vs web-features id), the fallback behavior of resolve, and when a multi-key web-features id returns feature-level data. It does not explicitly compare against siblings like browsercompat_check_baseline or browsercompat_compare_support, so the routing guidance is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.