智能体的开发长期受制于接口碎片化与工具兼容性难题。开发者需为不同数据源编写适配代码,导致60%的开发周期浪费在系统对接上。这一痛点催生了MCP协议的诞生。MCP(Model Context Protocol,模型上下文协议)由Anthropic于2024年底开源,其核心是通过标准化接口实现大模型与外部工具的“即插即用”。
前言
AI智能体通过感知环境、自主决策和执行任务,突破传统大模型仅限于语言交互的局限。例如,当用户指令“订一张明天去北京的机票”时,智能体不仅理解语义,还能自动调用航班查询接口、完成支付并同步至日程系统。这种能力使其在客服、医疗、智能制造等领域展现出颠覆性潜力。
然而,智能体的开发长期受制于接口碎片化与工具兼容性难题。开发者需为不同数据源编写适配代码,导致60%的开发周期浪费在系统对接上。这一痛点催生了MCP协议的诞生。MCP(Model Context Protocol,模型上下文协议)由Anthropic于2024年底开源,其核心是通过标准化接口实现大模型与外部工具的“即插即用”。类比互联网的TCP/IP协议,MCP构建了AI交互的通用语言。
本文将介绍如下内容:
- 搭建基于Docker的MySQL数据库环境
- 开发MCP Server实现MySQL数据库操作
- 基于Dify搭建智能体通过MCP操作MySQL实现理财助手智能体
搭建基于Docker的MySQL数据库环境
1) 启动Docker容器
- 建立docker_compose.yaml,内容如下
复制
services:
mysql:
image: mysql:5.7
container_name: mysql5.7
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- TZ=Asia/Shanghai
volumes:
- ./volumes:/var/lib/mysql
command: --character-set-server=utf8mb4
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 执行
docker compose up -d
启动数据库
2) 创建数据库和表
- 下载MySQL客户端软件,例如dbeaver (https://dbeaver.io/download)
- 连接数据库,创建数据库和表
复制
create database testdb;
use testdb;
CREATE TABLE `finance` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` varchar(36) NOT NULL DEFAULT '' COMMENT '用户ID',
`date` datetime NOT NULL COMMENT '金额发生日期',
`amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '收入支出金额(收入记为正数,支出记为负数)',
`category` varchar(32) NOT NULL DEFAULT '' COMMENT '收支类别',
`remark` varchar(100) NOT NULL DEFAULT '' COMMENT '收支具体类目',
PRIMARY KEY (`id`),
KEY `idx_user_date` (`user_id`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日常收支';
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
开发MCP Server实现MySQL数据库操作
以windows开发环境为例:
1) 设置Python开发环境
安装uv。uv是一个用Rust编写的极其快速的Python包和项目管理器。
复制
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
- 1.
创建python虚拟环境(假设项目目录为finance)
复制
# Create a new directory for our project
uv init finance
cd finance
# Create virtual environment and activate it
uv venv
.venv\Scripts\activate
# Install dependencies
uv add mcp[cli] mysql-connector-python python-dotenv
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
如果在执行.venv\Scripts\activate时报错“无法加载.venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本”,需要以管理员权限在终端执行
Set-ExecutionPolicy RemoteSigned
更改执行策略后再重新执行。
2) 设置环境变量
创建.env,配置数据库相关的环境变量,内容如下
复制
DB_HOST=localhost
DB_USER=root
DB_PASSWD=root
DB_NAME=testdb
- 1.
- 2.
- 3.
- 4.
把.env添加到.gitignore
3) MCP Server实现代码
实现两个mcp工具:
- get_table_definition: 获取表结构定义
- execute_sql: 执行SQL语句
复制
import mysql.connector
import json
import os
from contextlib import contextmanager
from dotenv import load_dotenv
from mcp.server.fastmcp import FastMCP
# 加载环境变量
load_dotenv()
class DbManager:
def __init__(self):
self.connection_pool = mysql.connector.pooling.MySQLConnectionPool(
pool_name="db_pool",
pool_size=5,
pool_reset_session=True,
host=os.getenv("DB_HOST"), # 数据库服务器地址
user=os.getenv("DB_USER"), # 数据库用户名
password=os.getenv("DB_PASSWD"), # 数据库密码
database=os.getenv("DB_NAME"), # 数据库名
)
@contextmanager
def get_cursor(self):
with self.connection_pool.get_connection() as connection:
cursor = None
try:
cursor = connection.cursor()
yield cursor
connection.commit()
except Exception as e:
connection.rollback()
raise e
finally:
if cursor:
cursor.close()
def execute_sql(self, sql: str) -> str:
with self.get_cursor() as cursor:
cursor.execute(sql)
if cursor.description is not None:
rows = cursor.fetchall()
result = {
"columns": [desc[0] for desc in cursor.description],
"rows": rows,
}
return json.dumps(result, default=str)
else:
return f"row affected:{cursor.rowcount}"
dbManager = DbManager()
# Initialize FastMCP server
mcp = FastMCP()
@mcp.tool()
def get_table_definition(table: str) -> str:
"""get table definition"""
return dbManager.execute_sql(f"show create table {table}")
@mcp.tool()
def execute_sql(sql: str) -> str:
"""execute sql"""
return dbManager.execute_sql(sql)
if __name__ == "__main__":
# Initialize and run the server
mcp.run(transport="sse")
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
3) 启动MCP Server
复制
uv run main.py
- 1.
基于Dify搭建智能体通过MCP操作MySQL实现理财助手智能体
Dify是一款开源的大语言模型应用开发平台,旨在降低AI应用的开发门槛,帮助开发者和企业快速构建、部署及管理生成式AI应用。
假设已经通过Docker Desktop for Windows安装Dify。
1) 安装MCP插件
点击右上角“插件”按钮,进入插件页面,选择“探索Marketplace
选择插件Dify Agent 策略
进行安装。
选择插件MCP SSE / StreamableHTTP
进行安装。
2) 设置MCP服务
切换到"插件"tab,选择已经安装的插件"MCP SSE / StreamableHTTP",点击“去授权”
填上MCP服务配置:
配置如下:
复制
{"finance_server":{"url":"http://host.docker.internal:8000/sse","headers":{},"timeout":50,"sse_read_timeout":50}}
- 1.
3) 创建Chatflow应用
- 创建一个空白应用,类型为Chatflow
- 调整工作流,把默认的LLM节点替换为Agent节点
- 设置Agent节点的Agent策略,并添加MCP工具策略选择Function Calling
- Agent节点的模型选择doubao-1.5-pro-32k通义千问系列的模型跑起来效果不佳,这次改用豆包模型
- 设置Agent节点的指令(系统提示词)
复制
# 角色
你是记账助手,可以通过调用MCP工具完成记录日常收入和支出并作分析。
为了获得MCP工具列表,必须先通过mcp_sse_list_tools获取。
为了完成记账操作,需要先获取表finance的定义。
记账的用户ID取值为{{#sys.user_id#}}
# 收支类别
收入:工资薪金,劳务报酬,投资收益,分红收入,租金收入,其它收入
支出:住房,交通,通讯,保险,餐饮,电子产品,日用品,服饰,旅行,娱乐,医疗,学习,其它支出
# 技能
## 技能1:记录日常开支
将开支信息记录到数据库表finance
## 技能2:统计日常开支
根据用户输入信息分析统计日常开支
# 限制
仅处理记账相关问题,不回复其它问题
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 设置Agent节点的查询和最大迭代次数Agent完成一项任务可能需要迭代多次调用工具,最大迭代次数设置过小可能导致无法正常完成任务。
- 预览调试输入“昨天吃饭用了50元,还花了22元买了拖鞋。今天买手机花了1999元,吃饭花了60元”,验证输出为成功记录支出。
另外,通过数据库表验证数据正常插入
输入“汇总各个类别的金额”,验证数据查询
确认无误后点击右上角的“发布”按钮发布应用
总结
基于Dify搭建的智能体案例,不仅展示了从语义理解到工具调用的完整决策链路,更印证了MCP协议在降低开发成本和加速应用落地方面的工程意义。