fix(mcp): add missing mock in test, show Approve for rejected, clear submission metadata, drop spurious Content-Type

This commit is contained in:
Ishaan Jaffer 2026-03-10 11:38:57 -07:00
parent 8963a54f1a
commit 0b742d1f68
4 changed files with 33 additions and 19 deletions

View file

@ -1026,9 +1026,12 @@ if MCP_AVAILABLE:
# TODO: audit log for create
# Admin-created servers are always active regardless of any lifecycle fields
# in the payload — prevents an admin from accidentally creating a pending server.
# Admin-created servers are always active — clear any submission lifecycle
# fields the caller may have provided to prevent fake entries appearing in
# the submissions queue.
payload.approval_status = MCPApprovalStatus.active
payload.submitted_by = None
payload.submitted_at = None
# Attempt to create the mcp server
try:

View file

@ -1739,6 +1739,9 @@ class TestMCPApprovalWorkflow:
now_rejected = generate_mock_mcp_server_db_record()
now_rejected.approval_status = MCPApprovalStatus.rejected
mock_manager = MagicMock()
mock_manager.reload_servers_from_database = AsyncMock()
with (
patch(
"litellm.proxy.management_endpoints.mcp_management_endpoints.get_prisma_client_or_throw",
@ -1752,6 +1755,10 @@ class TestMCPApprovalWorkflow:
"litellm.proxy.management_endpoints.mcp_management_endpoints.reject_mcp_server",
AsyncMock(return_value=now_rejected),
),
patch(
"litellm.proxy.management_endpoints.mcp_management_endpoints.global_mcp_server_manager",
mock_manager,
),
):
result = await reject_mcp_server_submission(
server_id=active_server.server_id,
@ -1759,3 +1766,4 @@ class TestMCPApprovalWorkflow:
user_api_key_dict=admin,
)
assert result is not None
mock_manager.reload_servers_from_database.assert_awaited_once()

View file

@ -322,7 +322,7 @@ function MCPServerCard({ server, onApprove, onReject, requiredFields }: MCPServe
)}
</div>
{/* Approve/Reject when no checks panel (no rules configured) */}
{checks.length === 0 && approvalStatus === "pending_review" && (
{checks.length === 0 && (approvalStatus === "pending_review" || approvalStatus === "rejected") && (
<div className="flex items-center gap-2 flex-shrink-0">
<button
type="button"
@ -331,13 +331,15 @@ function MCPServerCard({ server, onApprove, onReject, requiredFields }: MCPServe
>
Approve
</button>
<button
type="button"
onClick={onReject}
className="text-xs border border-red-300 text-red-600 hover:bg-red-50 px-3 py-1.5 rounded-md transition-colors font-medium"
>
Reject
</button>
{approvalStatus === "pending_review" && (
<button
type="button"
onClick={onReject}
className="text-xs border border-red-300 text-red-600 hover:bg-red-50 px-3 py-1.5 rounded-md transition-colors font-medium"
>
Reject
</button>
)}
</div>
)}
</div>
@ -375,7 +377,7 @@ function MCPServerCard({ server, onApprove, onReject, requiredFields }: MCPServe
</div>
</div>
{/* Approve / Reject in header */}
{approvalStatus === "pending_review" && (
{(approvalStatus === "pending_review" || approvalStatus === "rejected") && (
<div className="flex items-center gap-2 flex-shrink-0">
<button
type="button"
@ -384,13 +386,15 @@ function MCPServerCard({ server, onApprove, onReject, requiredFields }: MCPServe
>
Approve
</button>
<button
type="button"
onClick={onReject}
className="text-xs border border-red-300 text-red-600 hover:bg-red-50 bg-white px-3 py-1.5 rounded-md transition-colors font-medium"
>
Reject
</button>
{approvalStatus === "pending_review" && (
<button
type="button"
onClick={onReject}
className="text-xs border border-red-300 text-red-600 hover:bg-red-50 bg-white px-3 py-1.5 rounded-md transition-colors font-medium"
>
Reject
</button>
)}
</div>
)}
</div>

View file

@ -6551,7 +6551,6 @@ export const approveMCPServer = async (accessToken: string, serverId: string) =>
method: HTTP_REQUEST.PUT,
headers: {
[globalLitellmHeaderName]: `Bearer ${accessToken}`,
"Content-Type": "application/json",
},
});
if (!response.ok) {