diff --git a/ui/litellm-dashboard/src/components/chat/MCPCredentialsTab.tsx b/ui/litellm-dashboard/src/components/chat/MCPCredentialsTab.tsx index 9714da6d4d5..363ec8c0e40 100644 --- a/ui/litellm-dashboard/src/components/chat/MCPCredentialsTab.tsx +++ b/ui/litellm-dashboard/src/components/chat/MCPCredentialsTab.tsx @@ -9,7 +9,8 @@ import React, { useCallback, useEffect, useState } from "react"; import { Spin, message } from "antd"; -import { CheckCircleOutlined, DeleteOutlined, LinkOutlined } from "@ant-design/icons"; +import { DeleteOutlined, LinkOutlined } from "@ant-design/icons"; +import { Badge, Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from "@tremor/react"; import { deleteMCPOAuthUserCredential, listMCPUserCredentials, @@ -86,98 +87,82 @@ const MCPCredentialsTab: React.FC = ({ accessToken }) => { c.alias || c.server_name || c.server_id; return ( -
+
{/* Header */} -
-

- App Credentials -

-

+

+

App Credentials

+

Your stored OAuth connections — used automatically in chat.

{loading ? ( -
+
) : credentials.length === 0 ? ( -
- +
+ No connections yet.
Go to Apps and click Connect to authorize an MCP server.
) : ( -
- {credentials.map((cred) => { - const name = displayName(cred); - const isRevoking = revoking.has(cred.server_id); - const exp = expiryLabel(cred.expires_at); - const connected = relativeTime(cred.connected_at); - const isExpired = exp === "Expired"; +
+ + + + + App + + + Connected + + + Status + + + Actions + + + + + {credentials.map((cred) => { + const name = displayName(cred); + const isRevoking = revoking.has(cred.server_id); + const exp = expiryLabel(cred.expires_at); + const connected = relativeTime(cred.connected_at); + const isExpired = exp === "Expired"; - return ( -
- {/* Status dot */} -
- -
- - {/* Info */} -
-
- {name} -
-
- {connected && ( - - Connected {connected} - - )} - - {exp} - -
-
- - {/* Revoke */} - -
- ); - })} + return ( + + + {name} + + + {connected || "—"} + + + + {exp} + + + + + + + ); + })} +
+
)}