{"record":{"id":"c9b4db9b87e87c34","repo":"rohitg00/ai-engineering-from-scratch","slug":"peer-name-no-mutually-supported-modern-version","errorCode":null,"errorMessage":"{peer.name}: no mutually supported modern version","messagePattern":"(.+?): no mutually supported modern version","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"phases/13-tools-and-protocols/08-building-an-mcp-client/code/main.py","lineNumber":433,"sourceCode":"        except (TimeoutError, ConnectionError) as exc:\n            self._probe_legacy(peer, type(exc).__name__)\n            return\n\n        if response is None:\n            self._probe_legacy(peer, \"empty discovery response\")\n            return\n        if not isinstance(response, dict):\n            raise RuntimeError(f\"{peer.name}: malformed discovery response\")\n        kind, payload = decode_rpc_response(response, request_id)\n        if kind == \"result\":\n            advertised = payload.get(\"supportedVersions\", [])\n            if not isinstance(advertised, list) or not all(\n                isinstance(version, str) for version in advertised\n            ):\n                raise RuntimeError(f\"{peer.name}: malformed modern discovery result\")\n            selected = self._mutual_version(advertised)\n            if selected is None:\n                raise RuntimeError(f\"{peer.name}: no mutually supported modern version\")\n            self._activate_modern(peer, payload, selected)\n            return\n\n        code = payload[\"code\"]\n        if code in RECOGNIZED_MODERN_ERRORS:\n            if code != -32022:\n                raise RuntimeError(f\"{peer.name}: correct modern request error {code} before retrying\")\n            data = payload.get(\"data\")\n            advertised = data.get(\"supported\", []) if isinstance(data, dict) else []\n            selected = self._mutual_version(advertised)\n            if selected is None:\n                raise RuntimeError(f\"{peer.name}: no mutually supported modern version\")\n            retry_id = self._new_id()\n            retry = modern_request(\n                retry_id,\n                \"server/discover\",\n                {},\n                selected,","sourceCodeStart":415,"sourceCodeEnd":451,"githubUrl":"https://github.com/rohitg00/ai-engineering-from-scratch/blob/39ea8a1c6d0b61f071226eff7ede4d4105fed820/phases/13-tools-and-protocols/08-building-an-mcp-client/code/main.py#L415-L451","documentation":"Discovery succeeded and advertised versions, but none of them intersect with the versions this client can speak, so _mutual_version returned None. The client will not pretend to speak a version it does not support.","triggerScenarios":"_mutual_version(advertised) returns None: every entry in the server's supportedVersions list is absent from the client's supported modern versions.","commonSituations":"Major version skew after a server upgrade; client pinned to an old revision set; server advertising only prerelease versions the client excludes.","solutions":["Compare the server's advertised versions with the client's supported set","Upgrade the client's supported version list to include the server's revision","Downgrade or reconfigure the server to advertise a common version"],"exampleFix":"// before\nclient = McpClient(..., supported_modern={\"2.0\"})\n# server advertises [\"2.1\"]\n\n// after\nclient = McpClient(..., supported_modern={\"2.0\", \"2.1\"})","handlingStrategy":"validation","validationCode":"adv = probe_supported_versions(peer)\nif not set(adv) & client.supported_modern:\n    widen_client_versions_or_upgrade_server(client, peer)","typeGuard":"null","tryCatchPattern":"try:\n    client.connect_all()\nexcept RuntimeError as e:\n    if \"no mutually supported modern version\" in str(e):\n        reconcile_version_sets(client, peer)","preventionTips":["Track server version sets in config and diff them at deploy time","Upgrade client support before upgrading servers"],"tags":["mcp","version-mismatch","discovery"],"backgroundTag":"unsupported-protocol-version","analyzedSha":"39ea8a1c6d0b61f071226eff7ede4d4105fed820","analyzedAt":"2026-08-26T03:13:46.626Z","schemaVersion":2},"datasetVersion":"2026-08-26T07:17:17.940Z"}