[{"data":1,"prerenderedAt":70},["ShallowReactive",2],{"wiki-mcp-mcp-server-regression-testing-en":3},{"meta":4,"html":8,"headings":9,"words":69},{"title":5,"description":6,"published":7,"updated":7},"Regression testing of an MCP server","Regression testing of an MCP server: snapshots of tools/list, breaking changes, protocol version support, model behavior after description edits, CI.","2026-11-03","\u003Cp>\u003Cstrong>Regression testing of an MCP server\u003C/strong> is checking that a new version of the server has not broken what worked in the previous one: the contract that clients rely on (the lists of tools, resources and prompts with their schemas and error semantics), the protocol versions the server supports, and the behavior of models that choose tools by their descriptions. The general concept of \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"regression-testing\">regression testing\u003C/span> is described in the article \u003Ca href=\"/en/wiki/test-management/test-run\" class=\"wiki-link wiki-link--article\">Test run\u003C/a>; the basics of testing \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"mcp-server\">MCP servers\u003C/span> are in \u003Ca href=\"/en/wiki/mcp/testing-mcp-servers\" class=\"wiki-link wiki-link--article\">Testing MCP servers: the basics\u003C/a>.\u003C/p>\n\u003Cp>The current MCP specification is version \u003Cstrong>2026-07-28\u003C/strong>. It defines how protocol versions are identified and negotiated and, since that version, a formal deprecation policy for features of the protocol. It does not define versioning of the tools of a particular server or rules of their compatibility: these remain the responsibility of the server author. Since SEP-3398, accepted on 14 October 2026, new versions of the specification are planned every six months.\u003C/p>\n\u003Ch2 id=\"overview\" class=\"wiki-heading\">Overview\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"overview\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Property\u003C/th>\n\u003Cth>Value\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Object\u003C/td>\n\u003Ctd>Contract of the server, protocol behavior, behavior of models\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Contract\u003C/td>\n\u003Ctd>\u003Ccode>tools/list\u003C/code>, \u003Ccode>resources/list\u003C/code>, \u003Ccode>resources/templates/list\u003C/code>, \u003Ccode>prompts/list\u003C/code>, \u003Ccode>server/discover\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Baseline\u003C/td>\n\u003Ctd>Contract snapshot and results of the previous release\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Protocol versions\u003C/td>\n\u003Ctd>\u003Ccode>YYYY-MM-DD\u003C/code> identifiers, current 2026-07-28\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Deprecation window\u003C/td>\n\u003Ctd>At least twelve months, at least ninety days for expedited removal\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Tools\u003C/td>\n\u003Ctd>MCP Inspector CLI, conformance test suite, evaluation set\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Tool compatibility rules\u003C/td>\n\u003Ctd>Not defined by the specification\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch2 id=\"the-problem-it-solves\" class=\"wiki-heading\">The problem it solves\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"the-problem-it-solves\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Between releases, tools of an MCP server are added and renamed, descriptions are edited, the SDK and the supported protocol versions are updated. Each kind of consumer of the server depends on a different part of it.\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Clients\u003C/strong> cache lists. The results of \u003Ccode>tools/list\u003C/code>, \u003Ccode>prompts/list\u003C/code>, \u003Ccode>resources/list\u003C/code> and \u003Ccode>resources/templates/list\u003C/code> carry \u003Ccode>ttlMs\u003C/code>, and a client may use a cached list until it expires.\u003C/li>\n\u003Cli>\u003Cstrong>Host settings\u003C/strong> refer to tools by name. In Claude Code, for example, a permission rule names a tool as \u003Ccode>mcp__&lt;server&gt;__&lt;tool&gt;\u003C/code>.\u003C/li>\n\u003Cli>\u003Cstrong>Scripts and agents\u003C/strong> call tools with fixed arguments and parse structured results.\u003C/li>\n\u003Cli>\u003Cstrong>Models\u003C/strong> choose tools by name, description and schema.\u003C/li>\n\u003C/ul>\n\u003Cp>The protocol has no version field on a tool: a tool definition consists of \u003Ccode>name\u003C/code>, \u003Ccode>title\u003C/code>, \u003Ccode>description\u003C/code>, \u003Ccode>icons\u003C/code>, \u003Ccode>inputSchema\u003C/code>, \u003Ccode>outputSchema\u003C/code>, \u003Ccode>annotations\u003C/code> and \u003Ccode>_meta\u003C/code>. A breaking change becomes visible only when two versions of the contract are compared.\u003C/p>\n\u003Ch2 id=\"contract-of-an-mcp-server\" class=\"wiki-heading\">Contract of an MCP server\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"contract-of-an-mcp-server\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>The contract is the part of the server that a client can observe without reading its code. The table shows which lists it includes and which fields are compared.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>List\u003C/th>\n\u003Cth>Method\u003C/th>\n\u003Cth>Compared fields\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Tools\u003C/td>\n\u003Ctd>\u003Ccode>tools/list\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>name\u003C/code>, \u003Ccode>title\u003C/code>, \u003Ccode>description\u003C/code>, \u003Ccode>inputSchema\u003C/code>, \u003Ccode>outputSchema\u003C/code>, \u003Ccode>annotations\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Resources\u003C/td>\n\u003Ctd>\u003Ccode>resources/list\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>uri\u003C/code>, \u003Ccode>name\u003C/code>, \u003Ccode>title\u003C/code>, \u003Ccode>description\u003C/code>, \u003Ccode>mimeType\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Resource templates\u003C/td>\n\u003Ctd>\u003Ccode>resources/templates/list\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>uriTemplate\u003C/code>, \u003Ccode>name\u003C/code>, \u003Ccode>title\u003C/code>, \u003Ccode>description\u003C/code>, \u003Ccode>mimeType\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Prompts\u003C/td>\n\u003Ctd>\u003Ccode>prompts/list\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>name\u003C/code>, \u003Ccode>title\u003C/code>, \u003Ccode>description\u003C/code>, \u003Ccode>arguments\u003C/code> with \u003Ccode>name\u003C/code>, \u003Ccode>description\u003C/code>, \u003Ccode>required\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Server\u003C/td>\n\u003Ctd>\u003Ccode>server/discover\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>supportedVersions\u003C/code>, \u003Ccode>capabilities\u003C/code> including \u003Ccode>extensions\u003C/code>, \u003Ccode>instructions\u003C/code>\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>Error semantics belong to the contract too, although no list describes them: which failures return a JSON-RPC error and which return a tool result with \u003Ccode>isError: true\u003C/code>, and with which codes. They are checked with tests of error cases, not with a snapshot. The design of the lists themselves is described in the articles \u003Ca href=\"/en/wiki/mcp/mcp-tools\" class=\"wiki-link wiki-link--article\">Tools in MCP\u003C/a> and \u003Ca href=\"/en/wiki/mcp/mcp-prompts\" class=\"wiki-link wiki-link--article\">Prompts in MCP\u003C/a>.\u003C/p>\n\u003Ch2 id=\"contract-snapshots\" class=\"wiki-heading\">Contract snapshots\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"contract-snapshots\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Ch3 id=\"taking-a-snapshot\" class=\"wiki-heading\">Taking a snapshot\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"taking-a-snapshot\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>A \u003Cstrong>contract snapshot\u003C/strong> is the saved and normalized result of the list methods of one server version. The snapshot of the last release is stored in the repository and serves as the baseline; the snapshot of the candidate version is compared with it.\u003C/p>\n\u003Cp>The MCP Inspector CLI runs one request per call and prints the result as JSON with \u003Ccode>--format json\u003C/code>. The \u003Ccode>--protocol-era\u003C/code> flag selects the protocol era: \u003Ccode>legacy\u003C/code> (the default, an \u003Ccode>initialize\u003C/code> handshake), \u003Ccode>auto\u003C/code> (probe \u003Ccode>server/discover\u003C/code> first, fall back to \u003Ccode>initialize\u003C/code>) or \u003Ccode>modern\u003C/code> (exactly 2026-07-28, no fallback). A snapshot of a modern server is taken with \u003Ccode>--protocol-era modern\u003C/code>; without the flag the CLI connects in the legacy era.\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"bash\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">Bash\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Copied\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Copy\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Copied\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>set -euo pipefail\nmkdir -p snapshot\n\ninspect() {\n  npx @modelcontextprotocol/inspector --cli node build/index.js \\\n    --protocol-era modern --method &quot;$1&quot; --format json\n}\n\ninspect tools/list | jq -S '.result.tools | sort_by(.name)' &gt; snapshot/tools.json\ninspect resources/list | jq -S '.result.resources | sort_by(.uri)' &gt; snapshot/resources.json\ninspect resources/templates/list \\\n  | jq -S '.result.resourceTemplates | sort_by(.uriTemplate)' &gt; snapshot/resource-templates.json\ninspect prompts/list | jq -S '.result.prompts | sort_by(.name)' &gt; snapshot/prompts.json\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>Normalization keeps only the lists and sorts them by a stable key, so a change in order alone does not look like a change of the contract. Fields such as \u003Ccode>nextCursor\u003C/code>, \u003Ccode>ttlMs\u003C/code> and \u003Ccode>cacheScope\u003C/code> describe delivery, not the contract, and are left out.\u003C/p>\n\u003Cp>Two rules of the specification affect what a snapshot contains. First, the list of tools may vary by the authorization of the request, for example by the scopes of the token. A server with such behavior gets a snapshot per authorization profile. Second, lists can be paginated, and there is no consistency guarantee across pages. A client that needs a consistent full list re-fetches it from the beginning, and a snapshot follows the same rule.\u003C/p>\n\u003Ch3 id=\"comparing-snapshots\" class=\"wiki-heading\">Comparing snapshots\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"comparing-snapshots\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>A text diff of the normalized files (\u003Ccode>diff baseline/tools.json snapshot/tools.json\u003C/code>) shows every change but does not tell a breaking change from a harmless one. For that, a script classifies the changes by the rules in the sections below. The format of its report is not defined by the specification; the example shows one possible format.\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"json\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">JSON\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Copied\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Copy\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Copied\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>{\n  &quot;baseline&quot;: &quot;1.4.0&quot;,\n  &quot;candidate&quot;: &quot;1.5.0&quot;,\n  &quot;changes&quot;: [\n    {\n      &quot;list&quot;: &quot;tools&quot;,\n      &quot;name&quot;: &quot;search_issues&quot;,\n      &quot;kind&quot;: &quot;removed&quot;,\n      &quot;breaksClients&quot;: true,\n      &quot;affectsModels&quot;: true\n    },\n    {\n      &quot;list&quot;: &quot;tools&quot;,\n      &quot;name&quot;: &quot;create_issue&quot;,\n      &quot;path&quot;: &quot;inputSchema.required&quot;,\n      &quot;kind&quot;: &quot;required_parameter_added&quot;,\n      &quot;before&quot;: [&quot;project&quot;, &quot;title&quot;],\n      &quot;after&quot;: [&quot;project&quot;, &quot;title&quot;, &quot;priority&quot;],\n      &quot;breaksClients&quot;: true,\n      &quot;affectsModels&quot;: true\n    },\n    {\n      &quot;list&quot;: &quot;tools&quot;,\n      &quot;name&quot;: &quot;get_issue&quot;,\n      &quot;path&quot;: &quot;outputSchema.properties.assignee.type&quot;,\n      &quot;kind&quot;: &quot;type_changed&quot;,\n      &quot;before&quot;: &quot;string&quot;,\n      &quot;after&quot;: &quot;object&quot;,\n      &quot;breaksClients&quot;: true,\n      &quot;affectsModels&quot;: false\n    },\n    {\n      &quot;list&quot;: &quot;tools&quot;,\n      &quot;name&quot;: &quot;update_issue&quot;,\n      &quot;path&quot;: &quot;description&quot;,\n      &quot;kind&quot;: &quot;description_changed&quot;,\n      &quot;breaksClients&quot;: false,\n      &quot;affectsModels&quot;: true\n    }\n  ]\n}\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>In this scheme, a CI job fails on changes with \u003Ccode>breaksClients: true\u003C/code>, and changes with \u003Ccode>affectsModels: true\u003C/code> start the evaluation described below.\u003C/p>\n\u003Ch2 id=\"changes-that-break-clients\" class=\"wiki-heading\">Changes that break clients\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"changes-that-break-clients\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>A breaking change makes a call that worked against the previous version fail against the new one, or makes a client misread the result.\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Removed or renamed tool.\u003C/strong> A \u003Ccode>tools/call\u003C/code> with the old name gets a \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"protocol-error\">protocol error\u003C/span>; the example in the specification answers an unknown tool with the JSON-RPC code \u003Ccode>-32602\u003C/code>. A client with a cached list keeps offering the old name until \u003Ccode>ttlMs\u003C/code> expires, and host settings that name the tool stop matching it.\u003C/li>\n\u003Cli>\u003Cstrong>New required parameter.\u003C/strong> Calls that worked before lack the parameter and fail validation. Since SEP-1303 such errors are returned as \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"tool-execution-error\">tool execution errors\u003C/span> with \u003Ccode>isError: true\u003C/code>.\u003C/li>\n\u003Cli>\u003Cstrong>Narrowed type.\u003C/strong> A string becomes an \u003Ccode>enum\u003C/code>, a \u003Ccode>maximum\u003C/code> decreases, a \u003Ccode>pattern\u003C/code> appears, \u003Ccode>additionalProperties: false\u003C/code> is added. Values that were valid are rejected. \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"boundary-value\">Boundary values\u003C/span> of the old and the new schema are the natural test data; the technique is described in the article \u003Ca href=\"/en/wiki/test-design/equivalence-partitioning-and-boundary-values\" class=\"wiki-link wiki-link--article\">Equivalence partitioning and boundary values\u003C/a>.\u003C/li>\n\u003Cli>\u003Cstrong>Changed \u003Ccode>outputSchema\u003C/code>.\u003C/strong> A property is removed or renamed, its type changes, it leaves \u003Ccode>required\u003C/code>. The specification requires the server to return \u003Ccode>structuredContent\u003C/code> that conforms to \u003Ccode>outputSchema\u003C/code> and recommends that clients validate it. A client that relies on the old structure breaks.\u003C/li>\n\u003Cli>\u003Cstrong>Changed error semantics.\u003C/strong> A failure moves from \u003Ccode>isError: true\u003C/code> to a JSON-RPC error or back, or an error code changes. The specification itself made such a change in 2026-07-28: the code for a resource that is not found changed from \u003Ccode>-32002\u003C/code> to \u003Ccode>-32602\u003C/code> (SEP-2164). According to SEP-2164, the official SDKs used at least four different codes for this case before, so an SDK update can change the codes of a server without changes to its own code.\u003C/li>\n\u003Cli>\u003Cstrong>Changed resource URIs or templates.\u003C/strong> A client that stored a URI or built it from a template no longer finds the resource.\u003C/li>\n\u003Cli>\u003Cstrong>Removed capability or extension.\u003C/strong> A client that relies on \u003Ccode>listChanged\u003C/code> or on an extension goes back to the fallback behavior or gets an error.\u003C/li>\n\u003C/ul>\n\u003Cp>A client on \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"streamable-http\">Streamable HTTP\u003C/span> must exclude from the list a tool whose \u003Ccode>x-mcp-header\u003C/code> value violates the constraints of the specification. An invalid annotation added to one parameter therefore removes the tool from the client without an error on the server side.\u003C/p>\n\u003Ch2 id=\"changes-that-affect-models\" class=\"wiki-heading\">Changes that affect models\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"changes-that-affect-models\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Some changes keep every call valid and still change what the model does, and with it the result of tasks.\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Edited description.\u003C/strong> The description of a tool and of its parameters is the main signal for the model. Anthropic reports that even small refinements of tool descriptions can change the results considerably; the same holds in the other direction.\u003C/li>\n\u003Cli>\u003Cstrong>Edited title.\u003C/strong> The specification intends \u003Ccode>title\u003C/code> for display to users. Whether a host also passes it to the model, the specification does not define.\u003C/li>\n\u003Cli>\u003Cstrong>New tool.\u003C/strong> A tool with a purpose close to an existing one makes the choice harder.\u003C/li>\n\u003Cli>\u003Cstrong>Changed \u003Ccode>instructions\u003C/code>.\u003C/strong> The \u003Ccode>instructions\u003C/code> field of \u003Ccode>server/discover\u003C/code> can be added by a client to the system prompt.\u003C/li>\n\u003Cli>\u003Cstrong>Changed annotations.\u003C/strong> Hints such as \u003Ccode>readOnlyHint\u003C/code> and \u003Ccode>destructiveHint\u003C/code> do not change the protocol. The specification requires clients to treat them as untrusted unless the server is trusted, and does not define how a host uses them.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"summary-of-changes\" class=\"wiki-heading\">Summary of changes\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"summary-of-changes\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>The table brings together the kinds of changes, their effect on clients and models, and the check that detects each of them.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-4\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Kind of change\u003C/th>\n\u003Cth>Breaks protocol clients\u003C/th>\n\u003Cth>Affects models\u003C/th>\n\u003Cth>How detected\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Tool removed or renamed\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>Snapshot diff, \u003Ccode>tools/call\u003C/code> in a smoke test\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>New required parameter\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>Diff of \u003Ccode>required\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Narrowed type of a parameter\u003C/td>\n\u003Ctd>Yes, for values outside the new range\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>Diff of the schema, boundary value tests\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Changed \u003Ccode>outputSchema\u003C/code>\u003C/td>\n\u003Ctd>Yes, for clients that validate or parse\u003C/td>\n\u003Ctd>Possibly\u003C/td>\n\u003Ctd>Diff, validation of \u003Ccode>structuredContent\u003C/code> in tests\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Changed error semantics\u003C/td>\n\u003Ctd>Yes, for clients that branch on errors\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>Tests of error cases, conformance test suite\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Protocol version dropped\u003C/td>\n\u003Ctd>Yes, for clients on that version\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>Conformance runs per revision, Inspector per era\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Invalid \u003Ccode>x-mcp-header\u003C/code>\u003C/td>\n\u003Ctd>Tool excluded by HTTP clients\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>Diff, check of the constraints\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Description or title edited\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>Diff, evaluation set\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>New tool\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>Diff, evaluation set with tasks where the tool is not needed\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>New optional parameter\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>Possibly\u003C/td>\n\u003Ctd>Diff, evaluation set\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Annotations changed\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>Not directly\u003C/td>\n\u003Ctd>Diff, review of host behavior\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch2 id=\"protocol-version-support\" class=\"wiki-heading\">Protocol version support\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"protocol-version-support\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Ch3 id=\"version-identifiers-and-negotiation\" class=\"wiki-heading\">Version identifiers and negotiation\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"version-identifiers-and-negotiation\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>A protocol version is a string in the form \u003Ccode>YYYY-MM-DD\u003C/code>: the date of the last backwards incompatible change. Compatible changes do not increase the version. A revision of the specification is Draft, Current or Final; the current revision is 2026-07-28.\u003C/p>\n\u003Cp>Every request declares its version in \u003Ccode>_meta\u003C/code>, in \u003Ccode>io.modelcontextprotocol/protocolVersion\u003C/code>; on Streamable HTTP the same value is also sent in the \u003Ccode>MCP-Protocol-Version\u003C/code> header. The server accepts or rejects each request independently. For a version it does not support, it returns \u003Ccode>UnsupportedProtocolVersionError\u003C/code> with the supported versions and the requested one; on HTTP the status code is \u003Ccode>400 Bad Request\u003C/code>.\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"json\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">JSON\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Copied\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Copy\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Copied\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>{\n  &quot;jsonrpc&quot;: &quot;2.0&quot;,\n  &quot;id&quot;: 1,\n  &quot;error&quot;: {\n    &quot;code&quot;: -32022,\n    &quot;message&quot;: &quot;Unsupported protocol version&quot;,\n    &quot;data&quot;: {\n      &quot;supported&quot;: [&quot;2026-07-28&quot;, &quot;2025-11-25&quot;],\n      &quot;requested&quot;: &quot;1900-01-01&quot;\n    }\n  }\n}\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>The list of supported versions is part of the contract. It is returned by \u003Ccode>server/discover\u003C/code> in \u003Ccode>supportedVersions\u003C/code>, and a regression test checks it in two ways: the field contains the expected versions, and a request with an unsupported version, such as \u003Ccode>1900-01-01\u003C/code> above, gets code \u003Ccode>-32022\u003C/code> with the same list in \u003Ccode>data.supported\u003C/code>.\u003C/p>\n\u003Ch3 id=\"legacy-and-modern-versions\" class=\"wiki-heading\">Legacy and modern versions\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"legacy-and-modern-versions\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>The specification calls versions up to 2025-11-25, which open a session with an \u003Ccode>initialize\u003C/code> handshake, \u003Cstrong>legacy\u003C/strong>, and versions from 2026-07-28 on, which pass the version and capabilities in every request, \u003Cstrong>modern\u003C/strong>. A \u003Cstrong>dual-era\u003C/strong> implementation supports both. Its compatibility matrix shows what dropping a version means:\u003C/p>\n\u003Cul>\n\u003Cli>a legacy client and a dual-era server work;\u003C/li>\n\u003Cli>a legacy client and a server that supports only modern versions do not work, and a legacy client has no way to move to a newer version;\u003C/li>\n\u003Cli>a modern client and a legacy server do not work.\u003C/li>\n\u003C/ul>\n\u003Cp>Removing legacy support from a dual-era server is therefore a breaking change for every legacy client. The changes of 2026-07-28 and migration from 2025-11-25 are described in the article \u003Ca href=\"/en/wiki/mcp/stateless-mcp\" class=\"wiki-link wiki-link--article\">Stateless MCP\u003C/a>.\u003C/p>\n\u003Cp>A dual-era server is tested on both wires. The conformance \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"test-suite\">test suite\u003C/span> has a requirement set for each revision (\u003Ccode>--requirements 2025-11-25\u003C/code>, \u003Ccode>--requirements 2026-07-28\u003C/code>), and each set runs at the wire version of its revision. According to the suite's documentation, a scenario that belongs to both revisions has to be run twice, because passing it on one wire says nothing about the other. MCP Inspector checks the same server in both eras with \u003Ccode>--protocol-era legacy\u003C/code> and \u003Ccode>--protocol-era modern\u003C/code>.\u003C/p>\n\u003Ch3 id=\"deprecation-policy\" class=\"wiki-heading\">Deprecation policy\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"deprecation-policy\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>Since 2026-07-28, features of the specification have three states: Active, Deprecated and Removed (SEP-2596). The \u003Cstrong>deprecation window\u003C/strong>, the time a deprecated feature stays in the specification, is at least twelve months, counted from the release of the revision that first marked the feature as deprecated. The feature becomes eligible for removal in the first revision released on or after the end of that window. For a feature with an active security risk, the window can be shortened, but not below ninety days.\u003C/p>\n\u003Cp>The specification keeps a registry of deprecated features. In 2026-07-28 it lists:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Feature\u003C/th>\n\u003Cth>Deprecated in\u003C/th>\n\u003Cth>Earliest removal\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Roots, Sampling, Logging\u003C/td>\n\u003Ctd>2026-07-28\u003C/td>\n\u003Ctd>First revision released on or after 2027-07-28\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Dynamic Client Registration\u003C/td>\n\u003Ctd>2026-07-28\u003C/td>\n\u003Ctd>First revision released on or after 2027-07-28\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>includeContext\u003C/code> values \u003Ccode>thisServer\u003C/code> and \u003Ccode>allServers\u003C/code>\u003C/td>\n\u003Ctd>2025-11-25\u003C/td>\n\u003Ctd>No later than Sampling\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>HTTP+SSE transport\u003C/td>\n\u003Ctd>2025-03-26\u003C/td>\n\u003Ctd>Three months after SEP-2596 reaches Final\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>A server that uses a deprecated feature therefore has a known date after which a new revision may not support it. Tier 1 SDKs must mark deprecated APIs with the native mechanism of the language in their next release and should emit a runtime warning when a deprecated feature is used, so new deprecation warnings in build logs and test output are a signal to check.\u003C/p>\n\u003Ch3 id=\"release-cadence\" class=\"wiki-heading\">Release cadence\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"release-cadence\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>SEP-3398 plans releases of the specification generally on the last Tuesday of March and September, and moves the release planned for December 2026 to late March 2027. Tier 1 SDKs publish beta versions about one and a half months before a release for testing in the ecosystem. A run of the regression suite against an SDK beta shows the effect of the next revision before it is released.\u003C/p>\n\u003Ch2 id=\"regression-of-model-behavior\" class=\"wiki-heading\">Regression of model behavior\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"regression-of-model-behavior\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>A change that affects models is checked by running the \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"evaluation-set\">evaluation set\u003C/span> again: the same tasks, the same models and hosts, the same number of trials. The method is described in the article \u003Ca href=\"/en/wiki/mcp/evaluating-mcp-servers\" class=\"wiki-link wiki-link--article\">Evaluating an MCP server with models\u003C/a>; for regression testing four points matter.\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>The regression set.\u003C/strong> Anthropic separates capability evaluations, with a low success rate, from regression evaluations, whose success rate stays close to 100 percent. After a description edit the regression set runs first.\u003C/li>\n\u003Cli>\u003Cstrong>Paired comparison.\u003C/strong> The old and the new version run on the same tasks, and the results are compared task by task.\u003C/li>\n\u003Cli>\u003Cstrong>More than success.\u003C/strong> The number of tool calls, tokens and tool errors are compared along with the success rate. A description that keeps the success rate but doubles the calls is a regression too.\u003C/li>\n\u003Cli>\u003Cstrong>Tasks without a tool.\u003C/strong> Tasks where the right behavior is not to call a tool detect a new or edited tool that is called where it is not needed.\u003C/li>\n\u003C/ul>\n\u003Cp>The trigger for this run comes from the snapshot diff: a changed \u003Ccode>description\u003C/code> or \u003Ccode>title\u003C/code>, a new tool, changed \u003Ccode>instructions\u003C/code>.\u003C/p>\n\u003Ch2 id=\"regression-testing-in-ci\" class=\"wiki-heading\">Regression testing in CI\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"regression-testing-in-ci\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>The diagram shows a typical \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"ci-pipeline\">pipeline\u003C/span>: from cheap deterministic checks to expensive statistical ones.\u003C/p>\n\u003Cdiv class=\"wiki-code wiki-code--plain\">\u003Cpre>\u003Ccode>build\n |\n +-- unit tests of tool handlers\n +-- start the server\n +-- Inspector smoke test: tools/list --strict, tools/call\n +-- contract snapshot + diff with the baseline\n |     breaking change -&gt; fail\n |     description change -&gt; mark for evaluation\n +-- conformance suite per revision, with expected failures\n |\n +-- evaluation set (marked changes, schedule)\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>The conformance suite runs against a server over HTTP. A YAML file with known failures is passed with \u003Ccode>--expected-failures\u003C/code>:\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"yaml\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">yaml\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Copied\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Copy\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Copied\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>server:\n  - tools-call-with-progress\n  - server-stateless:sep-2575-server-implements-discover\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>An entry names either a whole scenario or a single check in the form \u003Ccode>&lt;scenario&gt;:&lt;check-id&gt;\u003C/code>. The second form excuses one check and keeps the others of the scenario enforced. The exit code follows four rules:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Scenario result\u003C/th>\n\u003Cth>In the file\u003C/th>\n\u003Cth>Exit code\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Fails\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>0, expected failure\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Fails\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>1, regression\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Passes\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>1, the entry is stale and must be removed\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Passes\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>0\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>By the third rule, CI fails after a fix until the entry is removed. For a dual-era server the suite runs once per requirement set:\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"bash\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">Bash\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Copied\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Copy\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Copied\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>npx @modelcontextprotocol/conformance server --url http://localhost:3000/mcp \\\n  --requirements 2026-07-28 --expected-failures ./conformance-baseline.yml\n\nnpx @modelcontextprotocol/conformance server --url http://localhost:3000/mcp \\\n  --requirements 2025-11-25 --expected-failures ./conformance-baseline.yml\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>According to the suite's documentation, a requirement set is frozen at the release of its revision and lives in the suite's repository, while an expected-failures file lives in the repository of the implementation. A failure listed in the file is still a failure against the requirement set. The organization of \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"test-run\">test runs\u003C/span> in CI pipelines in general is described in the article \u003Ca href=\"/en/wiki/test-automation/automated-tests-in-ci\" class=\"wiki-link wiki-link--article\">Automated tests in CI\u003C/a>.\u003C/p>\n\u003Ch2 id=\"contract-checks-conformance-and-evaluation\" class=\"wiki-heading\">Contract checks, conformance and evaluation\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"contract-checks-conformance-and-evaluation\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>The table compares the three checks of the pipeline, which answer different questions.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-4\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003C/th>\n\u003Cth>Contract check\u003C/th>\n\u003Cth>Conformance testing\u003C/th>\n\u003Cth>Re-run of the evaluation\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Question\u003C/td>\n\u003Ctd>Did the server's own contract change?\u003C/td>\n\u003Ctd>Does the server still follow the protocol?\u003C/td>\n\u003Ctd>Do models still complete the tasks?\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Baseline\u003C/td>\n\u003Ctd>Snapshot of the previous release\u003C/td>\n\u003Ctd>Requirements of a revision\u003C/td>\n\u003Ctd>Results of the previous release\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Finds\u003C/td>\n\u003Ctd>Removed tools, new required parameters, changed schemas\u003C/td>\n\u003Ctd>Protocol defects, also after SDK updates\u003C/td>\n\u003Ctd>Effects of descriptions and new tools\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Determinism\u003C/td>\n\u003Ctd>Deterministic\u003C/td>\n\u003Ctd>Deterministic\u003C/td>\n\u003Ctd>Statistical\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>When\u003C/td>\n\u003Ctd>Every change\u003C/td>\n\u003Ctd>Every change\u003C/td>\n\u003Ctd>Changes of descriptions, schedule\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>The contract check compares the server with itself; conformance testing compares it with the specification. A server can pass conformance and still break its clients by renaming a tool, or keep its contract and fail conformance after an SDK update. Only the evaluation shows how models react to an edited description.\u003C/p>\n\u003Ch2 id=\"terms\" class=\"wiki-heading\">Terms\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"terms\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Term\u003C/th>\n\u003Cth>Meaning\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Contract of an MCP server\u003C/td>\n\u003Ctd>Lists of tools, resources, resource templates and prompts, supported versions, capabilities and error semantics observable by a client\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Contract snapshot\u003C/td>\n\u003Ctd>Saved and normalized result of the list methods of one server version\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Breaking change\u003C/td>\n\u003Ctd>Change after which a call that worked against the previous version fails or its result is misread\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Legacy and modern versions\u003C/td>\n\u003Ctd>Protocol versions up to 2025-11-25 with an \u003Ccode>initialize\u003C/code> handshake, and from 2026-07-28 with version and capabilities in every request\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Dual-era implementation\u003C/td>\n\u003Ctd>Client or server that supports both legacy and modern protocol versions\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Deprecation window\u003C/td>\n\u003Ctd>Time a deprecated feature stays in the specification before it can be removed, at least twelve months\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Expected failures\u003C/td>\n\u003Ctd>Baseline file of known conformance failures, passed with \u003Ccode>--expected-failures\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Requirement set\u003C/td>\n\u003Ctd>Frozen list of conformance scenarios that a revision of the specification requires\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch2 id=\"sources\" class=\"wiki-heading\">Sources\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"sources\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28/basic/versioning\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Versioning and Compatibility, specification 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/docs/2026-07-28/learn/versioning\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Versioning, MCP documentation\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28/deprecated\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Deprecated Features, specification 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/community/feature-lifecycle\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Feature Lifecycle and Deprecation Policy\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28/changelog\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Key Changes, specification 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28/server/tools\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Tools, specification 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28/server/utilities/caching\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Caching, specification 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://github.com/modelcontextprotocol/specification/blob/main/schema/2026-07-28/schema.ts\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Schema of the specification 2026-07-28, schema.ts, GitHub\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/seps/1303-input-validation-errors-as-tool-execution-errors\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">SEP-1303: Input Validation Errors as Tool Execution Errors\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/seps/2164-resource-not-found-error\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">SEP-2164: Standardize Resource Not Found Error Code\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/seps/2596-spec-feature-lifecycle-and-deprecation\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">SEP-2596: Specification Feature Lifecycle and Deprecation Policy\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/seps/3398-release-cycle-updates\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">SEP-3398: Release Cycle Updates\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/docs/2026-07-28/tools/inspector/cli\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">MCP Inspector, CLI client\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/docs/2026-07-28/tools/inspector/protocol-eras\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">MCP Inspector, protocol eras\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://github.com/modelcontextprotocol/conformance\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">MCP conformance test suite, GitHub\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://code.claude.com/docs/en/permissions\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Configure permissions, Claude Code documentation\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.anthropic.com/engineering/writing-tools-for-agents\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Writing effective tools for agents, Anthropic, 11 September 2025\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Demystifying evals for AI agents, Anthropic, 9 January 2026\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003C/ul>\n",[10,14,17,20,23,27,30,33,36,39,42,45,48,51,54,57,60,63,66],{"id":11,"level":12,"text":13},"overview",2,"Overview",{"id":15,"level":12,"text":16},"the-problem-it-solves","The problem it solves",{"id":18,"level":12,"text":19},"contract-of-an-mcp-server","Contract of an MCP server",{"id":21,"level":12,"text":22},"contract-snapshots","Contract snapshots",{"id":24,"level":25,"text":26},"taking-a-snapshot",3,"Taking a snapshot",{"id":28,"level":25,"text":29},"comparing-snapshots","Comparing snapshots",{"id":31,"level":12,"text":32},"changes-that-break-clients","Changes that break clients",{"id":34,"level":12,"text":35},"changes-that-affect-models","Changes that affect models",{"id":37,"level":12,"text":38},"summary-of-changes","Summary of changes",{"id":40,"level":12,"text":41},"protocol-version-support","Protocol version support",{"id":43,"level":25,"text":44},"version-identifiers-and-negotiation","Version identifiers and negotiation",{"id":46,"level":25,"text":47},"legacy-and-modern-versions","Legacy and modern versions",{"id":49,"level":25,"text":50},"deprecation-policy","Deprecation policy",{"id":52,"level":25,"text":53},"release-cadence","Release cadence",{"id":55,"level":12,"text":56},"regression-of-model-behavior","Regression of model behavior",{"id":58,"level":12,"text":59},"regression-testing-in-ci","Regression testing in CI",{"id":61,"level":12,"text":62},"contract-checks-conformance-and-evaluation","Contract checks, conformance and evaluation",{"id":64,"level":12,"text":65},"terms","Terms",{"id":67,"level":12,"text":68},"sources","Sources",2907,1793718920216]