{"record":{"id":"9d69de6a5c6e1f07","repo":"rohitg00/ai-engineering-from-scratch","slug":"peer-name-modern-result-omitted-resulttype","errorCode":null,"errorMessage":"{peer.name}: modern result omitted resultType","messagePattern":"(.+?): modern result omitted resultType","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"phases/13-tools-and-protocols/08-building-an-mcp-client/code/main.py","lineNumber":494,"sourceCode":"                request_id,\n                method,\n                params,\n                peer.protocol_version or PROTOCOL_VERSION,\n                self.client_capabilities,\n            )\n        elif peer.era == \"legacy\":\n            message = legacy_request(request_id, method, params)\n        else:\n            raise RuntimeError(f\"{peer.name}: protocol era not selected\")\n        response = self._send(peer, message)\n        if not isinstance(response, dict):\n            raise RuntimeError(f\"{peer.name}: missing response\")\n        kind, payload = decode_rpc_response(response, request_id)\n        if kind != \"result\":\n            raise RuntimeError(f\"{peer.name}: RPC error {payload}\")\n        result = dict(payload)\n        if peer.era == \"modern\" and \"resultType\" not in result:\n            raise RuntimeError(f\"{peer.name}: modern result omitted resultType\")\n        if peer.era == \"legacy\":\n            result.setdefault(\"resultType\", \"complete\")\n        return result\n\n    def discover_tools(self) -> None:\n        for peer_name in sorted(self.peers):\n            peer = self.peers[peer_name]\n            if peer.available:\n                result = self._request(peer, \"tools/list\", {})\n                peer.tools = sorted(result.get(\"tools\", []), key=lambda tool: tool[\"name\"])\n\n    def merge(self, policy: str = \"prefix-on-collision\") -> None:\n        if policy not in {\"prefix-on-collision\", \"reject\"}:\n            raise ValueError(\"policy must be prefix-on-collision or reject\")\n        self.registry.clear()\n        for peer_name in sorted(self.peers):\n            peer = self.peers[peer_name]\n            for tool in peer.tools:","sourceCodeStart":476,"sourceCodeEnd":512,"githubUrl":"https://github.com/rohitg00/ai-engineering-from-scratch/blob/39ea8a1c6d0b61f071226eff7ede4d4105fed820/phases/13-tools-and-protocols/08-building-an-mcp-client/code/main.py#L476-L512","documentation":"A modern-era request returned a successful result, but the result object lacks the required resultType field. The modern protocol mandates an explicit completion marker; only legacy results get a defaulted 'complete'. Its absence means the server is not conformant with the modern result schema.","triggerScenarios":"peer.era == 'modern', decode_rpc_response returned a result dict, and 'resultType' not in result.","commonSituations":"Modern server build omitting resultType; partial server implementation; a gateway stripping fields from results.","solutions":["Inspect the raw result to confirm resultType is missing","Fix the modern server to always include resultType in results","Verify no intermediary strips unknown fields","If the server cannot be fixed, treat it as legacy (allow_legacy) so the default applies"],"exampleFix":"// before (server)\nreturn {\"jsonrpc\": \"2.0\", \"id\": rid, \"result\": {\"output\": \"ok\"}}\n\n// after\nreturn {\"jsonrpc\": \"2.0\", \"id\": rid, \"result\": {\"output\": \"ok\", \"resultType\": \"complete\"}}","handlingStrategy":"validation","validationCode":"null","typeGuard":"def is_modern_result(result) -> bool:\n    return isinstance(result, dict) and 'resultType' in result","tryCatchPattern":"try:\n    client.call(tool_name, args)\nexcept RuntimeError as e:\n    if \"omitted resultType\" in str(e):\n        flag_server_conformance(peer.name)","preventionTips":["Contract-test modern servers to always emit resultType","Gate servers on conformance checks before adding them as peers"],"tags":["mcp","schema-validation","modern-protocol"],"backgroundTag":"schema-validation-failed","analyzedSha":"39ea8a1c6d0b61f071226eff7ede4d4105fed820","analyzedAt":"2026-08-26T03:13:46.626Z","schemaVersion":2},"datasetVersion":"2026-08-26T07:17:17.940Z"}