概述
前面已经介绍了Dify接入知识库,也能接入外部的知识库ragflow,作为智能体开发平台,还能接入更多的工具,本课件介绍Dify接入MCP服务端。
项目背景
公司内部有大量的人事、行政和财务的问题,企业内部员工经常碰到各种问题需要咨询,导致内部人事、行政、财务等人员压力很大。本项目基于公司考勤数据、内部员工手册、等数据搭建一套智能体系统,重点解决下面问题:
- 应对各类考勤问题统计,实现自然语言的问答系统
- 员工手册实现员工各类问题咨询 除此之外本项目也能扩展到其他项目背景,例如面对企业内部订单数据的实时问答系统,售后问答等。
注意:本项目与** 和 **数据一样,不同的技术实现方式
技术架构
功能模块
mysql数据库
需要安装mysql数据库,如果已经安装好的直接修改配置就行。这里提供docker的安装方式,请确保能够正常使用docker环境。
在任意目录下创建空目录,名称为mysqld,把下面的命令复制到docker-compose.yaml文件中
version: '3.8'
services:
mysql:
image: mysql:8.0.43
container_name: mysql_container
environment:
MYSQL_ROOT_PASSWORD: 123456abc
MYSQL_DATABASE: function_calls
MYSQL_USER: dev
MYSQL_PASSWORD: 123456
ports:
- "3306:3306"
command: --local-infile=1
volumes:
- ./mysql_data:/var/lib/mysql
volumes:
mysql_data:
注意上面的mysql的root的密码是“123456abc”,并且创建了用户“dev”密码为“123456”。
运行docker命令启动服务,第一次启动会下载官方镜像到本地,具体命令可以参考
docker compose up -d
mysql启动以后,使用数据库工具把员工的信息导入mysql中,数据库建表语句如下:
CREATE TABLE `emp` (
`empno` int DEFAULT NULL, --员工编号, 默认为空
`ename` varchar(50) DEFAULT NULL, --员工姓名, 默认为空
`job` varchar(50) DEFAULT NULL,--员工工作, 默认为空
`mgr` int DEFAULT NULL,--员工领导, 默认为空
`hiredate` date DEFAULT NULL,--员工入职日期, 默认为空
`sal` int DEFAULT NULL,--员工的月薪, 默认为空
`comm` int DEFAULT NULL,--员工年终奖, 默认为空
`deptno` int DEFAULT NULL,--员工部分编号, 默认为空
);
CREATE TABLE `DEPT` (
`DEPTNO` int NOT NULL, -- 部门编码, 默认为空
`DNAME` varchar(14) DEFAULT NULL,--部门名称, 默认为空
`LOC` varchar(13) DEFAULT NULL,--地点, 默认为空
PRIMARY KEY (`DEPTNO`)
);
MCP服务端
这里使用官方的mcp模块开发MCP的服务端,如果对MCP不太熟悉的读者,可以参考 详细了解。
下面是MCP服务端代码,基本与 中类似,使用streamable-http通信方式启动服务。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Author : Vincent
@Time : 2026/1/20 16:41
@File : mcp_server_mysql.py
@Function :
"""
import os
import pymysql
from fastmcp import FastMCP
mcp = FastMCP(name="mysql_server")
class ASKDatabase(object):
def __init__(self):
self.conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password=os.getenv("PASSWORD"),
database='function_calls',
charset='utf8mb4',
)
self.cursor = self.conn.cursor()
def ask_database(self, query):
"""进行查询"""
self.cursor.execute(query)
return self.cursor.fetchall()
def close(self):
self.cursor.close()
self.conn.close()
db = ASKDatabase()
@mcp.tool(
name="query_mysql_question",
description="从mysql数据库查询公司的人员详细数据"
)
def query_mysql(query: str):
"""
query_mysql 需要一个参数 query,表示要查询的 SQL 查询语句。
返回查询结果。
"""
# 异常处理
return db.ask_database(query)
def main():
"""
启动 Streamable HTTP 服务器。
"""
print("正在启动MCP Streamable服务器...")
print("服务器将在 http://localhost:5122 上运行")
print("按 Ctrl+C 停止服务器")
try:
# mcp.run(transport="streamable-http") # 使用 streamable-http 传输方式
mcp.run(transport="http", host="0.0.0.0", port=5122)
except KeyboardInterrupt:
print("\n服务器已停止")
except Exception as e:
print(f"服务器启动失败: {e}")
if __name__ == "__main__":
main()
Dify配置
配置自定义MCP工具
进入Dify界面,点击进入工具,添加MCP服务

配置如下

启动上面的MCP server端,注意一定要配置IP地址,不能配置本地的127.0.0.1的IP。其余名称和参数自己配置就行,点击保存,MCP工具就配置完成了
创建agent如下

智能体编排
- 需要配置大模型,大模型必须支持工具调用
- 编写提示词
请根据用户的问题,选择合适的工具或者查询数据库回答用户的问题。
## 能力
### sql语句生成
如果用户咨询员工的基本信息,请跟据下面的mysql的schema字段,生成对应的查询语句,然后调用mysql查询的工具
"""
CREATE TABLE `emp` (
`empno` int DEFAULT NULL, --员工编号, 默认为空
`ename` varchar(50) DEFAULT NULL, --员工姓名, 默认为空
`job` varchar(50) DEFAULT NULL,--员工工作, 默认为空
`mgr` int DEFAULT NULL,--员工领导, 默认为空
`hiredate` date DEFAULT NULL,--员工入职日期, 默认为空
`sal` int DEFAULT NULL,--员工的月薪, 默认为空
`comm` int DEFAULT NULL,--员工年终奖, 默认为空
`deptno` int DEFAULT NULL,--员工部分编号, 默认为空
);
CREATE TABLE `DEPT` (
`DEPTNO` int NOT NULL, -- 部门编码, 默认为空
`DNAME` varchar(14) DEFAULT NULL,--部门名称, 默认为空
`LOC` varchar(13) DEFAULT NULL,--地点, 默认为空
PRIMARY KEY (`DEPTNO`)
);
"""
例如 “公司里员工工资最高的是谁?”
请根据上面的语句输出生成查询sql,查询应该以纯文本返回,而不是JSON。查询应该只包含MySQL支持的语法。
后端使用的mysql的版本为8.0.43,请注意生成sql语句一定要兼容mysql的版本
### 公司员工手册查询
如果用户查询员工手册的信息,例如查询“薪资福利制度”, “请假流程”等信息。
需要查询知识库,然后根据知识库检索的内容回答用户的问题
## 输出要求
请记住,如果是生成sql语句,你只能生成查询语句,如果要求生成除了查询功能以后的语句,请告诉用户“此功能无法实现。”
-
工具中增加MCP工具,找到刚刚添加的MCP工具接入

-
创建知识库选择“奥德员工手册”

实现问答效果:

现在就可以使用上面的agent完成基于mysql的问答了。