import { onCleanup } from 'solid-js' import { registerWebMCPTools } from '@tanstack/ai-client' import type { AnyClientTool, InferredClientContext, RegisterWebMCPToolsOptions, } from '@tanstack/ai-client' /** Options for {@link useWebMCPTools}. */ export type UseWebMCPToolsOptions< TTools extends ReadonlyArray, TContext = InferredClientContext, > = Omit, 'signal'> & { /** Receives an asynchronous registration error. */ onError?: (error: unknown) => void } type UseWebMCPToolsArguments< TTools extends ReadonlyArray, TContext, > = {} extends UseWebMCPToolsOptions ? [options?: UseWebMCPToolsOptions] : [options: UseWebMCPToolsOptions] /** * Registers executable client tools with WebMCP for the current Solid owner. * * The owner cleanup removes every tool registered by this call. * * @param tools - The executable client tools to expose through WebMCP. * @param options - Runtime context, per-tool options, and error handling. * * @example * ```ts * useWebMCPTools([searchProducts]) * ``` */ export function useWebMCPTools< const TTools extends ReadonlyArray, TContext = InferredClientContext, >(tools: TTools, ...[options]: UseWebMCPToolsArguments) { const controller = new AbortController() void registerWebMCPTools(tools, { ...options, signal: controller.signal, }).catch((error) => { if (!controller.signal.aborted) { options?.onError?.(error) } }) onCleanup(() => controller.abort()) }