Skip to content

Commit b3a3dda

Browse files
authored
fix(ui): disable MCP URL edits and table rename for roles the server refuses (#9599)
1 parent 7b72680 commit b3a3dda

3 files changed

Lines changed: 18 additions & 1 deletion

File tree

‎apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-form-modal/mcp-server-form-modal.tsx‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ export interface McpServerFormModalProps {
6565
allowedMcpDomains: string[] | null
6666
domainPolicyUnavailable?: boolean
6767
domainPolicyError?: string
68+
/** False locks the URL field: the server refuses a destination change from a non-admin. */
69+
canChangeDestination?: boolean
6870
}
6971

7072
const ENV_VAR_PATTERN = /\{\{[^{}]+\}\}/
@@ -130,6 +132,7 @@ interface FormattedInputProps {
130132
envVarProps: EnvVarDropdownConfig
131133
availableEnvVars?: Set<string>
132134
className?: string
135+
disabled?: boolean
133136
onChange: (e: React.ChangeEvent<HTMLInputElement>) => void
134137
onScroll: (scrollLeft: number) => void
135138
}
@@ -143,6 +146,7 @@ function FormattedInput({
143146
envVarProps,
144147
availableEnvVars,
145148
className,
149+
disabled,
146150
onChange,
147151
onScroll,
148152
}: FormattedInputProps) {
@@ -159,12 +163,18 @@ function FormattedInput({
159163
ref={ref}
160164
placeholder={placeholder}
161165
value={value}
166+
disabled={disabled}
162167
onChange={onChange}
163168
onScroll={handleScroll}
164169
onInput={handleScroll}
165170
inputClassName='font-sans text-transparent caret-[var(--text-primary)]'
166171
/>
167-
<div className='pointer-events-none absolute inset-0 flex items-center overflow-hidden px-2 py-1.5 font-sans text-sm'>
172+
<div
173+
className={cn(
174+
'pointer-events-none absolute inset-0 flex items-center overflow-hidden px-2 py-1.5 font-sans text-sm',
175+
disabled && 'opacity-50'
176+
)}
177+
>
168178
<div className='whitespace-nowrap' style={{ transform: `translateX(-${scrollLeft}px)` }}>
169179
{formatDisplayText(value, { availableEnvVars })}
170180
</div>
@@ -316,6 +326,7 @@ export function McpServerFormModal({
316326
allowedMcpDomains,
317327
domainPolicyUnavailable = false,
318328
domainPolicyError,
329+
canChangeDestination = true,
319330
}: McpServerFormModalProps) {
320331
const urlInputRef = useRef<HTMLInputElement>(null)
321332

@@ -715,6 +726,9 @@ export function McpServerFormModal({
715726
type='custom'
716727
title='Server URL'
717728
error={isDomainBlocked ? 'Domain not permitted by server policy' : undefined}
729+
hint={
730+
canChangeDestination ? undefined : 'Only workspace admins can change the server URL'
731+
}
718732
>
719733
<FormattedInput
720734
ref={urlInputRef}
@@ -730,6 +744,7 @@ export function McpServerFormModal({
730744
onClose: resetEnvVarState,
731745
}}
732746
availableEnvVars={availableEnvVars}
747+
disabled={!canChangeDestination}
733748
onChange={(e) => handleInputChange('url', e.target.value)}
734749
onScroll={setUrlScrollLeft}
735750
/>

‎apps/sim/app/workspace/[workspaceId]/settings/components/mcp/mcp.tsx‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,7 @@ export function MCP() {
664664
allowedMcpDomains={allowedMcpDomains}
665665
domainPolicyUnavailable={domainPolicyUnavailable}
666666
domainPolicyError={domainPolicyError}
667+
canChangeDestination={workspacePermissions.canAdmin}
667668
/>
668669
)}
669670
{deleteConfirmModal}

‎apps/sim/app/workspace/[workspaceId]/tables/[tableId]/table.tsx‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,6 +1322,7 @@ export function Table({
13221322
label: 'Rename',
13231323
icon: Pencil,
13241324
onClick: handleStartTableRename,
1325+
disabled: userPermissions.canEdit !== true,
13251326
},
13261327
...(userPermissions.canAdmin
13271328
? [

0 commit comments

Comments
 (0)