mermaid_mcp_tool

mermaid_mcp_tool

Provides Mermaid code validation and iterative line-level repair to fix syntax errors in LLM-generated Mermaid diagrams, ensuring consistency with the frontend parser.

Category
访问服务器

README

mermaid_mcp_tool

一个基于 MCP(Model Context Protocol)协议的独立服务,提供 Mermaid 代码语法校验和循环修复工具, 用于解决 LLM 生成 Mermaid 代码时的幻觉问题。

为什么需要它

  • 前端使用 mermaid@11.12.1 的 mermaid.parse() 做渲染前校验
  • backend 需要在把 LLM 重新生成的 mermaid code 返回给 front 之前,先用同一套解析逻辑校验一遍
  • 本工具直接依赖 mermaid@11.12.1(与 front 完全一致的版本),通过 jsdom 模拟浏览器环境后调用 mermaid.parse(),因此校验结果与 front 渲染时的判定结果一致
  • 新增:提供循环修复流程,支持行级增量修复,避免 LLM 反复修改正确代码

安装与构建

npm install
npm run build

本地运行(stdio MCP server)

npm start
# 或开发模式
npm run dev

服务启动后通过 stdio 提供 MCP 协议通信,适合作为子进程被 backend 启动。

Docker 独立部署

docker build -t mermaid-mcp-tool .
docker run -i mermaid-mcp-tool

-i 是必须的,因为 MCP stdio 传输依赖 stdin/stdout。

暴露的 Tools

1. validate_mermaid_syntax - 基础语法校验

输入:

{
  "code": "graph TD\n  A --> B"
}

输出(语法正确):

{
  "valid": true,
  "diagramType": "flowchart-v2"
}

输出(语法错误):

{
  "valid": false,
  "error": {
    "message": "Parse error on line 2: ...",
    "hash": { "...": "..." },
    "str": "Parse error on line 2: ...",
    "detailedErrors": [
      {
        "lineNumber": 2,
        "column": 5,
        "message": "Parse error on line 2: ...",
        "errorType": "syntax"
      }
    ]
  }
}

2. mermaid_fix_start - 启动修复会话

用途:提交初始 Mermaid 代码,开始修复流程。如果代码合法直接返回通过;如果不合法,返回详细的错误信息(包含行号)。

输入:

{
  "code": "graph TD\n    A[Start] --x B{Is it working?}\n    B -->|Yes| C[Great!]",
  "maxAttempts": 10
}

参数说明:

  • code: 初始 Mermaid 代码(必填)
  • maxAttempts: 最大修复尝试次数(可选,默认 10,最大 50)

输出(代码合法):

{
  "success": true,
  "requestId": "1718360000000-abc123def456",
  "valid": true
}

输出(代码不合法):

{
  "success": true,
  "requestId": "1718360000000-abc123def456",
  "valid": false,
  "errors": [
    {
      "lineNumber": 2,
      "message": "Invalid arrow type: --x"
    }
  ]
}

3. mermaid_fix_submit - 提交修复

用途:提交行级修复,仅修改错误行,保持其他代码不变。重新校验后返回结果。

输入:

{
  "requestId": "1718360000000-abc123def456",
  "lineFixes": [
    {
      "lineNumber": 2,
      "content": "    A[Start] --> B{Is it working?}"
    }
  ]
}

参数说明:

  • requestId: 从 mermaid_fix_start 获取的会话 ID(必填)
  • lineFixes: 修复数组(必填)
    • lineNumber: 1 基行号(必填)
    • content: 该行的新内容(必填)

输出(修复成功):

{
  "success": true,
  "valid": true,
  "diagramType": "flowchart-v2"
}

输出(仍有错误):

{
  "success": true,
  "valid": false,
  "errors": [
    {
      "lineNumber": 3,
      "message": "..."
    }
  ]
}

4. mermaid_fix_complete - 获取最终代码并完成

用途:从成功完成的会话中获取最终的合法代码,并清理资源。

输入:

{
  "requestId": "1718360000000-abc123def456"
}

输出:

{
  "success": true,
  "code": "graph TD\n    A[Start] --> B{Is it working?}\n    B -->|Yes| C[Great!]"
}

5. mermaid_fix_status - 查询会话状态

用途:查询当前修复会话的状态信息。

输入:

{
  "requestId": "1718360000000-abc123def456"
}

输出:

{
  "requestId": "1718360000000-abc123def456",
  "status": "fixing",
  "currentAttempt": 2,
  "maxAttempts": 10,
  "lastValidation": {
    "valid": false,
    "error": { ... }
  }
}

完整修复流程示例

Backend 调用示例(Node.js / TypeScript,MCP Client)

import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";

const transport = new StdioClientTransport({
  command: "node",
  args: ["/path/to/mermaid_mcp_tool/dist/index.js"],
});

const client = new Client({ name: "backend-service", version: "1.0.0" });
await client.connect(transport);

// 1. 启动修复会话
const startResult = await client.callTool({
  name: "mermaid_fix_start",
  arguments: { code: mermaidCodeFromLLM, maxAttempts: 10 },
});
const startData = JSON.parse(startResult.content[0].text as string);

if (startData.valid) {
  // 代码直接合法
  console.log("Code is valid!");
} else {
  let currentData = startData;
  let requestId = startData.requestId;

  // 2. 循环修复
  while (!currentData.valid && currentData.errors) {
    // 让 LLM 仅修复错误行
    const fixedLines = await askLLMToFixLines(
      mermaidCodeFromLLM,
      currentData.errors
    );

    // 3. 提交修复
    const submitResult = await client.callTool({
      name: "mermaid_fix_submit",
      arguments: { requestId, lineFixes: fixedLines },
    });
    currentData = JSON.parse(submitResult.content[0].text as string);
  }

  // 4. 获取最终代码
  if (currentData.valid) {
    const completeResult = await client.callTool({
      name: "mermaid_fix_complete",
      arguments: { requestId },
    });
    const finalData = JSON.parse(completeResult.content[0].text as string);
    console.log("Final valid code:", finalData.code);
  }
}

业务流程整合

方案 A:简单校验(原有)

  1. backend LLM 首次生成 mermaid code → 直接返回给 front
  2. front 渲染失败 → 将 code + 错误信息回传给 backend
  3. backend 让 LLM 重新生成 → 调用 validate_mermaid_syntax 校验
  4. 若仍不通过 → 可将错误信息再次喂给 LLM 重新生成(可设置重试上限)
  5. 校验通过 → 返回给 front

方案 B:循环修复(新增,推荐)

  1. backend LLM 首次生成 mermaid code → 调用 mermaid_fix_start
  2. 若不合法 → 收到错误行号列表 → 让 LLM 仅针对错误行修复
  3. 调用 mermaid_fix_submit 提交修复
  4. 重复步骤 2-3 直到通过或达到最大尝试次数
  5. 通过后 调用 mermaid_fix_complete 获取最终代码 → 返回给 front

核心特性

1. 精准的行级错误定位

  • 从 mermaid 错误信息中提取行号和列号
  • 支持多种图表类型(flowchart、sequenceDiagram、classDiagram、erDiagram 等)

2. 增量更新,保护正确代码

  • 仅修改指定错误行
  • 保持其他代码的格式和缩进不变
  • 避免 LLM 反复修改已正确的内容

3. 完整的版本历史

  • 每次修复都保存版本快照
  • 记录修改的行和内容
  • 便于问题回溯

4. 性能优化

  • 单次校验不超过 200ms
  • 使用文件锁处理并发
  • 支持会话清理

5. 详细日志

  • 记录每次尝试的错误类型
  • 统计修复次数和耗时
  • 支持会话日志查询

目录结构

mermaid_mcp_tool/
├── src/
│   ├── index.ts                  # MCP Server 入口
│   ├── mermaidValidator.ts       # 语法校验核心
│   ├── mermaidFileManager.ts     # 文件存储和版本管理
│   ├── mermaidLogger.ts          # 日志记录
│   ├── mermaidFixEngine.ts       # 修复引擎核心
│   └── mermaidFixEngine.test.ts  # 单元测试
├── dist/                         # 构建输出
├── .mermaid_storage/             # 代码存储目录(gitignored)
├── .mermaid_logs/                # 日志目录(gitignored)
├── package.json
├── tsconfig.json
├── Dockerfile
└── README.md

版本一致性维护

package.json 中 mermaid 版本号需始终与 front 端 package.json 中的 mermaid 版本保持一致 (当前均为 11.12.1)。front 端升级 mermaid 版本时,本工程需同步升级并重新构建部署。

开发测试

# 运行测试(需要 tsx)
npx tsx src/mermaidFixEngine.test.ts

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选
mcp-server-qdrant

mcp-server-qdrant

这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。

官方
精选
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选