1. 为什么要在 1Panel 上用 MCP 打通 PostgreSQL 问数
很多团队的数据都躺在 PostgreSQL 里,但真正能随手写 SQL 的人没几个。业务同事想问「上个月华东区退货率最高的三个品类是什么」,要么等数据分析师排期,要么自己硬啃 SQL 语法。MCP(Model Context Protocol)出现之后,这件事有了新解法:把数据库包装成一个 MCP 服务,让大模型通过标准协议去调用它,模型负责把自然语言翻译成 SQL、执行、再把结果整理成人话。
我这次实操的环境是 1Panel 部署的 PostgreSQL,配合 MCP 服务做自然语言问数,模型调用统一走 TaoToken 的 Key 和 API 通道。选 TaoToken 的原因很直接:问数链路里模型调用是高频动作,如果每个环节都单独配一套 Key、单独记一个 Base URL,排障时会非常痛苦。统一通道之后,MCP 服务端、MaxKB 工作流、本地调试脚本共用同一个 Key,出问题只需要查一个地方。
这套方案适合谁?一是手里有 1Panel 面板、想快速给数据库加一层自然语言入口的运维或后端;二是用 MaxKB 这类 AI 助手平台做企业知识库、想把数据库查询也接进工作流的团队;三是单纯想研究 MCP 协议怎么和真实数据库打通的开发者。整条链路的核心是三件事:PostgreSQL 连接串要能被 MCP 服务读到、MCP 服务要能被外部访问、模型调用要有稳定的 API 通道。下面按顺序拆开讲。
需要提前说明的是,MCP 服务本身只负责「执行 SQL 并返回结果」,它不做权限隔离,也不做 SQL 审计。所以你在生产库上接 MCP 之前,强烈建议单独建一个只读账号,只授予必要的 SELECT 权限,这一点后面配置章节会给出具体命令。
2. TaoToken 前置准备:统一 Key 与 API 通道
在动手配 MCP 之前,先把模型调用这条线理清楚。MCP 服务端在把自然语言转 SQL 的时候,需要调用大模型;MaxKB 工作流在整理最终回答的时候,也要调用大模型。如果这两处分别配置不同的服务商,Key 管理会变成一团乱麻。TaoToken 在这里扮演的角色就是统一入口:一个 Key、一个 Base URL,覆盖对话模型和编码类模型。
先到官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 注册并登录,然后进入控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 创建 API Key。创建的时候建议按用途命名,比如mcp-pg-query,这样后面在多个服务里复用时不会搞混。Key 只在创建时完整显示一次,记得立刻复制保存。
拿到 Key 之后,去 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 可以随时查看和管理已有 Key。如果你打算长期跑编码类或 Agent 类任务,比如让模型自动生成复杂 SQL、多轮修正查询,可以看一下 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite,它的额度模型更适合高频调用场景。
这里有个关键点:TaoToken 的 API 地址是 https://taotoken.net/api,注意这个地址不带任何查询参数,配置的时候直接填这个就行。模型 ID 方面,问数场景建议用指令跟随能力强的对话模型,具体可用列表可以在模型对话页面 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 查看。接入细节如果拿不准,翻一下接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,里面有各语言的调用示例。
我实测下来,统一 Key 最大的好处是排障路径短。之前用多个服务商的时候,MCP 报 401 我要先猜是哪个 Key 过期了;现在只有一个 Key,401 基本就是 Key 本身的问题,或者环境变量没读到。这一点在第五节的报错排查里会体现得很明显。
另外提醒一句:不要把 Key 硬编码在 MCP 服务的启动命令里。1Panel 的 MCP 管理支持配置环境变量,把 Key 放在环境变量里,既安全又方便轮换。下面配置章节会给出具体写法。
3. 可复制配置:1Panel 创建 MCP 服务 + PostgreSQL 连接
这一节是整篇的核心,所有配置都可以直接复制。先确认你的 1Panel 是 v2.0 及以上版本,因为 MCP 管理是 2.0 才有的功能。如果还没装,用官方脚本安装:
INSTALL_MODE=beta bash -c "$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)"安装过程中注意三点:操作系统要和脚本匹配;如果首次失败先确认 Docker 环境是否正常;装完后如果是云服务器,安全组要放行 1Panel 端口和后面 MCP 服务要用的端口。
3.1 准备 PostgreSQL 只读账号
在 1Panel 的数据库管理里进入 PostgreSQL,或者直接用 psql 连上去,创建一个只读账号。假设你的库叫sales_db:
CREATE ROLE mcp_reader WITH LOGIN PASSWORD '你的强密码'; GRANT CONNECT ON DATABASE sales_db TO mcp_reader; GRANT USAGE ON SCHEMA public TO mcp_reader; GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_reader; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO mcp_reader;最后一句是为了让以后新建的表也自动带上只读权限。这一步别省,MCP 服务拿到的是完整 SQL 执行能力,只读账号是最后一道防线。
3.2 在 1Panel 创建 MCP Server
登录 1Panel,左侧菜单找到「MCP 管理」,点击「创建 MCP Server」,选择「导入 MCP Server 配置」。把下面这段 JSON 粘进去:
{ "mcpServers": { "postgres": { "command": "npx", "args": [ "-y", "@modelcontextprotocol/server-postgres", "postgresql://mcp_reader:你的强密码@127.0.0.1:5432/sales_db" ], "env": { "OPENAI_API_KEY": "你的TaoToken Key", "OPENAI_BASE_URL": "https://taotoken.net/api", "OPENAI_MODEL": "你的模型ID" } } } }导入之后 1Panel 会自动生成启动命令。这里有几个细节要盯住:连接串里的127.0.0.1如果 MCP 服务和 PostgreSQL 不在同一台机器,要换成实际 IP;端口默认 5432,如果你改过要同步改;env里的三个变量是给模型调用用的,Base URL 必须是https://taotoken.net/api,不要加斜杠后缀。
如果你用的是 Cline 或 Claude Code 这类客户端,配置格式略有不同,但三件套是一样的:Base URL、Key、Model ID。以 Claude Code 的 settings 为例:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "你的TaoToken Key", "ANTHROPIC_MODEL": "你的模型ID" } }Codex 用户则在auth.json里配置:
{ "base_url": "https://taotoken.net/api", "api_key": "你的TaoToken Key", "model": "你的模型ID" }不管哪个客户端,记住这个铁律:Base URL 填https://taotoken.net/api,Key 填 TaoToken 创建的 Key,Model ID 填模型对话页面里查到的 ID。三者缺一,调用必失败。
3.3 发布 MCP 服务并确认外部地址
配置确认后,1Panel 会生成一个外部访问地址,格式类似http://你的IP:端口/postgres。这里要确认两件事:一是 1Panel 里显示的服务状态是运行中;二是云服务器安全组放行了这个端口。我踩过的坑是安全组只开了 1Panel 面板端口,忘了开 MCP 服务端口,结果本地 curl 一直超时,排查了半天。
发布成功后,用浏览器或 curl 访问一下服务地址,能看到 SSE 相关的响应就说明服务起来了。如果返回 404,检查路径是不是漏了/postgres这一段。
4. 验证请求:从连通性测试到真实问数
配置完不验证等于没配。这一节分三步:先测 MCP 服务本身通不通,再测模型调用通不通,最后跑一个完整的自然语言问数。
4.1 连通性测试
先用 curl 测 MCP 服务的 SSE 端点:
curl -N http://你的IP:端口/postgres正常的话会看到持续输出的 SSE 事件流,类似event: endpoint这样的内容。如果卡住不动,多半是端口没通;如果立刻断开,检查 1Panel 里服务是否真的在运行。
再测模型调用通道。用 TaoToken 的 API 发一个最小请求:
curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 你的TaoToken Key" \ -d '{ "model": "你的模型ID", "messages": [{"role": "user", "content": "回复 OK 两个字母"}] }'返回里有choices字段且内容正常,说明 Key 和 Base URL 都没问题。这一步很关键,因为后面 MCP 问数失败时,你要能快速判断是模型通道的问题还是数据库的问题。
4.2 在 MaxKB 里对接 MCP 服务
进入 MaxKB,创建一个工作流,添加「MCP 服务」组件。节点配置填:
{ "postgres": { "url": "http://你的IP:端口/postgres", "transport": "sse" } }注意transport必须是sse,这是 1Panel 发布的 MCP 服务使用的传输方式。配置完保存,然后在工作流里加一个「AI 对话」节点,把 MCP 服务作为工具挂上去。
4.3 跑一个真实问数
在工作流调试窗口输入:「查询 sales_db 里订单金额最高的前 5 个客户,显示客户名和金额」。正常流程是:模型先根据数据库 schema 生成 SQL,通过 MCP 服务执行,拿到结果后再整理成自然语言返回。
如果一切正常,你会看到类似这样的返回:
根据查询结果,订单金额最高的前 5 个客户是: 1. 张三 - 128,500 元 2. 李四 - 96,300 元 ...同时在工作流执行详情里,能看到模型生成的 SQL 语句。这一步建议多试几个问题,包括带时间范围的、带聚合函数的,观察模型生成的 SQL 是否准确。如果 SQL 经常出错,可能是模型对 schema 理解不够,可以在 MCP 服务配置里加上表结构描述,或者换一个指令跟随更强的模型。
5. 常见报错排查:401、local proxy failed、reading choices
这一节列的都是我实际遇到过的报错,按出现频率排序。
401 Unauthorized。这个最常见,九成是 Key 的问题。先确认 TaoToken Key 有没有复制完整,前后有没有多余空格。然后确认环境变量名对不对,MCP 服务读的是OPENAI_API_KEY,如果你写成了API_KEY就读不到。还有一种情况是 Key 被删了或者额度用完了,去 API Keys 页面确认一下状态。
local proxy failed / connection refused。这个报错说明 MCP 服务连不上 PostgreSQL。检查连接串里的 IP、端口、库名、账号密码。如果 PostgreSQL 和 MCP 服务不在同一台机器,确认 PostgreSQL 的pg_hba.conf允许了远程连接,以及postgresql.conf里的listen_addresses不是只监听 localhost。1Panel 部署的 PostgreSQL 默认配置可能只允许本地连接,需要手动改。
reading choices 相关报错。这个通常出现在模型返回格式异常的时候,比如返回体里没有choices字段。原因可能是 Base URL 配错了,比如填成了https://taotoken.net/api/v1导致路径重复。记住 Base URL 就是https://taotoken.net/api,SDK 会自己拼/v1/chat/completions。另外确认模型 ID 拼写正确,不存在的模型 ID 也会导致返回体异常。
OAuth 相关报错。如果你用的是 Claude Code 或类似客户端,可能会遇到 OAuth 流程的报错。这类客户端有时会尝试走 OAuth 而不是 API Key,需要在配置里显式指定用 API Key 模式。Claude Code 的话,确认ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL都配了,并且没有残留的 OAuth token 文件。
MCP 服务启动后立刻退出。看 1Panel 里的服务日志,多半是npx拉包失败。确认服务器能正常访问 npm 源,或者提前把@modelcontextprotocol/server-postgres装到全局。另外 Node 版本太低也会导致启动失败,建议 Node 18 以上。
问数结果为空但 SQL 没报错。这种情况一般是权限问题,只读账号没有目标表的 SELECT 权限。用mcp_reader账号手动连上去跑一下同样的 SQL,如果报权限错误就补授权。
排查的时候有个通用思路:把链路拆成三段——模型调用、MCP 服务、数据库连接,每段单独测。模型调用用第 4.1 节的 curl;MCP 服务用 curl 测 SSE 端点;数据库连接直接用 psql 测。哪段断了就修哪段,不要混在一起猜。
6. 把问数链路接进日常工作流
配置跑通只是开始,真正有价值的是把它接进日常。我现在的做法是:在 MaxKB 里建一个「数据问答」应用,把 MCP 服务挂上去,业务同事直接在对话窗口问数,不用登录数据库也不用写 SQL。对于需要定期跑的查询,比如每周销售汇总,可以做成工作流定时触发,结果推送到群里。
模型调用这块,因为统一走了 TaoToken 的通道,我可以在控制台看到所有调用的用量和日志。如果某天问数突然变慢,先看是不是模型调用延迟高了,再看是不是数据库查询慢了,定位很快。长期跑下来,如果调用量上来了,Coding Plan 的额度模型会比按量付费更划算,这个可以根据自己的用量算一下。
最后留一个实用技巧:在 MCP 服务的配置里,可以给模型加一段系统提示,明确告诉它「只生成 SELECT 语句,禁止生成任何写操作」。虽然只读账号已经挡住了写操作,但多一层提示能减少模型生成无效 SQL 的概率,问数体验会顺很多。这段提示可以直接写在 MaxKB 工作流的 AI 节点里,不用改 MCP 服务本身。