@@ -4,8 +4,8 @@ import React, { useCallback } from 'react';
44import { Badge } from '@opensumi/ide-components' ;
55import { AINativeSettingSectionsId , ILogger , useInjectable } from '@opensumi/ide-core-browser' ;
66import { PreferenceService } from '@opensumi/ide-core-browser/lib/preferences' ;
7- import { localize } from '@opensumi/ide-core-common' ;
8- import { IMessageService } from '@opensumi/ide-overlay/lib/common ' ;
7+ import { PreferenceScope , localize } from '@opensumi/ide-core-common' ;
8+ import { IMessageService } from '@opensumi/ide-overlay' ;
99
1010import { BUILTIN_MCP_SERVER_NAME , ISumiMCPServerBackend , SumiMCPServerProxyServicePath } from '../../../../common' ;
1111import { MCPServerDescription } from '../../../../common/mcp-server-manager' ;
@@ -18,13 +18,13 @@ import { MCPServerForm, MCPServerFormData } from './mcp-server-form';
1818export const MCPConfigView : React . FC = ( ) => {
1919 const mcpServerProxyService = useInjectable < MCPServerProxyService > ( MCPServerProxyService ) ;
2020 const preferenceService = useInjectable < PreferenceService > ( PreferenceService ) ;
21+ const messageService = useInjectable < IMessageService > ( IMessageService ) ;
2122 const sumiMCPServerBackendProxy = useInjectable < ISumiMCPServerBackend > ( SumiMCPServerProxyServicePath ) ;
2223 const logger = useInjectable < ILogger > ( ILogger ) ;
23- const messageService = useInjectable < IMessageService > ( IMessageService ) ;
2424 const [ servers , setServers ] = React . useState < MCPServer [ ] > ( [ ] ) ;
2525 const [ formVisible , setFormVisible ] = React . useState ( false ) ;
2626 const [ editingServer , setEditingServer ] = React . useState < MCPServerFormData | undefined > ( ) ;
27-
27+ const [ loadingServer , setLoadingServer ] = React . useState < string | undefined > ( ) ;
2828 const loadServers = useCallback ( async ( ) => {
2929 const allServers = await mcpServerProxyService . $getServers ( ) ;
3030 setServers ( allServers ) ;
@@ -44,6 +44,7 @@ export const MCPConfigView: React.FC = () => {
4444 const handleServerControl = useCallback (
4545 async ( serverName : string , start : boolean ) => {
4646 try {
47+ setLoadingServer ( serverName ) ;
4748 if ( start ) {
4849 await mcpServerProxyService . $startServer ( serverName ) ;
4950 } else {
@@ -87,12 +88,14 @@ export const MCPConfigView: React.FC = () => {
8788 } ) ;
8889 }
8990
90- await preferenceService . set ( AINativeSettingSectionsId . MCPServers , updatedServers ) ;
91+ await preferenceService . set ( AINativeSettingSectionsId . MCPServers , updatedServers , PreferenceScope . User ) ;
9192 await loadServers ( ) ;
93+ setLoadingServer ( undefined ) ;
9294 } catch ( error ) {
9395 const msg = error . message || error ;
9496 logger . error ( `Failed to ${ start ? 'start' : 'stop' } server ${ serverName } :` , error ) ;
95- messageService . error ( `Failed to ${ start ? 'start' : 'stop' } server ${ serverName } :` + msg ) ;
97+ messageService . error ( error . message ) ;
98+ setLoadingServer ( undefined ) ;
9699 }
97100 } ,
98101 [ mcpServerProxyService , preferenceService , sumiMCPServerBackendProxy , loadServers ] ,
@@ -121,7 +124,7 @@ export const MCPConfigView: React.FC = () => {
121124 const servers = preferenceService . get < MCPServerFormData [ ] > ( AINativeSettingSectionsId . MCPServers , [ ] ) ;
122125 const updatedServers = servers . filter ( ( s ) => s . name !== serverName ) ;
123126 sumiMCPServerBackendProxy . removeServer ( serverName ) ;
124- await preferenceService . set ( AINativeSettingSectionsId . MCPServers , updatedServers ) ;
127+ await preferenceService . set ( AINativeSettingSectionsId . MCPServers , updatedServers , PreferenceScope . User ) ;
125128 await loadServers ( ) ;
126129 } ,
127130 [ editingServer , formVisible ] ,
@@ -140,7 +143,7 @@ export const MCPConfigView: React.FC = () => {
140143 setServers ( servers as MCPServer [ ] ) ;
141144 setFormVisible ( false ) ;
142145 await sumiMCPServerBackendProxy . addOrUpdateServer ( data as MCPServerDescription ) ;
143- await preferenceService . set ( AINativeSettingSectionsId . MCPServers , servers ) ;
146+ await preferenceService . set ( AINativeSettingSectionsId . MCPServers , servers , PreferenceScope . User ) ;
144147 await loadServers ( ) ;
145148 } ,
146149 [ servers , formVisible , loadServers ] ,
@@ -164,10 +167,10 @@ export const MCPConfigView: React.FC = () => {
164167 < div className = { styles . header } >
165168 < div >
166169 < h2 className = { styles . title } > MCP Servers</ h2 >
167- < p className = { styles . description } > Manage your MCP server connections. </ p >
170+ < p className = { styles . description } > { localize ( 'ai.native.mcp.manage.connections' ) } </ p >
168171 </ div >
169172 < button className = { styles . addButton } onClick = { handleAddServer } >
170- + Add new MCP server
173+ + { localize ( 'ai.native.mcp.addMCPServer.title' ) }
171174 </ button >
172175 </ div >
173176 < div className = { styles . serversList } >
@@ -188,7 +191,15 @@ export const MCPConfigView: React.FC = () => {
188191 title = { server . isStarted ? 'Stop' : 'Start' }
189192 onClick = { ( ) => handleServerControl ( server . name , ! server . isStarted ) }
190193 >
191- < i className = { `codicon ${ server . isStarted ? 'codicon-debug-stop' : 'codicon-debug-start' } ` } />
194+ < i
195+ className = { `codicon ${
196+ loadingServer === server . name
197+ ? 'codicon-loading kt-icon-loading'
198+ : server . isStarted
199+ ? 'codicon-debug-stop'
200+ : 'codicon-debug-start'
201+ } `}
202+ />
192203 </ button >
193204 { server . name !== BUILTIN_MCP_SERVER_NAME && (
194205 < button className = { styles . iconButton } title = 'Delete' onClick = { ( ) => handleDeleteServer ( server . name ) } >
@@ -201,7 +212,7 @@ export const MCPConfigView: React.FC = () => {
201212 < div className = { styles . detailRow } >
202213 < span className = { styles . detailLabel } > Status:</ span >
203214 < span className = { `${ styles . serverStatus } ${ server . isStarted ? styles . running : styles . stopped } ` } >
204- { server . isStarted ? 'Running' : 'Stopped' }
215+ { server . isStarted ? localize ( 'ai.native.mcp.running' ) : localize ( 'ai.native.mcp.stopped' ) }
205216 </ span >
206217 </ div >
207218 { server . type && (
0 commit comments