Skip to main content
Glama
index.tsx3.76 kB
import { useQuery } from '@tanstack/react-query'; import { t } from 'i18next'; import { Search } from 'lucide-react'; import { useMemo, useState } from 'react'; import { toast } from 'sonner'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogClose, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { ScrollArea } from '@/components/ui/scroll-area'; import { flowsApi } from '@/features/flows/lib/flows-api'; import { authenticationSession } from '@/lib/authentication-session'; import { AgentTool, FlowTriggerType, AgentToolType, AgentFlowTool, } from '@activepieces/shared'; import { useAgentToolsStore } from '../store'; import { CreateMcpFlowButton } from './create-mcp-flow-button'; import { FlowDialogContent } from './flow-dialog-content'; type AgentFlowToolDialogProps = { selectedFlows: AgentFlowTool[]; onToolsUpdate: (tools: AgentTool[]) => void; tools: AgentTool[]; }; export function AgentFlowToolDialog({ selectedFlows: initialSelectedFlows, onToolsUpdate, tools, }: AgentFlowToolDialogProps) { const [searchQuery, setSearchQuery] = useState(''); const [selectedFlows, setSelectedFlows] = useState<AgentFlowTool[]>(initialSelectedFlows); const { showAddFlowDialog, setShowAddFlowDialog } = useAgentToolsStore(); const projectId = authenticationSession.getProjectId(); const { data } = useQuery({ queryKey: ['flows', projectId], queryFn: async () => { return await flowsApi.list({ cursor: undefined, limit: 1000, projectId: projectId!, }); }, }); const flows = useMemo(() => { return data?.data.filter( (flow) => flow.version.trigger.type === FlowTriggerType.PIECE && flow.version.trigger.settings.pieceName === '@activepieces/piece-mcp', ); }, [data]); const handleSave = () => { const noneFlowTools: AgentTool[] = tools.filter( (tool) => tool.type !== AgentToolType.FLOW, ); const updatedTools = [...noneFlowTools, ...selectedFlows]; setShowAddFlowDialog(false); onToolsUpdate(updatedTools); toast('Changes to flow tools saved'); }; return ( <Dialog open={showAddFlowDialog} onOpenChange={setShowAddFlowDialog}> <DialogContent className="w-[90vw] max-w-[750px] h-[80vh] max-h-[800px] flex flex-col overflow-hidden p-0"> <DialogHeader className="min-h-16 flex px-4 items-start justify-center mb-0 border-b"> <DialogTitle>{t('Add Flow Tools')}</DialogTitle> </DialogHeader> <div className="px-4 py-3 border-b"> <div className="relative border rounded-sm"> <Search className="absolute left-2 top-2.5 size-4 text-muted-foreground" /> <Input placeholder={t('Search')} value={searchQuery} onChange={(e) => setSearchQuery(e.target.value)} className="pl-9 shadow-none border-none" /> </div> </div> <ScrollArea className="grow overflow-y-auto"> <FlowDialogContent flows={flows || []} searchQuery={searchQuery} selectedFlows={selectedFlows} setSelectedFlows={setSelectedFlows} /> </ScrollArea> <DialogFooter className="border-t p-4 mt-auto"> <CreateMcpFlowButton /> <DialogClose asChild> <Button type="button" variant="ghost"> {t('Close')} </Button> </DialogClose> <Button type="button" onClick={handleSave}> {t('Save')} </Button> </DialogFooter> </DialogContent> </Dialog> ); }

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/activepieces/activepieces'

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