diff --git a/core/config/profile/doLoadConfig.ts b/core/config/profile/doLoadConfig.ts index 6351c44740..b3d0a7ea8a 100644 --- a/core/config/profile/doLoadConfig.ts +++ b/core/config/profile/doLoadConfig.ts @@ -160,6 +160,7 @@ export default async function doLoadConfig( const serverContextProvider = new MCPContextProvider({ submenuItems, mcpId: server.id, + serverName: server.name, }); newConfig.contextProviders.push(serverContextProvider); } diff --git a/core/context/providers/MCPContextProvider.ts b/core/context/providers/MCPContextProvider.ts index 0cb8e2c668..be9e50cd55 100644 --- a/core/context/providers/MCPContextProvider.ts +++ b/core/context/providers/MCPContextProvider.ts @@ -10,6 +10,7 @@ import { MCPManagerSingleton } from "../mcp"; interface MCPContextProviderOptions { mcpId: string; + serverName: string; submenuItems: ContextSubmenuItem[]; } @@ -20,6 +21,16 @@ class MCPContextProvider extends BaseContextProvider { description: "Model Context Protocol", type: "submenu", }; + override get description(): ContextProviderDescription { + return { + title: `${MCPContextProvider.description.title}-${this.options["mcpId"]}`, + displayTitle: this.options["serverName"] + ? `${this.options["serverName"]} resources` + : "MCP", + description: "Model Context Protocol", + type: "submenu", + }; + } static encodeMCPResourceId(mcpId: string, uri: string): string { return JSON.stringify({ mcpId, uri }); diff --git a/gui/src/context/SubmenuContextProviders.tsx b/gui/src/context/SubmenuContextProviders.tsx index c89a679727..8268377de1 100644 --- a/gui/src/context/SubmenuContextProviders.tsx +++ b/gui/src/context/SubmenuContextProviders.tsx @@ -50,6 +50,7 @@ export const SubmenuContextProvidersProvider = ({ }) => { const ideMessenger = useContext(IdeMessengerContext); const submenuContextProviders = useAppSelector(selectSubmenuContextProviders); + const lastProviders = useRef(submenuContextProviders); const disableIndexing = useAppSelector( (store) => store.config.config.disableIndexing, ); @@ -356,15 +357,22 @@ export const SubmenuContextProvidersProvider = ({ ); // Reload all submenu items on the initial config load - // TODO - could refresh on any change - const initialLoad = useRef(false); useEffect(() => { - if (!submenuContextProviders.length || initialLoad.current) { + if (!submenuContextProviders.length) { return; } - void loadSubmenuItems("all"); - initialLoad.current = true; - }, [loadSubmenuItems, submenuContextProviders, initialLoad]); + // Refresh submenu items when new titles detected + const newTitles = submenuContextProviders + .filter( + (provider) => + !lastProviders.current.find((p) => p.title === provider.title), + ) + .map((provider) => provider.title); + if (newTitles.length > 0) { + loadSubmenuItems(newTitles); + } + lastProviders.current = submenuContextProviders; + }, [loadSubmenuItems, submenuContextProviders]); return (