diff --git a/ui/litellm-dashboard/src/components/mcp_tools/MCPSubmissionsTab.tsx b/ui/litellm-dashboard/src/components/mcp_tools/MCPSubmissionsTab.tsx index 74ff0be629c..50d119134f0 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/MCPSubmissionsTab.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/MCPSubmissionsTab.tsx @@ -277,102 +277,151 @@ function MCPServerCard({ server, onApprove, onReject, requiredFields }: MCPServe const checks = MCP_REQUIRED_FIELD_DEFS.filter((f) => requiredFields.includes(f.key)).map((f) => ({ key: f.key, label: f.label, + description: f.description, passed: f.check(server), })); const passCount = checks.filter((c) => c.passed).length; - const allPassed = checks.length > 0 && passCount === checks.length; + const failCount = checks.length - passCount; + const allPassed = checks.length > 0 && failCount === 0; return ( -
-
-
-
- - - {statusCfg.label} - - {checks.length > 0 && ( +
+ {/* Server info */} +
+
+
+
- {passCount}/{checks.length} checks + + {statusCfg.label} +
+

+ {server.alias ?? server.server_name ?? server.server_id} +

+ {server.description && ( +

{server.description}

+ )} + {server.url && ( +
+ + {server.url} +
+ )} +
+ Transport: {server.transport ?? "sse"} + · + Submitted by: {server.submitted_by ?? "—"} + · + {formatDate(server.submitted_at)} +
+ {approvalStatus === "rejected" && server.review_notes && ( +

Rejection reason: {server.review_notes}

)}
-

- {server.alias ?? server.server_name ?? server.server_id} -

- {server.description && ( -

{server.description}

- )} - {server.url && ( -
- - {server.url} -
- )} -
- - Transport:{" "} - {server.transport ?? "sse"} - - - Submitted by:{" "} - {server.submitted_by ?? "—"} - - - Date:{" "} - {formatDate(server.submitted_at)} - -
- {approvalStatus === "rejected" && server.review_notes && ( -

- Rejection reason: {server.review_notes} -

- )} - {checks.length > 0 && ( -
- {checks.map((c) => ( - - {c.passed ? ( - - ) : ( - - )} - {c.label} - - ))} + {/* Approve/Reject when no checks panel (no rules configured) */} + {checks.length === 0 && approvalStatus === "pending_review" && ( +
+ +
)}
- {approvalStatus === "pending_review" && ( -
- - -
- )}
+ + {/* GitHub-style checks panel */} + {checks.length > 0 && ( +
+ {/* Overall status header */} +
+ {/* Large status circle */} +
+ {allPassed ? ( + + ) : ( + + )} +
+
+
+ {allPassed + ? "All checks passed" + : `${failCount} check${failCount !== 1 ? "s" : ""} failed`} +
+
+ {passCount} passing, {failCount} failing +
+
+ {/* Approve / Reject in header */} + {approvalStatus === "pending_review" && ( +
+ + +
+ )} +
+ + {/* Individual check rows */} +
+ {checks.map((c) => ( +
+ {/* Small circle icon */} +
+ {c.passed ? ( + + ) : ( + + )} +
+ + {c.label} + + + {c.passed ? "Passes" : "Missing"} + +
+ ))} +
+
+ )}
); }