@@ -22,11 +22,12 @@ import {
2222 MessageOutlined ,
2323 PlayCircleOutlined ,
2424 InfoCircleOutlined ,
25- ExclamationCircleOutlined
25+ ExclamationCircleOutlined ,
26+ ReloadOutlined
2627} from '@ant-design/icons' ;
2728import { useSelector , useDispatch } from 'react-redux' ;
2829import { RootState } from '../store' ;
29- import { callTool , readResource , getPrompt } from '../store/mcpSlice' ;
30+ import { callTool , readResource , getPrompt , setTools , setPrompts , setResources , setResourceTemplates } from '../store/mcpSlice' ;
3031import { MCPTool , MCPResource , MCPPrompt , SecurityRiskLevel } from '../types/mcp' ;
3132import { useI18n } from '../hooks/useI18n' ;
3233
@@ -60,6 +61,7 @@ const MCPExplorer: React.FC = () => {
6061 const [ toolErrors , setToolErrors ] = useState < Record < string , string > > ( { } ) ;
6162 const [ resourceErrors , setResourceErrors ] = useState < Record < string , string > > ( { } ) ;
6263 const [ promptErrors , setPromptErrors ] = useState < Record < string , string > > ( { } ) ;
64+ const [ refreshing , setRefreshing ] = useState ( false ) ;
6365
6466 // 监听连接状态变化,切换服务器时清空本地状态
6567 useEffect ( ( ) => {
@@ -99,7 +101,7 @@ const MCPExplorer: React.FC = () => {
99101 const result = await dispatch ( callTool ( { tool : selectedTool , parameters : toolParams } ) as any ) . unwrap ( ) ;
100102 setToolResults ( prev => ( { ...prev , [ selectedTool . name ] : result . result } ) ) ;
101103 setToolErrors ( prev => ( { ...prev , [ selectedTool . name ] : '' } ) ) ;
102- message . success ( t . success . connected ) ;
104+ message . success ( t . success . toolCallSuccess ) ;
103105 } catch ( error ) {
104106 setToolErrors ( prev => ( { ...prev , [ selectedTool . name ] : String ( error ) } ) ) ;
105107 setToolResults ( prev => ( { ...prev , [ selectedTool . name ] : null } ) ) ;
@@ -166,7 +168,7 @@ const MCPExplorer: React.FC = () => {
166168 const resourceKey = selectedResource . name || selectedResource . uri || ( selectedResource as any ) . uriTemplate ;
167169 setResourceResults ( prev => ( { ...prev , [ resourceKey ] : result . result } ) ) ;
168170 setResourceErrors ( prev => ( { ...prev , [ resourceKey ] : '' } ) ) ;
169- message . success ( t . success . connected ) ;
171+ message . success ( t . success . resourceReadSuccess ) ;
170172 } catch ( error ) {
171173 console . error ( '资源读取错误:' , error ) ;
172174 // 改进资源键的生成逻辑
@@ -185,14 +187,53 @@ const MCPExplorer: React.FC = () => {
185187 const result = await dispatch ( getPrompt ( { prompt : selectedPrompt , parameters : promptParams } ) as any ) . unwrap ( ) ;
186188 setPromptResults ( prev => ( { ...prev , [ selectedPrompt . name ] : result . result } ) ) ;
187189 setPromptErrors ( prev => ( { ...prev , [ selectedPrompt . name ] : '' } ) ) ;
188- message . success ( t . success . connected ) ;
190+ message . success ( t . success . promptGetSuccess ) ;
189191 } catch ( error ) {
190192 setPromptErrors ( prev => ( { ...prev , [ selectedPrompt . name ] : String ( error ) } ) ) ;
191193 setPromptResults ( prev => ( { ...prev , [ selectedPrompt . name ] : null } ) ) ;
192194 message . error ( `${ t . errors . promptGetFailed } : ${ error } ` ) ;
193195 }
194196 } ;
195197
198+ // 刷新组件列表
199+ const handleRefresh = async ( ) => {
200+ if ( refreshing ) return ;
201+
202+ setRefreshing ( true ) ;
203+ try {
204+ // 手动重新获取组件列表
205+ const { mcpClient } = await import ( '../services/mcpClient' ) ;
206+
207+ // 重新获取所有组件
208+ const [ tools , prompts , resources , resourceTemplates ] = await Promise . allSettled ( [
209+ mcpClient . listTools ( ) ,
210+ mcpClient . listPrompts ( ) ,
211+ mcpClient . listResources ( ) ,
212+ mcpClient . listResourceTemplates ( )
213+ ] ) ;
214+
215+ // 更新Redux store
216+ if ( tools . status === 'fulfilled' ) {
217+ dispatch ( setTools ( tools . value ) ) ;
218+ }
219+ if ( prompts . status === 'fulfilled' ) {
220+ dispatch ( setPrompts ( prompts . value ) ) ;
221+ }
222+ if ( resources . status === 'fulfilled' ) {
223+ dispatch ( setResources ( resources . value ) ) ;
224+ }
225+ if ( resourceTemplates . status === 'fulfilled' ) {
226+ dispatch ( setResourceTemplates ( resourceTemplates . value ) ) ;
227+ }
228+
229+ message . success ( t . explorer . refreshSuccess ) ;
230+ } catch ( error ) {
231+ message . error ( t . explorer . refreshFailed + ': ' + error ) ;
232+ } finally {
233+ setRefreshing ( false ) ;
234+ }
235+ } ;
236+
196237 // 从URI模板中提取参数
197238 const extractParamsFromUri = ( uri : string ) : Record < string , { type : string ; description ?: string } > => {
198239 const params : Record < string , { type : string ; description ?: string } > = { } ;
0 commit comments