diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-form-modal/mcp-server-form-modal.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-form-modal/mcp-server-form-modal.tsx index fe6d59e0967..f3afefe0820 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-form-modal/mcp-server-form-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-form-modal/mcp-server-form-modal.tsx @@ -116,7 +116,7 @@ function getTestButtonLabel( if (testResult?.success) return 'Connection success' if (testResult?.authRequired) return 'Requires OAuth' if (testResult && !testResult.success) return 'No connection: retry' - return 'Test Connection' + return 'Test connection' } interface FormattedInputProps { @@ -609,8 +609,8 @@ export function McpServerFormModal({ const isSubmitDisabled = isSubmitting || !isFormValid || isDomainBlocked || (mode === 'edit' && !hasChanges) - const title = mode === 'add' ? 'Add New MCP Server' : 'Edit MCP Server' - const submitLabel = mode === 'add' ? 'Add MCP' : 'Save' + const title = mode === 'add' ? 'Add MCP server' : 'Edit MCP server' + const submitLabel = mode === 'add' ? 'Add server' : 'Save' const handleToggleJsonMode = () => { if (testResult) clearTestResult() @@ -622,7 +622,7 @@ export function McpServerFormModal({ const secondaryAction: ChipModalFooterAction | undefined = mode === 'add' ? { - label: formMode === 'form' ? 'Edit JSON' : 'Edit Form', + label: formMode === 'form' ? 'Edit JSON' : 'Edit form', onClick: handleToggleJsonMode, } : formMode === 'form' diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/mcp.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/mcp.tsx index 97d64680a7d..32cc51cc2f9 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/mcp.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/mcp.tsx @@ -99,9 +99,10 @@ function ServerListItem({ ) // A live discovery failure whose stored status hasn't caught up yet would otherwise read as // "0 tools"; surface it directly so a failed row reads as failed, not empty. + // Shown even when cached tools exist: a present discoveryError means the LATEST + // discovery failed, and silently showing the stale tool count would hide that. const showDiscoveryError = Boolean(discoveryError) && - tools.length === 0 && server.connectionStatus !== 'error' && server.connectionStatus !== 'disconnected' const hasConnectionIssue = @@ -114,38 +115,37 @@ function ServerListItem({
- {isRefreshing - ? 'Refreshing...' - : isLoadingTools && tools.length === 0 - ? 'Loading...' - : showDiscoveryError - ? discoveryError - : toolsLabel} + {isConnecting + ? 'Waiting for authorization...' + : isRefreshing + ? 'Refreshing...' + : isLoadingTools && tools.length === 0 + ? 'Loading...' + : showDiscoveryError + ? discoveryError + : toolsLabel}
{server.name || 'Unnamed Server'}
+ Server name +{server.name || 'Unnamed server'}
+
{getErrorMessage(listError, 'Failed to load MCP servers')}
- {getErrorMessage(toolsError, 'Some tools could not be discovered')} -
- )} {filteredServers.map((server) => { if (!server?.id) return null const tools = toolsByServer[server.id] || [] @@ -749,8 +733,8 @@ export function MCP() { onOpenChange={(open) => { if (!open) setServerToDeleteId(null) }} - srTitle='Delete MCP Server' - title='Delete MCP Server' + srTitle='Delete MCP server' + title='Delete MCP server' text={[ 'Are you sure you want to delete ', { diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/refresh-action-state.test.ts b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/refresh-action-state.test.ts index 4a036e8827b..3186429218a 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/refresh-action-state.test.ts +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/refresh-action-state.test.ts @@ -31,28 +31,11 @@ describe('getRefreshActionState', () => { }) }) - it('shows OAuth authorization required when an OAuth refresh finishes disconnected', () => { - expect( - getRefreshActionState({ - mutationStatus: 'success', - connectionStatus: 'disconnected', - authType: 'oauth', - workflowsUpdated: 0, - }) - ).toEqual({ - text: 'OAuth authorization required', - textTone: 'error', - disabled: false, - }) - }) - it('keeps Failed when a disconnected OAuth refresh has a concrete error', () => { expect( getRefreshActionState({ mutationStatus: 'success', connectionStatus: 'disconnected', - authType: 'oauth', - error: 'The MCP server took too long to respond and timed out', workflowsUpdated: 0, }) ).toEqual({ diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/refresh-action-state.ts b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/refresh-action-state.ts index 8b4ae5da87d..28a6869921e 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/refresh-action-state.ts +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/refresh-action-state.ts @@ -1,12 +1,10 @@ import type { MutationStatus } from '@tanstack/react-query' -import type { McpServer, RefreshMcpServerResult } from '@/lib/api/contracts/mcp' +import type { RefreshMcpServerResult } from '@/lib/api/contracts/mcp' import type { SettingsAction } from '@/app/workspace/[workspaceId]/settings/components/settings-header/settings-header' interface RefreshActionStateInput { mutationStatus: MutationStatus connectionStatus?: RefreshMcpServerResult['status'] - authType?: McpServer['authType'] - error?: RefreshMcpServerResult['error'] workflowsUpdated?: number } @@ -15,23 +13,12 @@ type RefreshActionState = Pick