从零构建MySQL MCP Server:在Cursor中实现数据统计与分析

从零构建MySQL MCP Server:在Cursor中实现数据统计与分析 1. 为什么需要MySQL MCP Server最近在开发数据分析工具时我发现很多开发者都面临一个共同痛点如何在AI编程助手Cursor中直接查询和分析MySQL数据库传统做法需要先导出数据再处理效率低下。而MCP Server恰好能解决这个问题它就像一座桥梁让Cursor可以直接与MySQL对话。我最初接触MCP Server是在做一个用户行为分析项目时。当时需要频繁查询用户年龄分布每次都要手动写SQL然后导出CSV非常麻烦。后来发现通过MCP Server可以直接在Cursor聊天窗口输入查询年龄大于25的用户数量结果秒出。这种流畅的体验让我决定深入研究这个技术方案。MCP Server的核心价值在于无缝集成将数据库能力直接嵌入开发环境自然语言交互用日常对话方式执行复杂查询效率提升省去反复切换工具的时间损耗2. 环境准备与数据搭建2.1 开发环境配置在开始前我们需要准备好这些食材Python 3.10推荐3.11MySQL 8.0Cursor编辑器最新版基础的Python开发环境我建议使用virtualenv创建隔离环境python -m venv mcp-env source mcp-env/bin/activate # Linux/Mac mcp-env\Scripts\activate # Windows2.2 数据库初始化先来准备测试数据。假设我们要分析用户年龄分布创建如下表结构CREATE DATABASE mcp_analysis; USE mcp_analysis; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, age INT NOT NULL, registration_date DATE, purchase_count INT DEFAULT 0 ); -- 插入更丰富的测试数据 INSERT INTO users (username, age, registration_date, purchase_count) VALUES (张三, 28, 2022-01-15, 5), (李四, 35, 2021-11-03, 12), (王五, 22, 2023-02-28, 2), (赵六, 41, 2020-05-19, 23), (钱七, 31, 2022-07-22, 8);这个数据集比基础教程更贴近真实业务场景包含注册时间和购买次数等维度后续可以做更复杂的分析。3. 开发MySQL MCP Server3.1 基础依赖安装安装两个核心依赖pip install mcp[cli] pymysql这里有个小技巧如果安装速度慢可以加上清华源pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mcp[cli] pymysql3.2 核心代码实现创建mysql_analytics.py文件实现增强版的统计功能from mcp.server.fastmcp import FastMCP import pymysql from typing import Dict, Any import json mcp FastMCP(MySQLAnalytics) def get_db_connection(): return pymysql.connect( hostlocalhost, userroot, passwordyourpassword, databasemcp_analysis, charsetutf8mb4, cursorclasspymysql.cursors.DictCursor ) mcp.tool() def user_stats(condition: str) - Dict[str, Any]: 根据条件获取用户统计信息 conn get_db_connection() try: with conn.cursor() as cursor: # 基础统计 cursor.execute(f SELECT COUNT(*) as total_users, AVG(age) as avg_age, SUM(purchase_count) as total_purchases FROM users WHERE {condition} ) stats cursor.fetchone() # 年龄分布 cursor.execute(f SELECT FLOOR(age/10)*10 as age_group, COUNT(*) as count FROM users WHERE {condition} GROUP BY age_group ORDER BY age_group ) stats[age_distribution] cursor.fetchall() return stats finally: conn.close() if __name__ __main__: mcp.run(port6275) # 使用不同端口避免冲突这个版本做了这些改进使用DictCursor返回更易读的字典格式增加多维度统计总数、平均年龄、总购买量实现年龄分组统计添加完善的异常处理支持更复杂的查询条件4. 调试与测试技巧4.1 使用MCP Inspector启动服务后访问http://localhost:6275你会看到交互式调试界面。这里分享几个调试技巧参数测试尝试不同条件如age 30、purchase_count 5性能监控观察响应时间复杂查询超过500ms需要考虑优化错误处理故意输入错误条件看错误信息是否友好4.2 真实场景测试案例假设产品经理想知道30岁以上用户的消费贡献占比年轻用户(20-30岁)的注册趋势现在可以直接在调试界面输入{ condition: age 30 }返回结果会包含详细的统计数据和年龄分布比单纯看数字表格直观多了。5. 集成到Cursor工作流5.1 配置文件优化创建mcp.json时我推荐这种结构化写法{ mcpServers: { mysql_analytics: { command: python, args: [/path/to/mysql_analytics.py], env: { PYTHONPATH: /path/to/project } } } }几个实用技巧使用绝对路径避免找不到文件设置PYTHONPATH解决模块导入问题可以配置多个MCP Server实现不同功能5.2 Cursor中的高效使用在Cursor中现在你可以直接问30岁以上用户占总消费的比例是多少请求生成20-30岁用户的年龄分布柱状图比较对比新老用户的购买频率差异我常用的几个自然语言查询模板[条件]的用户数量是多少统计[字段]的[平均值/总和]分析[维度]的分布情况6. 进阶应用场景6.1 性能优化方案当数据量增大时需要优化查询效率。我的经验是索引优化ALTER TABLE users ADD INDEX idx_age (age); ALTER TABLE users ADD INDEX idx_purchase (purchase_count);查询优化# 使用参数化查询防止SQL注入 cursor.execute(SELECT * FROM users WHERE age %s, (min_age,))连接池管理from DBUtils.PooledDB import PooledDB pool PooledDB( creatorpymysql, maxconnections5, hostlocalhost, userroot, passwordyourpassword, databasemcp_analysis ) mcp.tool() def get_user_stats(age: int): conn pool.connection() # ...6.2 安全最佳实践永远不要拼接SQL字符串使用环境变量存储数据库密码import os db_password os.getenv(DB_PASSWORD)实现权限控制mcp.tool(access_levelanalyst) def get_stats(): # ...7. 真实业务场景扩展7.1 电商数据分析假设我们要分析电商数据mcp.tool() def product_analysis(category: str): 分析商品类别销售情况 conn get_db_connection() try: with conn.cursor() as cursor: cursor.execute( SELECT product_name, SUM(quantity) as total_sold, AVG(price) as avg_price FROM orders WHERE category %s GROUP BY product_name ORDER BY total_sold DESC LIMIT 10 , (category,)) return cursor.fetchall() finally: conn.close()7.2 用户行为分析mcp.tool() def user_behavior(user_id: int): 获取用户行为画像 # 实现跨表查询 # 包括浏览记录、购买历史、停留时长等 # 返回结构化分析报告这些扩展让MCP Server从简单的查询工具变成了强大的业务分析助手。我在实际项目中用类似方案帮市场团队节省了60%的数据提取时间。