Skip to main content
Glama
index.ts4.42 kB
/** * Cloudflare Worker Entry Point * Main handler for the DA Live Admin MCP Server */ import { createMCPServer } from './mcp/server'; export interface Env { ENVIRONMENT?: string; DA_ADMIN_BASE_URL?: string; DA_ADMIN_API_TOKEN?: string; // Optional fallback token for testing } /** * CORS headers for cross-origin requests */ const CORS_HEADERS = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type, Authorization', 'Access-Control-Max-Age': '86400', }; /** * Extract DA API token from Authorization header */ function extractToken(request: Request, env: Env): string | null { const authHeader = request.headers.get('Authorization'); if (authHeader) { // Support "Bearer TOKEN" or just "TOKEN" const parts = authHeader.split(' '); if (parts.length === 2 && parts[0] === 'Bearer') { return parts[1]; } if (parts.length === 1) { return parts[0]; } } // Fallback to environment variable for testing return env.DA_ADMIN_API_TOKEN || null; } /** * Handle CORS preflight requests */ function handleOptions(): Response { return new Response(null, { status: 204, headers: CORS_HEADERS, }); } /** * Create error response */ function errorResponse(message: string, status: number = 500): Response { return new Response( JSON.stringify({ error: message }), { status, headers: { 'Content-Type': 'application/json', ...CORS_HEADERS, }, } ); } /** * Create success response */ function successResponse(data: any, status: number = 200): Response { return new Response( JSON.stringify(data), { status, headers: { 'Content-Type': 'application/json', ...CORS_HEADERS, }, } ); } /** * Handle health check endpoint */ function handleHealthCheck(env: Env): Response { return successResponse({ status: 'healthy', service: 'mcp-da-admin', version: '1.0.0', environment: env.ENVIRONMENT || 'development', timestamp: new Date().toISOString(), }); } /** * Handle MCP JSON-RPC requests */ async function handleMCP(request: Request, env: Env): Promise<Response> { console.log('=== MCP Request Received ==='); console.log('Timestamp:', new Date().toISOString()); console.log('Method:', request.method); console.log('URL:', request.url); // Extract and validate API token const apiToken = extractToken(request, env); if (!apiToken) { console.log('❌ Authentication failed: No API token provided'); return errorResponse('Missing DA Admin API token. Please provide it in the Authorization header.', 401); } console.log('✅ Authentication: Token present (length:', apiToken.length, ')'); // Only accept POST requests with JSON body if (request.method !== 'POST') { console.log('❌ Invalid method:', request.method); return errorResponse('MCP endpoint only accepts POST requests', 405); } try { // Parse JSON-RPC request const jsonrpcRequest = await request.json(); console.log('📥 JSON-RPC Request:', JSON.stringify(jsonrpcRequest, null, 2)); // Create MCP server with the user's DA API token const server = createMCPServer(apiToken, env.DA_ADMIN_BASE_URL); // Process the request through MCP server const response = await server.handleRequest(jsonrpcRequest); console.log('📤 JSON-RPC Response:', JSON.stringify(response, null, 2)); console.log('=== MCP Request Completed ===\n'); // Return JSON-RPC response return successResponse(response); } catch (error) { console.error('❌ MCP handler error:', error); console.log('=== MCP Request Failed ===\n'); const message = error instanceof Error ? error.message : 'Internal server error'; return errorResponse(`MCP Error: ${message}`, 500); } } /** * Main Worker fetch handler */ export default { async fetch(request: Request, env: Env): Promise<Response> { const url = new URL(request.url); // Handle CORS preflight if (request.method === 'OPTIONS') { return handleOptions(); } // Route requests switch (url.pathname) { case '/': case '/health': return handleHealthCheck(env); case '/mcp': return handleMCP(request, env); default: return errorResponse('Not found', 404); } }, };

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/mhaack/da-mcp'

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