import express from 'express';
import cors from 'cors';
import path from 'path';
import { fileURLToPath } from 'url';
import fs from 'fs-extra';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const app = express();
const PORT = process.env.PORT || 8080;
// Middleware
app.use(cors());
app.use(express.json());
app.use(express.static(path.join(__dirname, 'diagrams')));
// API Routes
app.get('/api/diagrams', async (req, res) => {
try {
const diagramsDir = path.join(__dirname, 'diagrams');
const files = await fs.readdir(diagramsDir);
const diagrams = files.filter(file => file.endsWith('.svg') || file.endsWith('.png'));
res.json({
success: true,
diagrams: diagrams.map(file => ({
name: file,
url: `/api/diagrams/${file}`,
downloadUrl: `/api/diagrams/${file}/download`
}))
});
} catch (error) {
res.status(500).json({
success: false,
error: error.message
});
}
});
app.get('/api/diagrams/:filename', async (req, res) => {
try {
const { filename } = req.params;
const filePath = path.join(__dirname, 'diagrams', filename);
if (!await fs.pathExists(filePath)) {
return res.status(404).json({
success: false,
error: 'Diagram not found'
});
}
const ext = path.extname(filename).toLowerCase();
if (ext === '.svg') {
res.setHeader('Content-Type', 'image/svg+xml');
} else if (ext === '.png') {
res.setHeader('Content-Type', 'image/png');
}
res.sendFile(filePath);
} catch (error) {
res.status(500).json({
success: false,
error: error.message
});
}
});
app.get('/api/diagrams/:filename/download', async (req, res) => {
try {
const { filename } = req.params;
const filePath = path.join(__dirname, 'diagrams', filename);
if (!await fs.pathExists(filePath)) {
return res.status(404).json({
success: false,
error: 'Diagram not found'
});
}
res.download(filePath);
} catch (error) {
res.status(500).json({
success: false,
error: error.message
});
}
});
app.get('/api/health', (req, res) => {
res.json({
success: true,
status: 'healthy',
timestamp: new Date().toISOString(),
diagramsDirectory: path.join(__dirname, 'diagrams')
});
});
// Serve static files from diagrams directory
app.use('/diagrams', express.static(path.join(__dirname, 'diagrams')));
// Root endpoint
app.get('/', (req, res) => {
res.json({
message: 'MCP Sequence Diagram Server',
version: '1.0.0',
endpoints: {
health: '/api/health',
listDiagrams: '/api/diagrams',
getDiagram: '/api/diagrams/:filename',
downloadDiagram: '/api/diagrams/:filename/download',
staticFiles: '/diagrams/:filename'
}
});
});
// Start server
app.listen(PORT, () => {
console.log(`HTTP server running on port ${PORT}`);
console.log(`Diagrams directory: ${path.join(__dirname, 'diagrams')}`);
console.log(`API documentation: http://localhost:${PORT}/`);
});
export default app;