import React, { useState } from 'react'; import { useQuery, useMutation } from '@tanstack/react-query'; import { DataTable } from '../view_logs/table'; import { columns, ToolTestPanel } from './columns'; import { MCPTool, MCPToolsViewerProps, CallMCPToolResponse } from './types'; import { listMCPTools, callMCPTool } from '../networking'; // Wrapper to handle the type mismatch between MCPTool and DataTable's expected type function DataTableWrapper({ columns, data, isLoading, }: { columns: any; data: MCPTool[]; isLoading: boolean; }) { // Create a dummy renderSubComponent and getRowCanExpand function const renderSubComponent = () =>
; const getRowCanExpand = () => false; return ( ); } export default function MCPToolsViewer({ accessToken, userRole, userID, }: MCPToolsViewerProps) { const [searchTerm, setSearchTerm] = useState(''); const [selectedTool, setSelectedTool] = useState(null); const [toolResult, setToolResult] = useState(null); const [toolError, setToolError] = useState(null); // Query to fetch MCP tools const { data: mcpTools, isLoading: isLoadingTools } = useQuery({ queryKey: ['mcpTools'], queryFn: () => { if (!accessToken) throw new Error('Access Token required'); return listMCPTools(accessToken); }, enabled: !!accessToken, }); // Mutation for calling a tool const { mutate: executeTool, isPending: isCallingTool } = useMutation({ mutationFn: (args: { tool: MCPTool; arguments: Record }) => { if (!accessToken) throw new Error('Access Token required'); return callMCPTool( accessToken, args.tool.name, args.arguments ); }, onSuccess: (data) => { setToolResult(data); setToolError(null); }, onError: (error: Error) => { setToolError(error); setToolResult(null); }, }); // Add onToolSelect handler to each tool const toolsData = React.useMemo(() => { if (!mcpTools) return []; return mcpTools.map((tool: MCPTool) => ({ ...tool, onToolSelect: (tool: MCPTool) => { setSelectedTool(tool); setToolResult(null); setToolError(null); } })); }, [mcpTools]); // Filter tools based on search term const filteredTools = React.useMemo(() => { return toolsData.filter((tool: MCPTool) => { const searchLower = searchTerm.toLowerCase(); return ( tool.name.toLowerCase().includes(searchLower) || tool.description.toLowerCase().includes(searchLower) || tool.mcp_info.server_name.toLowerCase().includes(searchLower) ); }); }, [toolsData, searchTerm]); // Handle tool call submission const handleToolSubmit = (args: Record) => { if (!selectedTool) return; executeTool({ tool: selectedTool, arguments: args, }); }; if (!accessToken || !userRole || !userID) { return
Missing required authentication parameters.
; } return (

MCP Tools

setSearchTerm(e.target.value)} />
{filteredTools.length} tool{filteredTools.length !== 1 ? "s" : ""} available
{/* Tool Test Panel - Show when a tool is selected */} {selectedTool && (
setSelectedTool(null)} />
)}
); }