Skip to main content
Glama

Mermaid Chart MCP

by echoVic
IMPROVEMENTS.md8.04 kB
# Mermaid Chart MCP Server 改进总结 本文档总结了根据代码工程建议所做的全面改进。推荐使用 [MCP Inspector](https://github.com/modelcontextprotocol/inspector) 进行调试和测试。 ## 🏗️ 架构改进 ### 1. 目录结构重构 **之前:** ``` src/ ├── server.ts └── simple-mcp-server.ts ``` **之后:** ``` src/ ├── server/ │ ├── index.ts # 主入口文件 │ ├── simple-mcp-server.ts # MCP服务器核心逻辑 │ ├── sse-transport.ts # SSE传输和Web服务器 │ └── utils.ts # 工具函数(校验、清理等) ├── package.json ├── tsconfig.json ├── tsup.config.ts # 构建配置 └── README.md ``` **改进效果:** - ✅ 模块化设计,职责分离 - ✅ 更好的可维护性 - ✅ 清晰的依赖关系 ### 2. 构建系统优化 **新增 tsup 配置:** ```typescript // tsup.config.ts export default defineConfig({ entry: { 'server/index': 'src/server/index.ts', // ... 其他入口 }, format: ['esm'], target: 'node18', sourcemap: true, dts: true, banner: { js: '#!/usr/bin/env node' } }); ``` **改进效果:** - ✅ 快速的 ESM 构建 - ✅ 自动生成类型声明文件 - ✅ 源码映射支持 - ✅ 正确的 shebang 处理 ## 🛡️ 安全性改进 ### 1. ESM 环境全局污染解决 **之前的问题:** ```typescript // 直接修改全局变量,多用户并发时有竞态问题 global.window = window; global.document = window.document; ``` **改进后:** ```typescript // 创建隔离的渲染环境 private async renderMermaidInIsolatedContext(mermaidCode: string, theme: string): Promise<string> { const dom = new JSDOM('<!DOCTYPE html>...'); const originalWindow = global.window; const originalDocument = global.document; try { global.window = dom.window; global.document = dom.window.document; // 渲染逻辑... } finally { // 恢复原始全局变量 if (originalWindow !== undefined) { global.window = originalWindow; } else { delete (global as any).window; } dom.window.close(); } } ``` **改进效果:** - ✅ 避免全局污染 - ✅ 多用户并发安全 - ✅ 资源自动清理 ### 2. 输入校验和安全性 **新增校验函数:** ```typescript export function validateInput(params: { mermaidCode?: string; title?: string; theme?: string; }): string | null { // 长度限制 if (mermaidCode && mermaidCode.length > 50000) { return 'mermaidCode 长度不能超过50000字符'; } // 恶意内容检测 if (/<script|javascript:|data:|vbscript:/i.test(mermaidCode)) { return 'mermaidCode 包含不安全的内容'; } // 特殊字符过滤 if (title && /<|>|&|"|'|`/.test(title)) { return 'title 包含不允许的特殊字符'; } } ``` **改进效果:** - ✅ 防止恶意输入 - ✅ XSS 防护 - ✅ 文件名安全化 ## 🎨 功能改进 ### 1. 稳健的 SVG 标题添加 **之前的问题:** ```typescript // 简单字符串替换,可能有边缘 bug return svg.replace('<svg', `<svg${titleElement ? '\n ' + titleElement : ''}`); ``` **改进后:** ```typescript private addTitleToSVG(svg: string, title: string): string { try { // 使用 DOM 解析器插入 title 元素 const dom = new JSDOM(`<!DOCTYPE html><html><body>${svg}</body></html>`); const svgElement = dom.window.document.querySelector('svg'); if (svgElement) { const titleElement = dom.window.document.createElement('title'); titleElement.textContent = title; svgElement.insertBefore(titleElement, svgElement.firstChild); return svgElement.outerHTML; } // 回退方案... } catch (error) { // 回退到字符串替换 } } ``` **改进效果:** - ✅ 更稳健的 DOM 操作 - ✅ 优雅的错误回退 - ✅ 避免格式问题 ### 2. 精细的图表类型检测 **改进后:** ```typescript private detectDiagramType(mermaidCode: string): string { const patterns = [ { pattern: /^(graph|flowchart)\s+(TD|TB|BT|RL|LR)/, type: '流程图' }, { pattern: /^sequencediagram/m, type: '序列图' }, { pattern: /^classDiagram/m, type: '类图' }, { pattern: /^statediagram(-v2)?/m, type: '状态图' }, // ... 更多精确匹配 ]; for (const { pattern, type } of patterns) { if (pattern.test(code)) { return type; } } } ``` **改进效果:** - ✅ 更精确的类型识别 - ✅ 支持更多图表类型 - ✅ 正则表达式优化 ## 🌐 Web 服务改进 ### 1. CORS 和安全配置 **新增功能:** ```typescript private setupCORS(app: express.Application): void { app.use((req, res, next) => { const allowedOrigins = process.env.ALLOWED_ORIGINS ? process.env.ALLOWED_ORIGINS.split(',') : ['*']; const origin = req.headers.origin; if (allowedOrigins.includes('*') || (origin && allowedOrigins.includes(origin))) { res.header('Access-Control-Allow-Origin', origin || '*'); } // ... 其他 CORS 配置 }); } ``` **改进效果:** - ✅ 灵活的 CORS 配置 - ✅ 生产环境域名白名单 - ✅ 安全性提升 ### 2. SSE 连接管理 **新增功能:** ```typescript export class SSETransport { private activeConnections = new Set<SSEServerTransport>(); async start(port: number): Promise<void> { // 连接管理 res.on('close', () => { this.activeConnections.delete(transport); }); // 优雅关闭 process.on('SIGTERM', () => { this.cleanup(); server.close(); }); } private cleanup(): void { for (const connection of this.activeConnections) { this.activeConnections.delete(connection); } } } ``` **改进效果:** - ✅ 自动连接清理 - ✅ 资源释放管理 - ✅ 优雅关闭处理 ### 3. 现代化测试界面 **新增功能:** - 🎨 Material Design 风格 UI - 📱 响应式设计 - 🧪 实时代码测试 - 📊 服务器状态监控 - 🔗 API 端点信息 ## 📦 工程实践改进 ### 1. package.json 优化 **新增配置:** ```json { "main": "dist/server/index.js", "types": "dist/server/index.d.ts", "bin": { "mermaid-mcp": "./dist/server/index.js" }, "exports": { "import": "./dist/server/index.js", "types": "./dist/server/index.d.ts" }, "scripts": { "build": "tsup", "start:dev": "node --loader ts-node/esm src/server/index.ts", "clean": "rm -rf dist", "prepublishOnly": "npm run clean && npm run build" } } ``` **改进效果:** - ✅ 正确的 ESM 导出 - ✅ bin 脚本支持 - ✅ 开发和生产分离 ### 2. TypeScript 严格配置 **保持严格模式:** ```json { "strict": true, "noImplicitAny": true, "strictNullChecks": true, "noUnusedLocals": true, "noUnusedParameters": true, "noImplicitReturns": true } ``` **改进效果:** - ✅ 类型安全 - ✅ 代码质量保证 - ✅ 潜在错误预防 ## 📈 性能优化 ### 1. 内存管理 - ✅ JSDOM 实例自动清理 - ✅ 连接池管理 - ✅ 临时文件清理 ### 2. 并发性能 - ✅ 隔离渲染环境 - ✅ 非阻塞异步处理 - ✅ 连接状态监控 ## 🚀 部署改进 ### 1. 构建优化 - ✅ 快速 ESM 构建 - ✅ 源码映射支持 - ✅ Tree-shaking 优化 ### 2. 运行时优化 - ✅ 正确的 shebang 处理 - ✅ 进程信号处理 - ✅ 环境变量配置 ## 📚 文档完善 ### 1. 用户文档 - ✅ 详细的 README - ✅ API 文档 - ✅ 部署指南 ### 2. 开发文档 - ✅ 变更日志 - ✅ 改进总结 - ✅ 环境变量示例 ## 🎯 总结 这次改进涵盖了代码工程的各个方面: 1. **架构设计**: 模块化、职责分离 2. **安全性**: 输入校验、全局污染解决 3. **性能**: 内存管理、并发优化 4. **工程实践**: 构建优化、文档完善 5. **用户体验**: 现代化界面、错误处理 所有改进都遵循了现代 TypeScript/Node.js 项目的最佳实践,确保了代码的可维护性、安全性和性能。

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/echoVic/mermaid-chart-mcp'

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