Supabase MCP Server

by Cappahccino
Verified
import { Request, Response } from 'express'; import { mcpService } from '../services/mcp.js'; import { MCPToolCallRequest } from '../types/mcp.js'; import { mcpConfig } from '../config.js'; /** * Handle MCP tool call requests for database operations */ export const handleDatabaseOperation = async (req: Request, res: Response) => { try { // Validate API key const apiKey = req.headers['x-api-key'] as string; if (apiKey !== mcpConfig.apiKey) { return res.status(401).json({ error: 'Unauthorized: Invalid API key' }); } const toolCall: MCPToolCallRequest = { name: req.params.operation, parameters: req.body }; // Only allow database operations const allowedOperations = ['queryDatabase', 'insertData', 'updateData', 'deleteData', 'listTables']; if (!allowedOperations.includes(toolCall.name)) { return res.status(400).json({ error: `Invalid database operation: ${toolCall.name}. Allowed operations are: ${allowedOperations.join(', ')}` }); } const result = await mcpService.handleToolCall(toolCall); if (result.error) { return res.status(400).json({ error: result.error }); } return res.status(200).json({ data: result.content }); } catch (error: any) { console.error('Database operation error:', error); return res.status(500).json({ error: `Server error: ${error.message}` }); } }; /** * Handle listing of database tables */ export const handleListTables = async (req: Request, res: Response) => { try { // Validate API key const apiKey = req.headers['x-api-key'] as string; if (apiKey !== mcpConfig.apiKey) { return res.status(401).json({ error: 'Unauthorized: Invalid API key' }); } const toolCall: MCPToolCallRequest = { name: 'listTables', parameters: {} }; const result = await mcpService.handleToolCall(toolCall); if (result.error) { return res.status(400).json({ error: result.error }); } return res.status(200).json({ tables: result.content }); } catch (error: any) { console.error('List tables error:', error); return res.status(500).json({ error: `Server error: ${error.message}` }); } };