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
{filteredTools.length} tool{filteredTools.length !== 1 ? "s" : ""} available
{/* Tool Test Panel - Show when a tool is selected */}
{selectedTool && (
setSelectedTool(null)}
/>
)}
);
}