
1. 为什么要在 dify 里接入 MCP 数据库服务如果你正在用 dify 搭智能体大概率遇到过这个尴尬智能体聊得头头是道但你让它「查一下 orders 表里今天有多少笔待发货」它只能礼貌地告诉你「我无法直接访问数据库」。原因很简单dify 自带的工具生态里数据库操作要么靠 HTTP 请求节点手搓 SQL 接口要么靠代码节点自己写连接逻辑前者不安全后者难维护。MCPModel Context Protocol解决的正是这件事。你可以把它理解成「给大模型用的 USB 接口」数据库这边跑一个 MCP Server把「列出表结构」「执行查询」「写入数据」这些能力标准化成工具dify 这边通过 MCP 客户端插件去发现并调用这些工具。智能体不需要知道你的数据库密码也不需要你为每张表写一个 API它只需要按 MCP 协议发请求就行。这篇要落地的场景很具体用 bytebase 的 dbhub 作为 MCP 数据库服务端支持 PostgreSQL、MySQL、SQLite、Oracle 等多种数据库通过 SSE 传输方式暴露出来然后在 dify 里注册成工具最后让智能体完成一次真实的查询和写入。适合谁适合已经会用 dify 搭工作流、手里有测试库、想让智能体真正「动手」而不是「动嘴」的开发者。整个过程我会把配置片段、连接参数、权限校验和踩坑点都写清楚你照着做基本能跑通。需要提前说明的是MCP 服务端和 dify 之间的网络链路要通如果你把 dbhub 跑在本地dify 又部署在云服务器上那 dify 是访问不到localhost:8080的这一点后面排障章节会专门讲。2. 前置准备dbhub 服务端与 TaoToken 接入配置在动手接 dify 之前先把 MCP 服务端跑起来。dbhub 官方推荐 Docker 部署这也是最省事的方式。我试过直接二进制跑依赖和权限问题比较多Docker 一条命令就干净了。先拉镜像并启动一个 PostgreSQL 示例。注意 DSN 里的密码不要带符号这是 dbhub 解析连接串时的一个已知坑密码里有会导致服务启动失败或者连不上库docker run --rm --init \ --name dbhub \ --publish 8080:8080 \ bytebase/dbhub \ --transport sse \ --port 8080 \ --dsn postgres://appuser:AppPass123192.168.1.20:5432/appdb?sslmodedisable如果你只是想先验证链路不想连真实库可以用 demo 模式它自带一个员工示例库docker run --rm --init \ --name dbhub \ --publish 8080:8080 \ bytebase/dbhub \ --transport sse \ --port 8080 \ --demo启动成功后访问http://你的IP:8080/sse应该能看到 SSE 流保持连接的状态。这里有个细节--transport sse是必须的dify 的 MCP 插件目前主要走 SSE 或 streamable HTTP如果你不加这个参数默认可能是 stdiodify 根本连不上。接下来是模型侧。dify 里的智能体要调用工具底层还是得有个能理解工具调用的大模型。如果你用的是 Claude Code 或者 Cline 这类编码工具做联调需要把 Base URL、Key、Model ID 三件套配全。以 TaoToken 为例它的 API 地址是https://taotoken.net/api你可以在控制台生成 Key然后在客户端里这样配{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: claude-sonnet-4-20250514 }如果你用的是 Claude Code配置文件通常在~/.claude/settings.json或者项目级的.claude/settings.json写法类似{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key } }模型 ID 要根据你实际订阅的模型来填不要照抄。配好之后先用模型对话验证一下 Key 是否有效再去接 dify这样能把「模型不通」和「MCP 不通」两类问题分开排查。TaoToken 的接入文档里有各客户端的详细配置示例地址是https://taotoken.net/doc遇到 401 先看这里。3. dify 工具注册MCP 插件配置与可复制片段dify 接入 MCP 的前提是版本大于 1.0.0低于这个版本市场里搜不到 MCP 相关插件。先去「工具」里搜索 MCP找到官方或社区维护的 MCP 客户端插件。我实测在线安装经常卡住或者失败建议下载插件包后本地安装成功率更高。安装完成后进入插件配置页核心就是填 MCP 服务端的 URL。这里要注意填的是 SSE 端点不是根地址{ server_url: http://192.168.1.20:8080/sse, transport: sse, timeout: 30 }如果你用的是 streamable HTTP 模式URL 可能是http://192.168.1.20:8080/mcp具体看 dbhub 启动日志里打印的监听路径。配置保存后dify 会去拉取工具列表正常情况下你能看到list_tables、describe_table、execute_sql这类工具。这里有个权限校验的关键点dbhub 本身不做细粒度权限控制它用的是你 DSN 里那个数据库账号的权限。所以千万不要用 root 或者超级用户去连生产库。正确做法是单独建一个只读账号给查询类智能体写入类操作再单独建一个受限账号只授权特定表的 INSERT/UPDATE。比如 PostgreSQL 里可以这样CREATE USER agent_ro WITH PASSWORD RoPass456; GRANT CONNECT ON DATABASE appdb TO agent_ro; GRANT USAGE ON SCHEMA public TO agent_ro; GRANT SELECT ON ALL TABLES IN SCHEMA public TO agent_ro; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO agent_ro;这样即使智能体被诱导执行了DROP TABLE数据库层也会直接拒绝。MCP 是能力通道权限边界必须在数据库侧兜底这一点别偷懒。配置保存后建议先在插件页点「测试」或者手动触发一次工具列表拉取确认能拿到工具再往下走。如果这一步就报local proxy failed或者连接超时先别急着建智能体回到排障章节看网络问题。4. 验证请求让智能体完成一次查询与写入工具注册好之后建一个 Agent 应用在工具列表里勾选刚才配置的 MCP 工具。然后给它一段系统提示词明确它的职责边界比如你是一个数据库助手只能通过提供的 MCP 工具操作数据库。查询前先调用 list_tables 确认表名不要臆造表结构。禁止执行 DDL 语句。先测查询。输入「帮我看看 employees 表里有多少条记录」观察智能体的调用链它应该先调list_tables或者describe_table再调execute_sql执行SELECT COUNT(*) FROM employees。如果它直接编了一个数字给你说明工具没被正确调用回去检查插件是否启用、模型是否支持 function calling。再测写入。这里我用 demo 库举例输入「往 employees 表插入一条记录name 是 test_userdepartment 是 QA」。智能体会生成类似这样的 SQLINSERT INTO employees (name, department) VALUES (test_user, QA);执行后你回到数据库里SELECT * FROM employees WHERE name test_user能看到这条记录就说明写入链路通了。如果报权限错误说明你用的账号没有 INSERT 权限这是预期行为正好验证了权限隔离生效。写入验证通过后建议再做一次「越权测试」让智能体执行DROP TABLE employees看它是否被拒绝。如果数据库账号是只读的这里会返回权限错误如果智能体自己拒绝了说明提示词起了作用。两种都算合格但如果它真的把表删了那你的权限配置就有大问题赶紧回滚。5. 常见报错排查401、local proxy failed 与 OAuth 问题接入过程中最容易卡住的几个报错我按出现频率排一下。401 Unauthorized这个通常不是 MCP 的问题而是模型侧的 Key 无效或过期。检查你 dify 里配置的模型供应商 Key以及如果你用 TaoToken 做中转确认ANTHROPIC_API_KEY或对应的 Key 没有拼错。401 出现时智能体连工具都调不了因为请求根本没发出去。local proxy failed / connection refuseddify 连不上 dbhub。九成是网络问题。如果你 dify 跑在 Docker 里dbhub 跑在宿主机那 dify 容器里的localhost指的是容器自己不是宿主机。要么把 dbhub 也放进同一个 Docker 网络用服务名互访要么用宿主机的局域网 IP。用curl http://dbhub:8080/sse在 dify 容器里测一下最直接。reading choices 相关报错这类错误一般出现在模型返回格式不符合预期时比如模型不支持 tool calling 却硬要走工具调用流程。换一个明确支持 function calling 的模型或者在 dify 里把工具调用模式调成「自动」。OAuth 报错部分 MCP 服务端要求 OAuth 鉴权dbhub 默认不需要但如果你接的是别的 MCP Server可能会遇到。这时候要在插件配置里填 client_id、client_secret 和 token URL。dbhub 场景下如果出现 OAuth 字样先确认你连的 URL 是不是被别的服务占用了。工具列表为空插件配置保存了但拉不到工具。检查 URL 是不是 SSE 端点dbhub 启动时有没有加--transport sse以及防火墙有没有放行 8080 端口。排查顺序建议是先curl测 MCP 端点通不通再在 dify 插件页测工具拉取最后才建智能体测调用。一层一层来别跳步。6. 多 MCP 服务管理与长期使用建议当你只有一个数据库时上面这套够用了。但实际项目里往往有多个库、多个环境甚至还有别的 MCP 服务比如文件系统、GitHub。这时候如果每加一个服务就改一次插件配置会很痛苦。dify 市场里还有一个 Agent 插件配合工作流使用可以动态选择 MCP 服务。做法是在工作流里加一个 Agent 节点把多个 MCP 工具都挂上去让 Agent 根据用户意图自己选。这样你不需要为每个库建一个独立应用维护成本低很多。长期使用有几个建议。第一给每个 MCP 服务单独建数据库账号只读和可写分开别图省事共用一个。第二dbhub 的 DSN 里加上sslmoderequire如果数据库支持避免明文传输。第三定期看 dbhub 的日志异常 SQL 会打出来这是发现智能体「乱来」的最快途径。第四如果你要把这套用到生产建议在 dify 和 dbhub 之间加一层网关做审计记录每次工具调用的入参和结果。如果你还在选模型或者需要长期跑编码类 Agent可以看看 TaoToken 的 Coding Plan它针对高频调用场景做了优化地址是https://taotoken.net/coding-plan。模型对话验证在https://taotoken.net/chatAPI Key 在https://taotoken.net/api-keys管理。接入文档在https://taotoken.net/doc遇到配置问题先翻文档大部分报错都有对应说明。