Skip to main content
Glama
ToolSelector.tsx3.45 kB
import { Button } from "@/components/ui/button"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@/components/ui/command"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Plus } from "lucide-react"; import { useState } from "react"; export const ToolSelector = ({ toolsList, onSelectionChange, }: { toolsList: Array<{ name: string; serviceName: string }>; onSelectionChange: (value: string) => void; }) => { const groupedTools = toolsList.reduce( (acc, tool) => { const groupKey = tool.serviceName; if (!acc[groupKey]) { acc[groupKey] = []; } acc[groupKey].push(tool); return acc; }, {} as Record<string, Array<{ name: string; serviceName: string }>>, ); const [search, setSearch] = useState(""); return ( <Popover> <PopoverTrigger asChild> <Button variant="secondary" className="px-2"> <Plus className="w-full justify-start font-normal" /> Add Custom Tool </Button> </PopoverTrigger> <PopoverContent className="p-0 w-[calc(var(--radix-popover-trigger-width)*2)]" align="end" > <Command> <CommandInput placeholder="Search tools..." onValueChange={(value) => { setSearch(value); }} onKeyDown={(e) => { if (e.key === "Enter" && search.trim()) { onSelectionChange(search); setSearch(""); } }} value={search} /> <CommandList> <CommandEmpty className="overflow-hidden p-2 m-0.5 text-sm text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground"> No results found. </CommandEmpty> {Object.entries(groupedTools).map(([group, tools]) => ( <CommandGroup key={group} heading={group} className="overflow-hidden p-2 m-0.5 text-sm text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground" > {tools.map((tool) => ( <CommandItem key={tool.name} onSelect={() => onSelectionChange(tool.name)} className="cursor-pointer overflow-ellipsis whitespace-nowrap overflow-hidden block" > {tool.name} </CommandItem> ))} </CommandGroup> ))} {/* <CommandGroup> {options.map(({ label, value, disabled }, index) => ( <CommandItem className="cursor-pointer overflow-ellipsis whitespace-nowrap overflow-hidden block" key={`tool_option_${value}_${index}`} onSelect={() => onSelectionChange(value)} disabled={disabled} > {label} </CommandItem> ))} </CommandGroup> */} </CommandList> </Command> </PopoverContent> </Popover> ); };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TheLunarCompany/lunar'

If you have feedback or need assistance with the MCP directory API, please join our Discord server