--- title: "useRenderTool" description: "Register a React Native component to render inline when an agent calls a tool." --- ## Overview `useRenderTool` is the React Native counterpart of the web tool-rendering hooks. It registers a tool with the agent **and** a render function that produces a React Native element for that tool's call, so the agent can drive inline generative UI inside the chat. It combines [`useFrontendTool`](/reference/react-native/hooks/useFrontendTool) (registration + optional handler) with a render registry that the prebuilt [`CopilotChat`](/reference/react-native/components/CopilotChat#prebuilt-ui) reads when displaying tool calls. The web-only rendering hooks (`useRenderToolCall`, `useDefaultRenderTool`, `useRenderActivityMessage`, `useRenderCustomMessages`) are **not** exported on React Native, because they depend on DOM elements. Use `useRenderTool` instead. ## Signature ```tsx import { useRenderTool } from "@copilotkit/react-native"; function useRenderTool( options: UseRenderToolOptions, deps?: ReadonlyArray, ): void; ``` ## Parameters Tool definition and render function. Unique tool name. Must match the name the agent calls. Human-readable description shown to the agent. Schema describing the tool's parameters. Accepts any schema compatible with [Standard Schema](https://standardschema.dev/) (Zod, Valibot, ArkType, etc.). Render function returning a React Native element for the tool call. Optional handler executed when the tool is called. Omit for a render-only tool. Optional agent ID to scope the tool to a specific agent. Optional dependency array. Re-register the tool when these values change. ### `RenderToolProps` Props passed to your `render` function. Parsed tool-call arguments, typed by your `parameters` schema. Current tool-call status. Result from the handler, when available. ## Usage ```tsx import { useRenderTool } from "@copilotkit/react-native"; import { ActivityIndicator, Text, View } from "react-native"; import { z } from "zod"; function ChatScreen() { useRenderTool({ name: "showWeather", description: "Display weather for a city", parameters: z.object({ city: z.string(), temp: z.number(), condition: z.string(), }), render: ({ args, status }) => ( {args.city} {args.temp}°C · {args.condition} {status === "executing" && } ), }); return ; } ``` ## Behavior - **Render returns `ReactElement | null`**, not `ReactNode`. React Native's `FlatList` cannot render bare strings or portals, so a render function must return an element or `null`. - **Cleanup**: unmounting unregisters both the tool and its render function. ## `RenderToolProvider` and `useRenderToolRegistry` These power the render registry and are installed automatically by [`CopilotKitProvider`](/reference/react-native/components/CopilotKitProvider). You rarely use them directly. Maintains the registry of tool render functions. Already mounted by `CopilotKitProvider`; add it manually only for an isolated subtree. Returns the `Map` of registered render functions, subscribing to changes via `useSyncExternalStore`. Used internally by `CopilotChat` to look up a renderer for each tool call. Throws if called outside a `RenderToolProvider`. ## Related - [`useFrontendTool`](/reference/react-native/hooks/useFrontendTool): register a tool without inline rendering - [`useHumanInTheLoop`](/reference/react-native/hooks/useHumanInTheLoop): gate a tool call on user approval