From fab93eb1a1c35d64c842f85f980c300fd943d828 Mon Sep 17 00:00:00 2001 From: lipingEmmaSiguyi <1477412247@qq.com> Date: Thu, 3 Jul 2025 19:34:33 +0800 Subject: [PATCH] add mysql_*_mcp for fetch mysql source and build --- servers/mysql_build_mcp/mcp-rpm.yaml | 20 ++++ servers/mysql_build_mcp/mcp_config.json | 15 +++ servers/mysql_build_mcp/src/server.py | 139 ++++++++++++++++++++++ servers/mysql_source_mcp/mcp-rpm.yaml | 18 +++ servers/mysql_source_mcp/mcp_config.json | 15 +++ servers/mysql_source_mcp/requirements.txt | 4 + servers/mysql_source_mcp/src/server.py | 59 +++++++++ 7 files changed, 270 insertions(+) create mode 100644 servers/mysql_build_mcp/mcp-rpm.yaml create mode 100644 servers/mysql_build_mcp/mcp_config.json create mode 100644 servers/mysql_build_mcp/src/server.py create mode 100644 servers/mysql_source_mcp/mcp-rpm.yaml create mode 100644 servers/mysql_source_mcp/mcp_config.json create mode 100644 servers/mysql_source_mcp/requirements.txt create mode 100644 servers/mysql_source_mcp/src/server.py diff --git a/servers/mysql_build_mcp/mcp-rpm.yaml b/servers/mysql_build_mcp/mcp-rpm.yaml new file mode 100644 index 0000000..43ce830 --- /dev/null +++ b/servers/mysql_build_mcp/mcp-rpm.yaml @@ -0,0 +1,20 @@ +name: "mysql-build" +summary: "MCP server for MySQL compilation and RPM packaging" +description: | + Provides MCP tools for compiling MySQL source code and packaging it into RPM format. + +dependencies: + system: + - python3 + - uv + - gcc + - make + - rpm-build + - cmake + +files: + required: + - mcp_config.json + - src/server.py + optional: + - requirements.txt \ No newline at end of file diff --git a/servers/mysql_build_mcp/mcp_config.json b/servers/mysql_build_mcp/mcp_config.json new file mode 100644 index 0000000..bc76603 --- /dev/null +++ b/servers/mysql_build_mcp/mcp_config.json @@ -0,0 +1,15 @@ +{ + "mcpServers": { + "mysql_build_mcp": { + "command": "uv", + "args": [ + "--directory", + "/opt/mcp-servers/servers/mysql_build_mcp/src", + "run", + "server.py" + ], + "disabled": false, + "alwaysAllow": ["build_mysql"] + } + } +} diff --git a/servers/mysql_build_mcp/src/server.py b/servers/mysql_build_mcp/src/server.py new file mode 100644 index 0000000..44a6289 --- /dev/null +++ b/servers/mysql_build_mcp/src/server.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +import os +import subprocess +import logging +import re +from mcp.server.fastmcp import FastMCP, Context + +mcp = FastMCP("MySQL Build MCP") + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("mysql_build_mcp") + +def install_dependencies_commands() -> list: + """返回安装依赖的命令列表""" + commands = [ + "# 安装编译依赖(鲲鹏指南1.3.6节)", + "sudo yum remove -y openssl openssl-devel", + "sudo yum install -y compat-openssl11-devel" + ] + + deps = [ + "bison", "bison-devel", "ncurses", "ncurses-devel", "libaio-devel", + "gmp", "gmp-devel", "mpfr", "mpfr-devel", + "libmpc", "libmpc-devel", "libcurl-devel", "wget", "tar", "gcc", "gcc-c++", + "git", "rpcgen", "cmake", "make", "numactl", "numactl-devel", "libtirpc", + "libtirpc-devel", "m4", "zstd-devel", "patchelf" + ] + commands.append("sudo yum install -y " + " ".join(deps)) + return commands + +def generate_cmake_upgrade_commands(): + """生成CMake升级命令""" + commands = [ + "# 检查CMake版本", + "cmake_version=$(cmake --version | head -1 | awk '{print $3}')", + 'if [ "$(printf \'%s\\n\' "3.5.2" "$cmake_version" | sort -V | head -n1)" != "3.5.2" ]; then', + " # 升级CMake", + " wget https://cmake.org/files/v3.5/cmake-3.5.2.tar.gz -O /tmp/cmake-3.5.2.tar.gz", + " tar -zxvf /tmp/cmake-3.5.2.tar.gz -C /tmp", + " cd /tmp/cmake-3.5.2", + " ./bootstrap", + " make -j$(nproc)", + " sudo make install", + " cd -", + "fi" + ] + return commands + +def generate_gcc_upgrade_commands(): + """生成GCC升级命令""" + commands = [ + "# 检查GCC版本", + "gcc_version=$(gcc --version | head -1 | awk '{print $3}')", + 'if [ "$(printf \'%s\\n\' "7.3.0" "$gcc_version" | sort -V | head -n1)" != "7.3.0" ]; then', + " # 升级GCC", + " wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz -O /tmp/gcc-7.3.0.tar.gz", + " tar -xvf /tmp/gcc-7.3.0.tar.gz -C /tmp", + " cd /tmp/gcc-7.3.0", + " ./configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-bootstrap", + " make -j$(nproc)", + " sudo make install", + " cd -", + "fi" + ] + return commands + +@mcp.tool() +def build_mysql(ctx: Context, source_path: str, version: str, ssl_type: str = 'bundled') -> list: + """返回MySQL编译的所有执行指令(鲲鹏指南1.4节) + ssl_type: bundled 或 system (默认bundled) + 返回: 命令列表,用户可自行选择执行 + """ + commands = [] + + commands.extend(install_dependencies_commands()) + + commands.extend(generate_cmake_upgrade_commands()) + + commands.extend(generate_gcc_upgrade_commands()) + + if source_path.endswith(".tar.gz"): + extract_dir = f"/tmp/mysql-{version}" + commands.append(f"# 解压MySQL源码") + commands.append(f"mkdir -p {extract_dir}") + commands.append(f"tar -xzf {source_path} -C {extract_dir}") + commands.append(f"cd {extract_dir}") + commands.append("extracted_dirs=(*)") + commands.append('if [ ${#extracted_dirs[@]} -eq 1 ]; then') + commands.append(f' source_path="{extract_dir}/$extracted_dirs"') + commands.append('else') + commands.append(f' source_path="{extract_dir}"') + commands.append('fi') + commands.append("cd -") + + build_dir = f"/tmp/mysql-build-{version}" + install_dir = f"/usr/local/mysql-{version}" + commands.append(f"# 创建构建目录") + commands.append(f"mkdir -p {build_dir}") + commands.append(f"sudo mkdir -p {install_dir}") + + executor_h_path = os.path.join(source_path, "router", "src", "harness", "include", "mysql", "harness", "net_ts", "executor.h") + commands.append(f"# 修改源码: {executor_h_path}") + commands.append(f'if [ -f "{executor_h_path}" ]; then') + commands.append(' # 在39行插入#include ') + commands.append(f' sed -i \'38a #include \' "{executor_h_path}"') + commands.append('else') + commands.append(f' echo "警告: 未找到文件 {executor_h_path},可能版本不一致"') + commands.append('fi') + + commands.append(f"# CMake配置") + cmake_cmd = f"cmake {source_path} " \ + f"-DCMAKE_INSTALL_PREFIX={install_dir} " \ + f"-DMYSQL_DATADIR=/data/mysql/data " \ + f"-DWITH_BOOST={os.path.join(source_path, 'boost')} " \ + f"-DWITH_SSL=system " \ + "-DWITH_INNOBASE_STORAGE_ENGINE=1 " \ + "-DWITH_PARTITION_STORAGE_ENGINE=1 " \ + "-DWITH_FEDERATED_STORAGE_ENGINE=1 " \ + "-DWITH_BLACKHOLE_STORAGE_ENGINE=1 " \ + "-DWITH_MYISAM_STORAGE_ENGINE=1 " \ + "-DENABLED_LOCAL_INFILE=1 " \ + "-DENABLE_DTRACE=0 " \ + "-DDEFAULT_CHARSET=utf8mb4 " \ + "-DDEFAULT_COLLATION=utf8mb4_general_ci" + commands.append(f"cd {build_dir}") + commands.append(cmake_cmd) + commands.append("cd -") + + commands.append(f"# 编译安装MySQL") + commands.append(f"cd {build_dir}") + commands.append("make -j$(nproc)") + commands.append("make install") + commands.append("cd -") + commands.append(f"echo 'MySQL编译安装完成,安装目录: {install_dir}'") + + return commands + +if __name__ == "__main__": + mcp.run() \ No newline at end of file diff --git a/servers/mysql_source_mcp/mcp-rpm.yaml b/servers/mysql_source_mcp/mcp-rpm.yaml new file mode 100644 index 0000000..5f90e96 --- /dev/null +++ b/servers/mysql_source_mcp/mcp-rpm.yaml @@ -0,0 +1,18 @@ +name: "mysql-source" +summary: "MCP server for MySQL upstream source collection" +description: | + Provides MCP tools for collecting MySQL upstream source code for specified versions. + +dependencies: + system: + - python3 + - uv + - git + - wget + +files: + required: + - mcp_config.json + - src/server.py + optional: + - requirements.txt \ No newline at end of file diff --git a/servers/mysql_source_mcp/mcp_config.json b/servers/mysql_source_mcp/mcp_config.json new file mode 100644 index 0000000..252c66e --- /dev/null +++ b/servers/mysql_source_mcp/mcp_config.json @@ -0,0 +1,15 @@ + { + "mcpServers": { + "mysql_source_mcp": { + "command": "uv", + "args": [ + "--directory", + "/opt/mcp-servers/servers/mysql_source_mcp/src", + "run", + "server.py" + ], + "disabled": false, + "alwaysAllow": ["fetch_mysql_source"] + } + } +} diff --git a/servers/mysql_source_mcp/requirements.txt b/servers/mysql_source_mcp/requirements.txt new file mode 100644 index 0000000..0df1212 --- /dev/null +++ b/servers/mysql_source_mcp/requirements.txt @@ -0,0 +1,4 @@ +# MySQL源码服务依赖 +fastapi==0.110.0 +uvicorn==0.29.0 +mcp==0.1.0 \ No newline at end of file diff --git a/servers/mysql_source_mcp/src/server.py b/servers/mysql_source_mcp/src/server.py new file mode 100644 index 0000000..56409e5 --- /dev/null +++ b/servers/mysql_source_mcp/src/server.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +import os +import subprocess +import logging +from mcp.server.fastmcp import FastMCP, Context + +mcp = FastMCP("MySQL Source MCP") + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("mysql_source_mcp") + +@mcp.tool() +def fetch_mysql_source(ctx: Context, version: str, output_dir: str = None) -> str: + """从MySQL官方仓库下载指定版本的源码(包含Boost Headers)""" + try: + if output_dir is None: + output_dir = f"tmp/mysql-{version}" + + url = f"https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-{version}.tar.gz" + target_file = os.path.join(output_dir, f"mysql-boost-{version}.tar.gz") + + os.makedirs(output_dir, exist_ok=True) + + if os.path.exists(target_file): + file_size = os.path.getsize(target_file) + if file_size >= 100 * 1024 * 1024: + logger.info(f"文件已存在且大小正常: {target_file}") + return ( + f"MySQL源码已存在(包含Boost)\n" + f"资源URI: mysql_source://{version}\n" + f"文件路径: {target_file}\n" + f"文件大小: {file_size}字节" + ) + else: + logger.warning(f"文件已存在但大小异常({file_size}字节)") + + + aria2c_command = f"aria2c -x 16 -s 16 -k 1M {url} -d {output_dir} -o {os.path.basename(target_file)}" + + wget_command = f"wget {url} -O {target_file}" + logger.info(f"生成下载命令: aria2c_command={aria2c_command}, wget_command={wget_command}") + + return ( + f"请选择以下命令下载MySQL源码(推荐aria2c多线程下载):\n" + f"1. aria2c多线程下载(更快):\n" + f" {aria2c_command}\n\n" + f"2. wget单线程下载:\n" + f" {wget_command}\n\n" + f"输出目录: {output_dir}\n" + f"文件路径: {target_file}\n" + f"注意:如未安装aria2c,请先执行: sudo apt install aria2" + ) + except Exception as e: + error_msg = f"操作失败: {str(e)}" + logger.error(error_msg) + return error_msg + +if __name__ == "__main__": + mcp.run() \ No newline at end of file -- Gitee