{"record":{"id":"e93114c41aac0056","repo":"rohitg00/ai-engineering-from-scratch","slug":"peer-name-proven-modern-discovery-retry-failed","errorCode":null,"errorMessage":"{peer.name}: proven-modern discovery retry failed","messagePattern":"(.+?): proven-modern discovery retry failed","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"phases/13-tools-and-protocols/08-building-an-mcp-client/code/main.py","lineNumber":457,"sourceCode":"            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,\n                self.client_capabilities,\n            )\n            try:\n                retried = self._send(peer, retry, self.discovery_timeout_ms)\n            except (TimeoutError, ConnectionError) as exc:\n                raise RuntimeError(f\"{peer.name}: proven-modern discovery retry failed\") from exc\n            if not isinstance(retried, dict):\n                raise RuntimeError(f\"{peer.name}: proven-modern discovery retry returned no result\")\n            retry_kind, retry_payload = decode_rpc_response(retried, retry_id)\n            if retry_kind != \"result\":\n                raise RuntimeError(f\"{peer.name}: proven-modern discovery retry returned an error\")\n            self._activate_modern(peer, retry_payload, selected)\n            return\n\n        self._probe_legacy(peer, f\"unrecognized discovery error {code}\")\n\n    def connect_all(self) -> None:\n        for peer_name in sorted(self.peers):\n            self._connect_peer(self.peers[peer_name])\n\n    def _request(self, peer: Peer, method: str, params: dict[str, Any]) -> dict[str, Any]:\n        request_id = self._new_id()\n        if peer.era == \"modern\":\n            message = modern_request(","sourceCodeStart":439,"sourceCodeEnd":475,"githubUrl":"https://github.com/rohitg00/ai-engineering-from-scratch/blob/39ea8a1c6d0b61f071226eff7ede4d4105fed820/phases/13-tools-and-protocols/08-building-an-mcp-client/code/main.py#L439-L475","documentation":"After a -32022 version hint proved a common version exists, the client resent server/discover with that version and the transport raised TimeoutError or ConnectionError. The retry is bounded by discovery_timeout_ms and fails closed rather than looping.","triggerScenarios":"self._send(peer, retry, self.discovery_timeout_ms) inside the -32022 retry path raises TimeoutError or ConnectionError.","commonSituations":"Server accepting the first request then stalling on the retry; connection reset between the two discovery calls; discovery_timeout_ms too tight for a loaded server.","solutions":["Increase discovery_timeout_ms","Check peer health and connection stability between the two discovery round trips","Look at server logs for a crash or deadlock triggered by the versioned retry","Re-run connect_all once transient network issues are ruled out"],"exampleFix":"// before\nclient = McpClient(..., discovery_timeout_ms=1000)\n\n// after\nclient = McpClient(..., discovery_timeout_ms=8000)","handlingStrategy":"retry","validationCode":"if peer_rtt(peer) > client.discovery_timeout_ms:\n    client.discovery_timeout_ms = peer_rtt(peer) * 4","typeGuard":"null","tryCatchPattern":"try:\n    client.connect_all()\nexcept RuntimeError as e:\n    if \"discovery retry failed\" in str(e) and transient:  # after fixing cause\n        client.connect_all()","preventionTips":["Budget discovery_timeout_ms for two round trips, not one","Watch for connection resets between paired requests"],"tags":["mcp","timeout","network","discovery"],"backgroundTag":"connection-timeout","analyzedSha":"39ea8a1c6d0b61f071226eff7ede4d4105fed820","analyzedAt":"2026-08-26T03:13:46.626Z","schemaVersion":2},"datasetVersion":"2026-08-26T07:17:17.940Z"}