@glec/mcp-server
Version:
GLEC API MCP Server for Claude Desktop - Carbon emission calculation for logistics and transportation
102 lines ⢠3.69 kB
JavaScript
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