From d4220ec5f2a1fb23705ada26477f24b278d7a1f9 Mon Sep 17 00:00:00 2001 From: Jem <591643+jem-computer@users.noreply.github.com> Date: Fri, 20 Jun 2025 01:15:59 -0700 Subject: [PATCH] fix: make resources and prompts optional features MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Wrap resources/list and prompts/list calls in try-catch blocks - Continue with connection even if server doesn't support these methods - Update logging to only show counts for features that are supported - Fix TypeScript types for optional responses This allows the hook to work with servers that only implement the core tools functionality without resources or prompts support. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/react/useMcp.ts | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/react/useMcp.ts b/src/react/useMcp.ts index fa5a18a..f95b4f2 100644 --- a/src/react/useMcp.ts +++ b/src/react/useMcp.ts @@ -307,11 +307,21 @@ export function useMcp(options: UseMcpOptions): UseMcpResult { const toolsResponse = await clientRef.current!.request({ method: 'tools/list' }, ListToolsResultSchema) - // Load resources after tools - const resourcesResponse = await clientRef.current!.request({ method: 'resources/list' }, ListResourcesResultSchema) + // Load resources after tools (optional - not all servers support resources) + let resourcesResponse: { resources: Resource[]; resourceTemplates?: ResourceTemplate[] } = { resources: [], resourceTemplates: [] } + try { + resourcesResponse = await clientRef.current!.request({ method: 'resources/list' }, ListResourcesResultSchema) + } catch (err) { + addLog('debug', 'Server does not support resources/list method', err) + } - // Load prompts after resources - const promptsResponse = await clientRef.current!.request({ method: 'prompts/list' }, ListPromptsResultSchema) + // Load prompts after resources (optional - not all servers support prompts) + let promptsResponse: { prompts: Prompt[] } = { prompts: [] } + try { + promptsResponse = await clientRef.current!.request({ method: 'prompts/list' }, ListPromptsResultSchema) + } catch (err) { + addLog('debug', 'Server does not support prompts/list method', err) + } if (isMountedRef.current) { // Check mount before final state updates @@ -319,10 +329,21 @@ export function useMcp(options: UseMcpOptions): UseMcpResult { setResources(resourcesResponse.resources) setResourceTemplates(Array.isArray(resourcesResponse.resourceTemplates) ? resourcesResponse.resourceTemplates : []) setPrompts(promptsResponse.prompts) - addLog( - 'info', - `Loaded ${toolsResponse.tools.length} tools, ${resourcesResponse.resources.length} resources, ${Array.isArray(resourcesResponse.resourceTemplates) ? resourcesResponse.resourceTemplates.length : 0} resource templates, ${promptsResponse.prompts.length} prompts.`, - ) + const summary = [`Loaded ${toolsResponse.tools.length} tools`] + if ( + resourcesResponse.resources.length > 0 || + (resourcesResponse.resourceTemplates && resourcesResponse.resourceTemplates.length > 0) + ) { + summary.push(`${resourcesResponse.resources.length} resources`) + if (Array.isArray(resourcesResponse.resourceTemplates) && resourcesResponse.resourceTemplates.length > 0) { + summary.push(`${resourcesResponse.resourceTemplates.length} resource templates`) + } + } + if (promptsResponse.prompts.length > 0) { + summary.push(`${promptsResponse.prompts.length} prompts`) + } + + addLog('info', summary.join(', ') + '.') setState('ready') // Final success state // connectingRef will be set to false after orchestration logic connectAttemptRef.current = 0 // Reset on success