如何快速开发和调试MCP服务

0 阅读3分钟

如何快速开发和调试MCP服务

在AI应用开发中,我们想让大模型访问外部数据源或工具,比如内部数据库、搜索引擎、文件系统等该如何实现呢?如果每个场景都手写一套API,既麻烦又难以统一。【AI大模型教程】

为了解决这个问题,MCP(Model Context Protocol,模型上下文协议)应运而生,它定义了一套标准协议,让大模型能够以统一的方式调用外部能力。

详细了解MCP可以看:《一文搞懂MCP模型上下文协议》

FastMCP是一个极简而高效的开发框架,可以在几分钟内写出一个可用的MCP服务。本文将教大家如何使用FastMCP快速开发一个MySQL MCP,让大模型可以直接执行数据库操作。

1.什么是FastMCP?

首先,我们先了解FastMCP,它是一个基于Python的轻量级框架,用于快速开发MCP(Model Context Protocol,模型上下文协议)服务。

它提供了简洁的装饰器(@app.tool())来定义工具函数,并自动处理JSON-RPC通信、参数校验、服务注册等复杂逻辑,让我们专注于编写业务逻辑。简单来说:

  • MCP让大模型能调用外部工具、数据库、API;
  • FastMCP让开发者用几行代码就写出一个MCP服务。
  1. 环境准备

需要Python 3.11+。

3. 安装依赖

pip install fastmcp pymysql

4. 准备MySQL测试数据库

确保有一个MySQL数据库运行,并能正常连接,创建test_db库,创建users表,表的定义和内容可以自行定义。

5. 开发

实现一个简单的MySQL MCP服务

📂 项目结构:

mcp-mysql/
├─ mysql_mcp.py
└─ requirements.txt

mysql_mcp.py

import pymysql
from fastmcp import FastMCP
# 初始化 MCP 服务
app = FastMCP("MySQL MCP")
# 数据库连接配置
DB_CONFIG = {
"host": "127.0.0.1",
"user": "root",
"port": 3308,
"password": "123456",
"database": "test_db",
"charset": "utf8mb4",
"cursorclass": pymysql.cursors.DictCursor
}
def run_query(sql: str):
"""执行 SQL 并返回结果"""
conn = pymysql.connect(**DB_CONFIG)
try:
with conn.cursor() as cursor:
cursor.execute(sql)
# 如果是 SELECT,返回结果列表
if sql.strip().lower().startswith("select"):
rows = cursor.fetchall()
return {"rows": rows}   # ✅ 包装成 dict
else:
conn.commit()
return {
"status": "success",
"rows_affected": cursor.rowcount
}
finally:
conn.close()
# 定义工具
@app.tool()
def query_mysql(sql: str) -> dict:
"""
执行 MySQL 查询语句
参数:
sql: 要执行的 SQL 语句 (SELECT / INSERT / UPDATE / DELETE)
"""
try:
return run_query(sql)
except Exception as e:
return {"error": str(e)}
if __name__ == "__main__":
app.run(transport="stdio")

6. 调试MCP服务

MCP Inspector是专门用来检查和交互测试MCP(Model Context Protocol)服务的调试工具。

1)安装MCPInspector:

npx @modelcontextprotocol/inspector

注意:执行上述命令需要先安装Node,建议20+

2)启动MySQL MCP服务并打开调试界面

npx @modelcontextprotocol/inspector python F:/python/mysql_mcp.py

注意:F:/python/mysql_mcp.py 需要修改为自己的实际路径

启动成功后会自动打开调试页面,如图:

输入:

select * from users

输出:

{
"content": [
{
"type": "text",
"text": "{\"rows\":[{\"id\":1,\"name\":\"hello\"}]}"
}
],
"structuredContent": {
"rows": [
{
"id": 1,
"name": "hello"
}
]
},
"isError": false
}

增、改、删可自行测试。

MCP Inspector能在运行MCP服务器时实时展示其暴露的工具、资源、提示和事件,测试调用、查看输入输出数据、捕捉错误日志,从而快速验证和调试MCP服务是否正常工作。

特别注意:

  • 本文示例内容不要直接暴露给不受控的大模型,否则可能执行危险SQL。
  • 可以在query_mysql里增加白名单,比如只允许SELECT,或者限制表名。
  • 如果要支持多数据库连接,可以在工具里增加db_name参数。

由于篇幅有限,下一期我们将实现如何让大模型调用本文的MySQL MCP服务。