@@ -485,13 +485,15 @@ export default function PlaygroundPage() {
485485
486486 await client . connect ( transport ) ;
487487 setMcpState ( ( prev ) => ( { ...prev , client } ) ) ;
488- setConnectionState ( ( prev ) => ( { ...prev , isConnected : true } ) ) ;
489- toast . success ( "Connected to MCP endpoint" ) ;
490488
491489 setUiState ( ( prev ) => ( { ...prev , isLoadingCapabilities : true } ) ) ;
492490 const listToolsRequest : McpClientRequest = { method : "tools/list" , params : { } } ;
493491 const toolsResponse = await client . request ( listToolsRequest , McpListToolsResultSchema ) ;
494492 setMcpState ( ( prev ) => ( { ...prev , tools : toolsResponse . tools } ) ) ;
493+
494+ // Only mark as connected and show success after tools are loaded successfully
495+ setConnectionState ( ( prev ) => ( { ...prev , isConnected : true } ) ) ;
496+ toast . success ( "Connected to MCP endpoint" ) ;
495497 } else if ( backendType === "a2a" ) {
496498 // Connect to A2A endpoint
497499 setConnectionState ( ( prev ) => ( { ...prev , connectionType : "a2a" } ) ) ;
@@ -740,18 +742,44 @@ export default function PlaygroundPage() {
740742 arguments : mcpState . paramValues ,
741743 } ,
742744 } ;
745+
743746 const result = await mcpState . client . request ( request , McpToolResponseSchema ) ;
747+
744748 setMcpState ( ( prev ) => ( { ...prev , response : result } ) ) ;
745749 toast . success ( `Tool ${ mcpState . selectedTool ?. name } executed.` ) ;
746750 } catch ( error : any ) {
747- const message = error instanceof McpError ? error . message : "Failed to run tool" ;
751+ const message =
752+ error instanceof McpError ? error . message : error ?. message || "Failed to run tool" ;
748753 setMcpState ( ( prev ) => ( { ...prev , response : { error : message , details : error } } ) ) ;
749754 toast . error ( message ) ;
750755 } finally {
751756 setUiState ( ( prev ) => ( { ...prev , isRequestRunning : false } ) ) ;
752757 }
753758 } ;
754759
760+ const refreshMcpTools = async ( ) => {
761+ if ( ! mcpState . client ) return ;
762+
763+ setUiState ( ( prev ) => ( { ...prev , isLoadingCapabilities : true } ) ) ;
764+ try {
765+ // Call tools/list through the existing gateway connection
766+ // The gateway will re-fetch from all configured MCP targets
767+ const listToolsRequest : McpClientRequest = { method : "tools/list" , params : { } } ;
768+ const toolsResponse = await mcpState . client . request (
769+ listToolsRequest ,
770+ McpListToolsResultSchema
771+ ) ;
772+ setMcpState ( ( prev ) => ( { ...prev , tools : toolsResponse . tools } ) ) ;
773+ toast . success ( `Refreshed tools list (${ toolsResponse . tools . length } tools)` ) ;
774+ } catch ( error : any ) {
775+ const message =
776+ error instanceof McpError ? error . message : error ?. message || "Failed to refresh tools" ;
777+ toast . error ( message ) ;
778+ } finally {
779+ setUiState ( ( prev ) => ( { ...prev , isLoadingCapabilities : false } ) ) ;
780+ }
781+ } ;
782+
755783 const handleA2aSkillSelect = ( skill : AgentSkill ) => {
756784 setA2aState ( ( prev ) => ( { ...prev , selectedSkill : skill , response : null , message : "" } ) ) ;
757785 setMcpState ( ( prev ) => ( { ...prev , response : null } ) ) ;
@@ -1436,6 +1464,7 @@ export default function PlaygroundPage() {
14361464 selectedA2aSkillId = { a2aState . selectedSkill ?. id ?? null }
14371465 onMcpToolSelect = { handleMcpToolSelect }
14381466 onA2aSkillSelect = { handleA2aSkillSelect }
1467+ onRefreshMcpTools = { refreshMcpTools }
14391468 />
14401469
14411470 < ActionPanel
0 commit comments