UNPKG

@glec/mcp-server

Version:

GLEC API MCP Server for Claude Desktop - Carbon emission calculation for logistics and transportation

102 lines • 3.69 kB
import express from 'express'; import cors from 'cors'; import { GLECApiClient } from './services/glecApiClient.js'; import { logError, logAuditEvent, generateCorrelationId } from './utils/logger.js'; import dotenv from 'dotenv'; // Load environment variables dotenv.config(); // Validate required environment variables const requiredEnvVars = ['GLEC_API_KEY']; for (const envVar of requiredEnvVars) { if (!process.env[envVar]) { console.error(`āŒ Missing required environment variable: ${envVar}`); process.exit(1); } } // Create GLEC API client const glecConfig = { apiKey: process.env.GLEC_API_KEY, bearerToken: process.env.GLEC_BEARER_TOKEN, baseUrl: process.env.GLEC_BASE_URL || 'https://open-api.glec.io', timeout: parseInt(process.env.GLEC_TIMEOUT || '30000'), retries: parseInt(process.env.GLEC_RETRIES || '3'), }; const glecClient = new GLECApiClient(glecConfig); // Create Express app const app = express(); app.use(cors()); app.use(express.json()); // Health check endpoint app.get('/health', (req, res) => { res.json({ status: 'healthy', timestamp: new Date().toISOString(), version: '1.0.0' }); }); // MCP tools endpoint app.post('/tools/:toolName', async (req, res) => { try { const { toolName } = req.params; const args = req.body; const correlationId = generateCorrelationId(); logAuditEvent('http_tool_call', 'mcp_user', 'http_client', { tool: toolName, correlationId, timestamp: new Date().toISOString(), }); let result; switch (toolName) { case 'calculateRoadEmission': result = await glecClient.calculateRoadEmission(args); break; case 'calculateAirEmission': result = await glecClient.calculateAirEmission(args); break; case 'calculateSeaEmission': result = await glecClient.calculateSeaEmission(args); break; case 'getShippers': result = await glecClient.listShippers(args); break; case 'getEmissionCodes': result = await glecClient.getEmissionCodes(args.transportType, args.level); break; case 'generateReport': result = await glecClient.generateESGReport(args); break; case 'healthCheck': result = { healthy: await glecClient.healthCheck() }; break; default: return res.status(404).json({ error: `Unknown tool: ${toolName}` }); } res.json(result); } catch (error) { logError(new Error('http_tool_call_error'), { tool: req.params.toolName, error: error instanceof Error ? error.message : String(error), }); res.status(500).json({ error: error instanceof Error ? error.message : String(error) }); } }); // Start the server const port = process.env.PORT || 3000; app.listen(port, () => { console.log('šŸš€ GLEC MCP HTTP Server started successfully'); console.log('šŸ“Š API Base URL:', glecConfig.baseUrl); console.log('šŸ”‘ API Key:', glecConfig.apiKey.substring(0, 8) + '...'); console.log('🌐 HTTP Server running on port:', port); console.log('šŸ“ Ready to process requests'); }); // Handle graceful shutdown process.on('SIGINT', () => { console.log('\nšŸ›‘ Shutting down server...'); process.exit(0); }); process.on('SIGTERM', () => { console.log('\nšŸ›‘ Shutting down server...'); process.exit(0); }); //# sourceMappingURL=http-server.js.map