{
  "categories": [
    "CAPABILITY_FLAGS",
    "CAPABILITY_SURFACE",
    "ENDPOINT_TRANSPORT",
    "LEGACY_SNAPSHOT",
    "MEDIA_TYPES",
    "METADATA",
    "PARAMETER",
    "PROTOCOL_VERSION",
    "SCHEMA_REQUEST",
    "SCHEMA_RESPONSE",
    "SECURITY",
    "VERSION_LABEL"
  ],
  "checked_on": "2026-09-28",
  "description": "Every change kind GAIP Supplier Watch can emit when comparing two A2A agent cards, MCP server descriptions, OpenAPI documents or generic snapshots, with its severity, category and rationale.",
  "direction_semantics": {
    "n/a": "Not a payload schema change.",
    "request": "Data the client sends. Narrowing what is accepted is breaking; widening is not.",
    "response": "Data the client receives. Removing or loosening guarantees is breaking; adding fields or narrowing values is not."
  },
  "governance": {
    "certification": false,
    "personal_data": false,
    "public_knowledge_only": true,
    "read_only": true
  },
  "inspiration": {
    "note": "Categories and several severity decisions are informed by the public oasdiff breaking-change checks (https://github.com/oasdiff/oasdiff/blob/main/docs/BREAKING-CHANGES.md); no code was copied and GAIP's kinds and severities are its own. 'comparable_openapi_diff_rule' names the analogous check family in plain words.",
    "sources": [
      "https://github.com/oasdiff/oasdiff",
      "https://a2a-protocol.org/latest/specification/",
      "https://modelcontextprotocol.io/specification/2025-11-25/server/tools",
      "https://spec.openapis.org/oas/v3.1.1.html",
      "https://semver.org/spec/v2.0.0.html"
    ]
  },
  "kind_count": 138,
  "kinds": [
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "ENDPOINT_TRANSPORT",
      "description": "The primary endpoint URL changed (path or host).",
      "direction": "n/a",
      "kind": "ENDPOINT_MOVED",
      "rationale": "Clients pinned to the old URL get 404s or reach a stale deployment; a new host may be a different operator.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "ENDPOINT_TRANSPORT",
      "description": "No endpoint is published any more.",
      "direction": "n/a",
      "kind": "ENDPOINT_REMOVED",
      "rationale": "Nothing can be called.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "ENDPOINT_TRANSPORT",
      "description": "An endpoint is now published.",
      "direction": "n/a",
      "kind": "ENDPOINT_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "SECURITY",
      "description": "Endpoint moved from https to http.",
      "direction": "n/a",
      "kind": "SCHEME_DOWNGRADE",
      "rationale": "Traffic and credentials would travel unencrypted; HTTPS-only clients refuse it.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "SECURITY",
      "description": "Endpoint moved from http to https.",
      "direction": "n/a",
      "kind": "SCHEME_UPGRADE",
      "rationale": "Improves transport security.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "OPENAPI_DOCUMENT"
      ],
      "category": "ENDPOINT_TRANSPORT",
      "description": "An alternative interface/server URL was withdrawn.",
      "direction": "n/a",
      "kind": "INTERFACE_REMOVED",
      "rationale": "Clients bound to it fail.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://a2a-protocol.org/latest/specification/#446-agentinterface"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "OPENAPI_DOCUMENT"
      ],
      "category": "ENDPOINT_TRANSPORT",
      "description": "An additional interface/server URL is offered.",
      "direction": "n/a",
      "kind": "INTERFACE_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "ENDPOINT_TRANSPORT",
      "description": "The protocol binding / preferred transport changed (e.g. JSONRPC to GRPC).",
      "direction": "n/a",
      "kind": "TRANSPORT_CHANGED",
      "rationale": "Client adapters bound to the old binding fail.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://a2a-protocol.org/latest/specification/#446-agentinterface"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "CAPABILITY_SURFACE",
      "description": "A skill is no longer offered.",
      "direction": "n/a",
      "kind": "SKILL_REMOVED",
      "rationale": "Calls to the skill fail.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://a2a-protocol.org/latest/specification/#445-agentskill"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "CAPABILITY_SURFACE",
      "description": "A new skill is offered.",
      "direction": "n/a",
      "kind": "SKILL_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://a2a-protocol.org/latest/specification/#445-agentskill"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "METADATA",
      "description": "The skill description changed.",
      "direction": "n/a",
      "kind": "SKILL_DESCRIPTION_CHANGED",
      "rationale": "Behaviour may have been re-described; LLM-driven selection may change.",
      "severities": [
        "INFO"
      ],
      "spec_url": "https://a2a-protocol.org/latest/specification/#445-agentskill"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "MEDIA_TYPES",
      "description": "A skill input/output media type was withdrawn.",
      "direction": "n/a",
      "kind": "SKILL_MODE_REMOVED",
      "rationale": "Callers sending/expecting that media type fail.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://a2a-protocol.org/latest/specification/#445-agentskill"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "MEDIA_TYPES",
      "description": "A skill gained an input/output media type.",
      "direction": "n/a",
      "kind": "SKILL_MODE_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://a2a-protocol.org/latest/specification/#445-agentskill"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "CAPABILITY_SURFACE",
      "description": "A tool is no longer offered.",
      "direction": "n/a",
      "kind": "TOOL_REMOVED",
      "rationale": "Calls to the tool fail.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "CAPABILITY_SURFACE",
      "description": "A new tool is offered.",
      "direction": "n/a",
      "kind": "TOOL_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "METADATA",
      "description": "The tool description changed.",
      "direction": "n/a",
      "kind": "TOOL_DESCRIPTION_CHANGED",
      "rationale": "Behaviour may have been re-described; LLM-driven selection may change.",
      "severities": [
        "INFO"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "MEDIA_TYPES",
      "description": "A tool input/output media type was withdrawn.",
      "direction": "n/a",
      "kind": "TOOL_MODE_REMOVED",
      "rationale": "Callers sending/expecting that media type fail.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "MEDIA_TYPES",
      "description": "A tool gained an input/output media type.",
      "direction": "n/a",
      "kind": "TOOL_MODE_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "METADATA",
      "description": "A skill's display name changed.",
      "direction": "n/a",
      "kind": "SKILL_NAME_CHANGED",
      "rationale": "Skills are addressed by id; display only.",
      "severities": [
        "INFO"
      ]
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "METADATA",
      "description": "Reserved: tools are keyed by name, so a rename appears as TOOL_REMOVED + TOOL_ADDED.",
      "direction": "n/a",
      "kind": "TOOL_NAME_CHANGED",
      "rationale": "Listed for completeness of the label x field matrix.",
      "severities": [
        "INFO"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "MEDIA_TYPES",
      "description": "A default input media type was withdrawn.",
      "direction": "n/a",
      "kind": "INPUT_MODE_REMOVED",
      "rationale": "Callers relying on it fail.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://a2a-protocol.org/latest/specification/#441-agentcard"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "MEDIA_TYPES",
      "description": "A default input media type was added.",
      "direction": "n/a",
      "kind": "INPUT_MODE_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "MEDIA_TYPES",
      "description": "A default output media type was withdrawn.",
      "direction": "n/a",
      "kind": "OUTPUT_MODE_REMOVED",
      "rationale": "Callers relying on it fail.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://a2a-protocol.org/latest/specification/#441-agentcard"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "MEDIA_TYPES",
      "description": "A default output media type was added.",
      "direction": "n/a",
      "kind": "OUTPUT_MODE_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "CAPABILITY_SURFACE",
      "comparable_openapi_diff_rule": "API path/operation removed",
      "description": "An operation (method + path) was removed.",
      "direction": "n/a",
      "kind": "OPERATION_REMOVED",
      "rationale": "Calls get 404/405.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#paths-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "CAPABILITY_SURFACE",
      "description": "An operation was added.",
      "direction": "n/a",
      "kind": "OPERATION_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "CAPABILITY_SURFACE",
      "comparable_openapi_diff_rule": "operation id changed/removed",
      "description": "An operation's operationId changed.",
      "direction": "n/a",
      "kind": "OPERATION_ID_CHANGED",
      "rationale": "Generated SDK method names and agent tool names derived from operationId no longer match.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#operation-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "CAPABILITY_SURFACE",
      "comparable_openapi_diff_rule": "API deprecated",
      "description": "An operation became deprecated.",
      "direction": "n/a",
      "kind": "OPERATION_DEPRECATED",
      "rationale": "Removal is signalled for a later release.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#operation-object"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "A tool no longer declares an outputSchema.",
      "direction": "response",
      "kind": "OUTPUT_SCHEMA_REMOVED",
      "rationale": "structuredContent is no longer guaranteed to conform to a schema.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "A tool now declares an outputSchema.",
      "direction": "response",
      "kind": "OUTPUT_SCHEMA_ADDED",
      "rationale": "Additive contract.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "comparable_openapi_diff_rule": "request parameter removed",
      "description": "A parameter was removed.",
      "direction": "request",
      "kind": "PARAMETER_REMOVED",
      "rationale": "Strict servers reject it; lenient ones silently ignore it, which changes results for filters. GAIP is conservative here.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "comparable_openapi_diff_rule": "new required request parameter",
      "description": "A new required parameter was added.",
      "direction": "request",
      "kind": "PARAMETER_REQUIRED_ADDED",
      "rationale": "Existing requests without it are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "description": "A new optional parameter was added.",
      "direction": "request",
      "kind": "PARAMETER_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "comparable_openapi_diff_rule": "request parameter became required",
      "description": "An optional parameter became required.",
      "direction": "request",
      "kind": "PARAMETER_BECAME_REQUIRED",
      "rationale": "Requests without it are rejected.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "description": "A required parameter became optional.",
      "direction": "request",
      "kind": "PARAMETER_BECAME_OPTIONAL",
      "rationale": "Relaxation.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "A required request body was added.",
      "direction": "request",
      "kind": "REQUEST_BODY_ADDED_REQUIRED",
      "rationale": "Requests without a body are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "An optional request body was added.",
      "direction": "request",
      "kind": "REQUEST_BODY_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "The request body was removed.",
      "direction": "request",
      "kind": "REQUEST_BODY_REMOVED",
      "rationale": "Data sent in it is rejected or ignored.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "request body became required",
      "description": "The request body became required.",
      "direction": "request",
      "kind": "REQUEST_BODY_BECAME_REQUIRED",
      "rationale": "Requests without a body are rejected.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "MEDIA_TYPES",
      "comparable_openapi_diff_rule": "request body media type removed",
      "description": "A request-body media type was removed.",
      "direction": "request",
      "kind": "REQUEST_BODY_MEDIA_TYPE_REMOVED",
      "rationale": "Requests in that media type get 415.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "MEDIA_TYPES",
      "description": "A request-body media type was added.",
      "direction": "request",
      "kind": "REQUEST_BODY_MEDIA_TYPE_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "response success status removed",
      "description": "A documented response status was removed.",
      "direction": "response",
      "kind": "RESPONSE_STATUS_REMOVED",
      "rationale": "BREAKING for 2xx (clients expect that success response); NON_BREAKING for error statuses.",
      "severities": [
        "BREAKING",
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#responses-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "A response status was added.",
      "direction": "response",
      "kind": "RESPONSE_STATUS_ADDED",
      "rationale": "NON_BREAKING for 2xx (clients handling only the old success code may misread it); INFO for error statuses.",
      "severities": [
        "NON_BREAKING",
        "INFO"
      ]
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "MEDIA_TYPES",
      "comparable_openapi_diff_rule": "response media type removed",
      "description": "A response media type was removed.",
      "direction": "response",
      "kind": "RESPONSE_MEDIA_TYPE_REMOVED",
      "rationale": "BREAKING for 2xx responses.",
      "severities": [
        "BREAKING",
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "MCP tool inputSchema: A request object now sets additionalProperties: false.",
      "direction": "request",
      "kind": "INPUT_ADDITIONAL_PROPERTIES_RESTRICTED",
      "rationale": "Requests carrying undeclared fields are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "MCP tool inputSchema: A request validation constraint relaxed.",
      "direction": "request",
      "kind": "INPUT_CONSTRAINT_RELAXED",
      "rationale": "More values are accepted.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "request property max length decreased / min increased / pattern changed",
      "description": "MCP tool inputSchema: A request validation constraint tightened (max decreased, min increased, pattern added or changed).",
      "direction": "request",
      "kind": "INPUT_CONSTRAINT_TIGHTENED",
      "rationale": "Values that were valid may now be rejected; changed patterns are treated conservatively.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "MCP tool inputSchema: An enum restriction was removed.",
      "direction": "request",
      "kind": "INPUT_ENUM_RELAXED",
      "rationale": "Request: more values accepted. Response: clients must handle values outside the old list.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "request property enum added",
      "description": "MCP tool inputSchema: A request property gained an enum where it accepted any value.",
      "direction": "request",
      "kind": "INPUT_ENUM_RESTRICTED",
      "rationale": "Values outside the list are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "MCP tool inputSchema: An enum value was added.",
      "direction": "request",
      "kind": "INPUT_ENUM_VALUE_ADDED",
      "rationale": "Additive for requests.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "request property enum value removed",
      "description": "MCP tool inputSchema: An enum value was removed.",
      "direction": "request",
      "kind": "INPUT_ENUM_VALUE_REMOVED",
      "rationale": "Requests sending it are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "MCP tool inputSchema: An optional property was added (request) or a new property is returned (response).",
      "direction": "request",
      "kind": "INPUT_FIELD_ADDED",
      "rationale": "Additive; tolerant readers ignore unknown fields.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "request property removed",
      "description": "MCP tool inputSchema: A request property was removed.",
      "direction": "request",
      "kind": "INPUT_FIELD_REMOVED",
      "rationale": "Strict validators (additionalProperties: false) reject it; others ignore the value silently.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "property type changed",
      "description": "MCP tool inputSchema: A (nested) property changed type incompatibly.",
      "direction": "request",
      "kind": "INPUT_FIELD_TYPE_CHANGED",
      "rationale": "Existing values fail validation or parsing.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "MCP tool inputSchema: A request property type widened.",
      "direction": "request",
      "kind": "INPUT_FIELD_TYPE_WIDENED",
      "rationale": "Every previously valid value stays valid.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "new required request property / request property became required",
      "description": "MCP tool inputSchema: A property became required (new or previously optional).",
      "direction": "request",
      "kind": "INPUT_REQUIRED_FIELD_ADDED",
      "rationale": "Existing requests without it are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "MCP tool inputSchema: A request property is no longer required.",
      "direction": "request",
      "kind": "INPUT_REQUIRED_FIELD_RELAXED",
      "rationale": "Relaxation.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "property type changed",
      "description": "MCP tool inputSchema: The root schema type changed incompatibly.",
      "direction": "request",
      "kind": "INPUT_TYPE_CHANGED",
      "rationale": "Values valid before are no longer valid (request) or clients parse the wrong type (response).",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "MCP tool inputSchema: Request root type widened (e.g. integer to number, or a type added to a type list).",
      "direction": "request",
      "kind": "INPUT_TYPE_WIDENED",
      "rationale": "Every previously valid value stays valid.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "MCP tool outputSchema: An enum restriction was removed.",
      "direction": "response",
      "kind": "OUTPUT_ENUM_RELAXED",
      "rationale": "Request: more values accepted. Response: clients must handle values outside the old list.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "response property enum value added",
      "description": "MCP tool outputSchema: An enum value was added.",
      "direction": "response",
      "kind": "OUTPUT_ENUM_VALUE_ADDED",
      "rationale": "Clients with exhaustive handling of the old values may fail on the new one.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "MCP tool outputSchema: An enum value was removed.",
      "direction": "response",
      "kind": "OUTPUT_ENUM_VALUE_REMOVED",
      "rationale": "The value is simply no longer returned.",
      "severities": [
        "INFO"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "MCP tool outputSchema: An optional property was added (request) or a new property is returned (response).",
      "direction": "response",
      "kind": "OUTPUT_FIELD_ADDED",
      "rationale": "Additive; tolerant readers ignore unknown fields.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "response property became optional",
      "description": "MCP tool outputSchema: A required response property may now be absent.",
      "direction": "response",
      "kind": "OUTPUT_FIELD_BECAME_OPTIONAL",
      "rationale": "Clients that assume presence break.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "property type changed",
      "description": "MCP tool outputSchema: A (nested) property changed type incompatibly.",
      "direction": "response",
      "kind": "OUTPUT_FIELD_TYPE_CHANGED",
      "rationale": "Existing values fail validation or parsing.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "MCP tool outputSchema: A response property type narrowed.",
      "direction": "response",
      "kind": "OUTPUT_FIELD_TYPE_NARROWED",
      "rationale": "Every value returned is still of a previously possible type.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "response optional property removed",
      "description": "MCP tool outputSchema: An optional response property is no longer returned.",
      "direction": "response",
      "kind": "OUTPUT_OPTIONAL_FIELD_REMOVED",
      "rationale": "Well-behaved clients already handle its absence; check whether you read it.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "response required property removed",
      "description": "MCP tool outputSchema: A required response property is no longer returned.",
      "direction": "response",
      "kind": "OUTPUT_REQUIRED_FIELD_REMOVED",
      "rationale": "Clients reading it break.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "property type changed",
      "description": "MCP tool outputSchema: The root schema type changed incompatibly.",
      "direction": "response",
      "kind": "OUTPUT_TYPE_CHANGED",
      "rationale": "Values valid before are no longer valid (request) or clients parse the wrong type (response).",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "MCP tool outputSchema: Response root type narrowed (e.g. number to integer, null removed).",
      "direction": "response",
      "kind": "OUTPUT_TYPE_NARROWED",
      "rationale": "Every value returned is still of a previously possible type.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://modelcontextprotocol.io/specification/2025-11-25/server/tools"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "description": "OpenAPI parameter schema: A request object now sets additionalProperties: false.",
      "direction": "request",
      "kind": "PARAMETER_ADDITIONAL_PROPERTIES_RESTRICTED",
      "rationale": "Requests carrying undeclared fields are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "description": "OpenAPI parameter schema: A request validation constraint relaxed.",
      "direction": "request",
      "kind": "PARAMETER_CONSTRAINT_RELAXED",
      "rationale": "More values are accepted.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "comparable_openapi_diff_rule": "request property max length decreased / min increased / pattern changed",
      "description": "OpenAPI parameter schema: A request validation constraint tightened (max decreased, min increased, pattern added or changed).",
      "direction": "request",
      "kind": "PARAMETER_CONSTRAINT_TIGHTENED",
      "rationale": "Values that were valid may now be rejected; changed patterns are treated conservatively.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "description": "OpenAPI parameter schema: An enum restriction was removed.",
      "direction": "request",
      "kind": "PARAMETER_ENUM_RELAXED",
      "rationale": "Request: more values accepted. Response: clients must handle values outside the old list.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "comparable_openapi_diff_rule": "request property enum added",
      "description": "OpenAPI parameter schema: A request property gained an enum where it accepted any value.",
      "direction": "request",
      "kind": "PARAMETER_ENUM_RESTRICTED",
      "rationale": "Values outside the list are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "description": "OpenAPI parameter schema: An enum value was added.",
      "direction": "request",
      "kind": "PARAMETER_ENUM_VALUE_ADDED",
      "rationale": "Additive for requests.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "comparable_openapi_diff_rule": "request property enum value removed",
      "description": "OpenAPI parameter schema: An enum value was removed.",
      "direction": "request",
      "kind": "PARAMETER_ENUM_VALUE_REMOVED",
      "rationale": "Requests sending it are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "description": "OpenAPI parameter schema: An optional property was added (request) or a new property is returned (response).",
      "direction": "request",
      "kind": "PARAMETER_FIELD_ADDED",
      "rationale": "Additive; tolerant readers ignore unknown fields.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "comparable_openapi_diff_rule": "request property removed",
      "description": "OpenAPI parameter schema: A request property was removed.",
      "direction": "request",
      "kind": "PARAMETER_FIELD_REMOVED",
      "rationale": "Strict validators (additionalProperties: false) reject it; others ignore the value silently.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "comparable_openapi_diff_rule": "property type changed",
      "description": "OpenAPI parameter schema: A (nested) property changed type incompatibly.",
      "direction": "request",
      "kind": "PARAMETER_FIELD_TYPE_CHANGED",
      "rationale": "Existing values fail validation or parsing.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "description": "OpenAPI parameter schema: A request property type widened.",
      "direction": "request",
      "kind": "PARAMETER_FIELD_TYPE_WIDENED",
      "rationale": "Every previously valid value stays valid.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "comparable_openapi_diff_rule": "new required request property / request property became required",
      "description": "OpenAPI parameter schema: A property became required (new or previously optional).",
      "direction": "request",
      "kind": "PARAMETER_REQUIRED_FIELD_ADDED",
      "rationale": "Existing requests without it are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "description": "OpenAPI parameter schema: A request property is no longer required.",
      "direction": "request",
      "kind": "PARAMETER_REQUIRED_FIELD_RELAXED",
      "rationale": "Relaxation.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "comparable_openapi_diff_rule": "property type changed",
      "description": "OpenAPI parameter schema: The root schema type changed incompatibly.",
      "direction": "request",
      "kind": "PARAMETER_TYPE_CHANGED",
      "rationale": "Values valid before are no longer valid (request) or clients parse the wrong type (response).",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "PARAMETER",
      "description": "OpenAPI parameter schema: Request root type widened (e.g. integer to number, or a type added to a type list).",
      "direction": "request",
      "kind": "PARAMETER_TYPE_WIDENED",
      "rationale": "Every previously valid value stays valid.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#parameter-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "OpenAPI requestBody schema: A request object now sets additionalProperties: false.",
      "direction": "request",
      "kind": "REQUEST_BODY_ADDITIONAL_PROPERTIES_RESTRICTED",
      "rationale": "Requests carrying undeclared fields are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "OpenAPI requestBody schema: A request validation constraint relaxed.",
      "direction": "request",
      "kind": "REQUEST_BODY_CONSTRAINT_RELAXED",
      "rationale": "More values are accepted.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "request property max length decreased / min increased / pattern changed",
      "description": "OpenAPI requestBody schema: A request validation constraint tightened (max decreased, min increased, pattern added or changed).",
      "direction": "request",
      "kind": "REQUEST_BODY_CONSTRAINT_TIGHTENED",
      "rationale": "Values that were valid may now be rejected; changed patterns are treated conservatively.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "OpenAPI requestBody schema: An enum restriction was removed.",
      "direction": "request",
      "kind": "REQUEST_BODY_ENUM_RELAXED",
      "rationale": "Request: more values accepted. Response: clients must handle values outside the old list.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "request property enum added",
      "description": "OpenAPI requestBody schema: A request property gained an enum where it accepted any value.",
      "direction": "request",
      "kind": "REQUEST_BODY_ENUM_RESTRICTED",
      "rationale": "Values outside the list are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "OpenAPI requestBody schema: An enum value was added.",
      "direction": "request",
      "kind": "REQUEST_BODY_ENUM_VALUE_ADDED",
      "rationale": "Additive for requests.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "request property enum value removed",
      "description": "OpenAPI requestBody schema: An enum value was removed.",
      "direction": "request",
      "kind": "REQUEST_BODY_ENUM_VALUE_REMOVED",
      "rationale": "Requests sending it are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "OpenAPI requestBody schema: An optional property was added (request) or a new property is returned (response).",
      "direction": "request",
      "kind": "REQUEST_BODY_FIELD_ADDED",
      "rationale": "Additive; tolerant readers ignore unknown fields.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "request property removed",
      "description": "OpenAPI requestBody schema: A request property was removed.",
      "direction": "request",
      "kind": "REQUEST_BODY_FIELD_REMOVED",
      "rationale": "Strict validators (additionalProperties: false) reject it; others ignore the value silently.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "property type changed",
      "description": "OpenAPI requestBody schema: A (nested) property changed type incompatibly.",
      "direction": "request",
      "kind": "REQUEST_BODY_FIELD_TYPE_CHANGED",
      "rationale": "Existing values fail validation or parsing.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "OpenAPI requestBody schema: A request property type widened.",
      "direction": "request",
      "kind": "REQUEST_BODY_FIELD_TYPE_WIDENED",
      "rationale": "Every previously valid value stays valid.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "new required request property / request property became required",
      "description": "OpenAPI requestBody schema: A property became required (new or previously optional).",
      "direction": "request",
      "kind": "REQUEST_BODY_REQUIRED_FIELD_ADDED",
      "rationale": "Existing requests without it are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "OpenAPI requestBody schema: A request property is no longer required.",
      "direction": "request",
      "kind": "REQUEST_BODY_REQUIRED_FIELD_RELAXED",
      "rationale": "Relaxation.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "comparable_openapi_diff_rule": "property type changed",
      "description": "OpenAPI requestBody schema: The root schema type changed incompatibly.",
      "direction": "request",
      "kind": "REQUEST_BODY_TYPE_CHANGED",
      "rationale": "Values valid before are no longer valid (request) or clients parse the wrong type (response).",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_REQUEST",
      "description": "OpenAPI requestBody schema: Request root type widened (e.g. integer to number, or a type added to a type list).",
      "direction": "request",
      "kind": "REQUEST_BODY_TYPE_WIDENED",
      "rationale": "Every previously valid value stays valid.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#request-body-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "OpenAPI response schema: An enum restriction was removed.",
      "direction": "response",
      "kind": "RESPONSE_ENUM_RELAXED",
      "rationale": "Request: more values accepted. Response: clients must handle values outside the old list.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#response-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "response property enum value added",
      "description": "OpenAPI response schema: An enum value was added.",
      "direction": "response",
      "kind": "RESPONSE_ENUM_VALUE_ADDED",
      "rationale": "Clients with exhaustive handling of the old values may fail on the new one.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#response-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "OpenAPI response schema: An enum value was removed.",
      "direction": "response",
      "kind": "RESPONSE_ENUM_VALUE_REMOVED",
      "rationale": "The value is simply no longer returned.",
      "severities": [
        "INFO"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#response-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "OpenAPI response schema: An optional property was added (request) or a new property is returned (response).",
      "direction": "response",
      "kind": "RESPONSE_FIELD_ADDED",
      "rationale": "Additive; tolerant readers ignore unknown fields.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#response-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "response property became optional",
      "description": "OpenAPI response schema: A required response property may now be absent.",
      "direction": "response",
      "kind": "RESPONSE_FIELD_BECAME_OPTIONAL",
      "rationale": "Clients that assume presence break.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#response-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "property type changed",
      "description": "OpenAPI response schema: A (nested) property changed type incompatibly.",
      "direction": "response",
      "kind": "RESPONSE_FIELD_TYPE_CHANGED",
      "rationale": "Existing values fail validation or parsing.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#response-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "OpenAPI response schema: A response property type narrowed.",
      "direction": "response",
      "kind": "RESPONSE_FIELD_TYPE_NARROWED",
      "rationale": "Every value returned is still of a previously possible type.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#response-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "response optional property removed",
      "description": "OpenAPI response schema: An optional response property is no longer returned.",
      "direction": "response",
      "kind": "RESPONSE_OPTIONAL_FIELD_REMOVED",
      "rationale": "Well-behaved clients already handle its absence; check whether you read it.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#response-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "response required property removed",
      "description": "OpenAPI response schema: A required response property is no longer returned.",
      "direction": "response",
      "kind": "RESPONSE_REQUIRED_FIELD_REMOVED",
      "rationale": "Clients reading it break.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#response-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "comparable_openapi_diff_rule": "property type changed",
      "description": "OpenAPI response schema: The root schema type changed incompatibly.",
      "direction": "response",
      "kind": "RESPONSE_TYPE_CHANGED",
      "rationale": "Values valid before are no longer valid (request) or clients parse the wrong type (response).",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#response-object"
    },
    {
      "applies_to": [
        "OPENAPI_DOCUMENT"
      ],
      "category": "SCHEMA_RESPONSE",
      "description": "OpenAPI response schema: Response root type narrowed (e.g. number to integer, null removed).",
      "direction": "response",
      "kind": "RESPONSE_TYPE_NARROWED",
      "rationale": "Every value returned is still of a previously possible type.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://spec.openapis.org/oas/v3.1.1.html#response-object"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT"
      ],
      "category": "SECURITY",
      "comparable_openapi_diff_rule": "security requirement changes",
      "description": "Authentication is now declared where none was.",
      "direction": "n/a",
      "kind": "AUTH_ADDED",
      "rationale": "Unauthenticated callers start getting 401/403.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT"
      ],
      "category": "SECURITY",
      "comparable_openapi_diff_rule": "security requirement changes",
      "description": "Authentication is no longer declared.",
      "direction": "n/a",
      "kind": "AUTH_REMOVED",
      "rationale": "Calls keep working, but the service may now be open: security review.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT"
      ],
      "category": "SECURITY",
      "comparable_openapi_diff_rule": "security requirement changes",
      "description": "A security scheme was removed.",
      "direction": "n/a",
      "kind": "AUTH_SCHEME_REMOVED",
      "rationale": "Callers authenticating with it are rejected.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT"
      ],
      "category": "SECURITY",
      "comparable_openapi_diff_rule": "security requirement changes",
      "description": "A security scheme was added as an option.",
      "direction": "n/a",
      "kind": "AUTH_SCHEME_ADDED",
      "rationale": "Additive unless made mandatory.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT"
      ],
      "category": "SECURITY",
      "comparable_openapi_diff_rule": "security requirement changes",
      "description": "A security scheme changed (type, location, flows or scopes).",
      "direction": "n/a",
      "kind": "AUTH_SCHEME_CHANGED",
      "rationale": "Existing credentials may stop working.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT"
      ],
      "category": "SECURITY",
      "comparable_openapi_diff_rule": "security requirement changes",
      "description": "Required scheme/scope combinations changed.",
      "direction": "n/a",
      "kind": "AUTH_REQUIREMENT_CHANGED",
      "rationale": "BREAKING when a combination was withdrawn or needs more scopes; NON_BREAKING when only alternatives were added.",
      "severities": [
        "BREAKING",
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "CAPABILITY_FLAGS",
      "description": "A declared capability (streaming, push, tools.listChanged...) was removed.",
      "direction": "n/a",
      "kind": "CAPABILITY_REMOVED",
      "rationale": "Callers relying on it fail.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "CAPABILITY_FLAGS",
      "description": "A capability was added.",
      "direction": "n/a",
      "kind": "CAPABILITY_ADDED",
      "rationale": "Additive.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION"
      ],
      "category": "CAPABILITY_FLAGS",
      "description": "A capability value changed.",
      "direction": "n/a",
      "kind": "CAPABILITY_CHANGED",
      "rationale": "Review whether usage is affected.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "CAPABILITY_FLAGS",
      "description": "A protocol extension was added.",
      "direction": "n/a",
      "kind": "EXTENSION_ADDED",
      "rationale": "BREAKING when required: true (clients without it are rejected, A2A -32008); NON_BREAKING when optional.",
      "severities": [
        "BREAKING",
        "NON_BREAKING"
      ],
      "spec_url": "https://a2a-protocol.org/latest/specification/#444-agentextension"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "CAPABILITY_FLAGS",
      "description": "A protocol extension was withdrawn.",
      "direction": "n/a",
      "kind": "EXTENSION_REMOVED",
      "rationale": "Stop depending on extension behaviour.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD"
      ],
      "category": "CAPABILITY_FLAGS",
      "description": "A protocol extension became mandatory.",
      "direction": "n/a",
      "kind": "EXTENSION_NOW_REQUIRED",
      "rationale": "Clients without it are rejected.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://a2a-protocol.org/latest/specification/#444-agentextension"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT"
      ],
      "category": "PROTOCOL_VERSION",
      "description": "protocolVersion / openapi version changed.",
      "direction": "n/a",
      "kind": "PROTOCOL_VERSION_CHANGED",
      "rationale": "BREAKING across an incompatible major (or 0.x minor) line; dated MCP revisions are negotiated at initialize (NON_BREAKING).",
      "severities": [
        "BREAKING",
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "VERSION_LABEL",
      "description": "Semantic major version bump.",
      "direction": "n/a",
      "kind": "VERSION_MAJOR",
      "rationale": "SemVer signals incompatible changes.",
      "severities": [
        "BREAKING"
      ],
      "spec_url": "https://semver.org/spec/v2.0.0.html"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "VERSION_LABEL",
      "description": "Semantic minor version bump.",
      "direction": "n/a",
      "kind": "VERSION_MINOR",
      "rationale": "Backwards-compatible features.",
      "severities": [
        "NON_BREAKING"
      ],
      "spec_url": "https://semver.org/spec/v2.0.0.html"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "VERSION_LABEL",
      "description": "Semantic patch version bump.",
      "direction": "n/a",
      "kind": "VERSION_PATCH",
      "rationale": "Bug fixes only.",
      "severities": [
        "INFO"
      ],
      "spec_url": "https://semver.org/spec/v2.0.0.html"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "VERSION_LABEL",
      "description": "The published version went backwards.",
      "direction": "n/a",
      "kind": "VERSION_DOWNGRADE",
      "rationale": "BREAKING across a major line; recently adopted features may be gone.",
      "severities": [
        "BREAKING",
        "NON_BREAKING"
      ],
      "spec_url": "https://semver.org/spec/v2.0.0.html"
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "VERSION_LABEL",
      "description": "Version label changed (not semantic, or no numeric change).",
      "direction": "n/a",
      "kind": "VERSION_CHANGED",
      "rationale": "Read the release notes.",
      "severities": [
        "NON_BREAKING",
        "INFO"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "METADATA",
      "description": "The published name changed.",
      "direction": "n/a",
      "kind": "NAME_CHANGED",
      "rationale": "Display only.",
      "severities": [
        "INFO"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "METADATA",
      "description": "The published description changed.",
      "direction": "n/a",
      "kind": "DESCRIPTION_CHANGED",
      "rationale": "Display only.",
      "severities": [
        "INFO"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "GENERIC_SNAPSHOT"
      ],
      "category": "SECURITY",
      "description": "The declared provider/organisation changed.",
      "direction": "n/a",
      "kind": "PROVIDER_CHANGED",
      "rationale": "The service may have changed hands: confirm before sending data.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "A2A_AGENT_CARD",
        "MCP_SERVER_DESCRIPTION",
        "OPENAPI_DOCUMENT",
        "GENERIC_SNAPSHOT"
      ],
      "category": "METADATA",
      "description": "Another top-level field changed.",
      "direction": "n/a",
      "kind": "FIELD_CHANGED",
      "rationale": "Review if you depend on it.",
      "severities": [
        "INFO"
      ]
    },
    {
      "applies_to": [
        "GENERIC_SNAPSHOT"
      ],
      "category": "LEGACY_SNAPSHOT",
      "description": "The declared protocol changed.",
      "direction": "n/a",
      "kind": "PROTOCOL_CHANGED",
      "rationale": "The current adapter will not work.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "GENERIC_SNAPSHOT"
      ],
      "category": "SECURITY",
      "description": "More permissions are requested.",
      "direction": "n/a",
      "kind": "PERMISSIONS_EXPANDED",
      "rationale": "Review before granting.",
      "severities": [
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "GENERIC_SNAPSHOT"
      ],
      "category": "SECURITY",
      "description": "Permissions were withdrawn.",
      "direction": "n/a",
      "kind": "PERMISSIONS_REDUCED",
      "rationale": "Flows that need them fail.",
      "severities": [
        "BREAKING"
      ]
    },
    {
      "applies_to": [
        "GENERIC_SNAPSHOT"
      ],
      "category": "LEGACY_SNAPSHOT",
      "description": "The observed task result changed.",
      "direction": "n/a",
      "kind": "TASK_RESULT_CHANGED",
      "rationale": "BREAKING when it changed to a failure.",
      "severities": [
        "BREAKING",
        "NON_BREAKING"
      ]
    },
    {
      "applies_to": [
        "GENERIC_SNAPSHOT"
      ],
      "category": "LEGACY_SNAPSHOT",
      "description": "The supplier's published claims hash changed.",
      "direction": "n/a",
      "kind": "CLAIMS_CHANGED",
      "rationale": "Re-verify claims you rely on.",
      "severities": [
        "NON_BREAKING"
      ]
    }
  ],
  "schema_diff_bounds": {
    "max_depth": 6,
    "max_nodes_per_diff": 2000,
    "max_properties_per_object": 200,
    "not_compared": [
      "oneOf/anyOf branch semantics",
      "remote $ref",
      "format",
      "default",
      "examples"
    ],
    "resolves": [
      "local $ref (#/...)",
      "allOf (shallow merge)"
    ]
  },
  "schema_version": "gaip.breaking-change-taxonomy.v1",
  "severity_semantics": {
    "BREAKING": "An existing, correct client can fail or silently change behaviour without a code change.",
    "INFO": "Descriptive change with no expected effect on clients.",
    "NON_BREAKING": "Existing clients keep working; review may still be useful (additions, relaxations, deprecations)."
  },
  "taxonomy_version": "1.0.0"
}