{"record":{"id":"d142c290c9dc88df","repo":"ComposioHQ/composio","slug":"no-server-url-generated","errorCode":null,"errorMessage":"No server URL generated","messagePattern":"No server URL generated","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"python/composio/core/models/mcp.py","lineNumber":482,"sourceCode":"            >>> print(mcp['allowed_tools'])  # Available tools\n        \"\"\"\n\n        try:\n            # Get server details first (matching TS: this.client.mcp.retrieve)\n            server_details = self._client.mcp.retrieve(mcp_config_id)\n\n            # Generate server URLs (matching TS: this.client.mcp.generate.url)\n            url_response = self._client.mcp.generate.url(\n                mcp_server_id=mcp_config_id,\n                user_ids=[user_id],\n                managed_auth_by_composio=False if manually_manage_connections else True,\n            )\n\n            # Get the generated URL (matching TS: urlResponse.user_ids_url[0])\n            if hasattr(url_response, \"user_ids_url\") and url_response.user_ids_url:\n                server_url = url_response.user_ids_url[0]\n            else:\n                raise ValidationError(\"No server URL generated\")\n\n            # Create structured server instance (matching TS MCPServerInstance)\n            server_instance: MCPServerInstance = {\n                \"id\": server_details.id,\n                \"name\": server_details.name,\n                \"type\": \"streamable_http\",\n                \"url\": server_url,\n                \"user_id\": user_id,\n                \"allowed_tools\": getattr(server_details, \"allowed_tools\", []),\n                \"auth_configs\": getattr(server_details, \"auth_config_ids\", []),\n            }\n\n            return server_instance\n\n        except Exception as e:\n            if isinstance(e, ValidationError):\n                raise\n            raise ValidationError(\"Failed to parse MCP server instance\") from e","sourceCodeStart":464,"sourceCodeEnd":500,"githubUrl":"https://github.com/ComposioHQ/composio/blob/64b1b85502b1beeb2379e6c9e8bf1104504fa637/python/composio/core/models/mcp.py#L464-L500","documentation":"Raised during MCP.generate() when the backend's URL-generation response does not contain a usable user_ids_url list. The SDK mirrors the TS behavior (urlResponse.user_ids_url[0]) and treats a missing/empty user_ids_url as a hard failure rather than returning a server instance without a URL.","triggerScenarios":"Calling composio.mcp.create(...) (which calls generate) or generate() directly, when the backend response lacks the user_ids_url attribute or it's an empty array — typically a partial provisioning failure or backend/API version mismatch.","commonSituations":"Backend-side provisioning hiccup, SDK pinned to an older generated client that expects a response field the backend no longer returns, rate/quota limits preventing URL assignment.","solutions":["Retry the create/generate call — transient provisioning failures often resolve","Upgrade composio so the generated client matches the backend response schema","Check your workspace MCP config quota/limits in the dashboard","If persistent, capture the raw response by calling client.mcp.get_url directly to inspect fields"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"for attempt in range(3):\n    try:\n        inst = composio.mcp.create(name=name, toolkits=tks)\n        break\n    except ValidationError as e:\n        if 'No server URL' not in str(e) or attempt == 2:\n            raise\n        time.sleep(2 ** attempt)","preventionTips":["Retry transient provisioning failures","Keep SDK aligned with backend version"],"tags":["mcp","python","url-generation","provisioning"],"backgroundTag":"empty-server-response","analyzedSha":"64b1b85502b1beeb2379e6c9e8bf1104504fa637","analyzedAt":"2026-08-28T15:39:33.623Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}