大模型系列——通过 MCP 服务对接 PostgreSQL 取数:TaoToken 统一 Key 通道配置实录
1. 为什么我要把 PostgreSQL 取数接到 MCP 上先说清楚这篇在解决什么问题。你手里有一个 PostgreSQL 库业务同事天天问「上个月华东区退款率多少」「哪个 SKU 复购最高」你不想每次都手写 SQL 再截图发群。MCPModel Context Protocol就是干这个的它把数据库能力包装成一个大模型可以调用的工具模型负责把你的自然语言翻译成 SQLMCP 服务负责真正连库、执行、把结果回传最后模型再把结果整理成人话。适合谁看已经有一台能跑 Node 的机器、有 PostgreSQL 连接串、想让大模型直接查库但不想把库账号密码散落在各个客户端的后端同学。也适合正在做企业 AI 助手、想把「问数」能力塞进工作流的同学。整条链路我拆成三段TaoToken 提供统一 Key 和 API 通道模型侧入口MCP 客户端负责声明 PostgreSQL 数据源工具侧入口PostgreSQL 本体只暴露一个只读账号。三段各管各的任何一段出问题都能单独定位。这里有个关键认知MCP 不是数据库驱动它是一层协议适配。真正执行 SQL 的还是modelcontextprotocol/server-postgres这个官方 server它内部用pg库连库。所以你的连接串格式、权限、网络可达性跟平时写 Node 脚本连 PG 是一模一样的没有魔法。我踩过的坑是一开始以为 MCP 会自动帮我做权限隔离结果它默认拿你给的连接串权限跑任何 SQL。所以下面第 3 节我会专门讲只读账号怎么建这一步不做后面全是隐患。2. TaoToken 统一 Key 通道的前置准备模型侧我不建议每个客户端各配一套 Key。你有 Cline、有 Claude Code、有自己写的小脚本如果每家都单独申请、单独轮换管理成本会爆炸。TaoToken 的价值就在这一个 Base URL 加一个 Key所有兼容 OpenAI 协议或 Anthropic 协议的客户端都能复用。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 根地址是 https://taotoken.net/api 这个不加 UTM直接填进配置里。你需要准备三样东西第一一个 API Key。去控制台创建地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建完立刻复制页面刷新后就看不全了。Key 的管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。第二确认你要用哪个模型。MCP 场景下模型的核心能力是「把自然语言转成合法 SQL」和「读懂表结构」。模型列表和在线试跑在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 建议先在模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 里手动喂一段建表语句看它生成的 SQL 靠不靠谱再决定用哪个。第三如果你打算长期跑编码或 Agent 类任务Coding Plan 页面在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 适合高频调用场景比按次计费省心。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面写了不同客户端的填法。Claude Code 相关的说明在 https://taotoken.net/claudecode?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。这里要强调一个概念Base URL 和 Key 是「模型通道」PostgreSQL 连接串是「数据通道」两者完全独立。很多人第一次配会混淆以为 TaoToken 的 Key 能直接连库不是的。TaoToken 只管模型调用库还是你自己的库。3. 可复制的 MCP 配置片段与只读账号这一节是全文最该抄的部分。先建只读账号再写 MCP 配置。3.1 建一个只读 PostgreSQL 账号用超级用户登录你的库执行CREATE ROLE mcp_reader WITH LOGIN PASSWORD 换成你的强密码; GRANT CONNECT ON DATABASE your_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;最后一句很关键它保证以后新建的表也自动给只读权限不然你每加一张表都要手动授权。如果你有多个 schema把public换成对应 schema 重复执行。连接串长这样postgresql://mcp_reader:你的密码127.0.0.1:5432/your_db注意密码里如果有、:、/这些字符要做 URL 编码否则连接串会被解析错。这是最常见的低级错误。3.2 MCP 客户端配置片段以通用的mcpServersJSON 结构为例Cline、Claude Desktop 这类客户端都认这个格式{ mcpServers: { postgres: { command: npx, args: [ -y, modelcontextprotocol/server-postgres, postgresql://mcp_reader:你的密码127.0.0.1:5432/your_db ] } } }如果你用的是 Cline 的 MCP 配置界面路径通常在客户端的 MCP 设置里粘贴上面这段即可。Codex 用户如果走auth.json那套模型侧的 Key 写在auth.jsonMCP 的 server 声明写在单独的 MCP 配置文件里两者不要混在一个文件。模型侧的三件套Base URL Key Model ID在客户端里这样填{ baseUrl: https://taotoken.net/api, apiKey: sk-你的TaoToken密钥, model: 你在模型列表里选定的模型ID }三件套缺一不可。Base URL 结尾不要多加/v1具体以接入文档为准不同客户端对路径拼接的处理不一样填错就是 404。3.3 用 SSE 方式暴露给工作流如果你像我一样用 1Panel 或类似面板把 MCP 服务发布成 HTTP 服务配置会变成 URL 形式{ postgres: { url: http://你的服务器IP:端口/postgres, transport: sse } }transport写sse还是stdio取决于你的部署方式。本地npx起的是 stdio面板发布出来的是 sse。写错会直接连不上报 transport 不匹配。4. 三步验证连通性、表结构、查询回显配完不要急着问业务问题按这三步走每步都能独立确认。4.1 第一步连通性检查先在服务器上手动跑一次 server确认它能连上库npx -y modelcontextprotocol/server-postgres postgresql://mcp_reader:你的密码127.0.0.1:5432/your_db如果连接串有问题这里会直接报ECONNREFUSED或password authentication failed。这一步过了说明网络和账号没问题再往客户端里配。4.2 第二步表结构读取在 MCP 客户端里发一句列出当前数据库 public schema 下所有表名和字段正常情况模型会调用 MCP 的 schema 读取能力返回表清单。如果返回空或者报权限错误回去检查GRANT USAGE ON SCHEMA和GRANT SELECT是否执行了。4.3 第三步查询结果回显发一句真实取数统计 orders 表里最近 30 天每个城市的订单量按订单量降序取前 10预期链路是模型生成 SQL → MCP server 执行 → 结果回传 → 模型整理成表格。你可以在客户端日志里看到实际执行的 SQL这一步很重要能确认模型没有瞎编字段名。如果结果为空但 SQL 看起来对多半是时区或日期字段类型问题created_at是timestamptz还是timestamp会影响now() - interval 30 days的比较结果。5. 常见报错排查对照这一节按真实报错来遇到对号入座。401 Unauthorized模型侧 Key 错了或过期。检查apiKey是否完整复制有没有多余空格。TaoToken 的 Key 在控制台重新生成后旧 Key 立即失效如果你在多个客户端用了同一个 Key重新生成后所有地方都要更新。local proxy failed / connection refusedMCP server 没起来或者端口没通。本地 stdio 模式看npx是否卡在下载sse 模式看服务器安全组端口是否放行云服务器默认只开 22 和 80你发布的自定义端口要手动加规则。Error reading choices / 返回结构解析失败模型返回的格式客户端不认通常是 Base URL 填错导致请求打到了非兼容端点。确认填的是https://taotoken.net/api不要自己拼/v1/chat/completions。OAuth 相关报错某些客户端默认走 OAuth 流程但 TaoToken 走的是 API Key 模式。在客户端设置里把认证方式切成 API Key别选 OAuth。permission denied for table xxx只读账号没拿到新表的权限。执行第 3.1 节最后那句ALTER DEFAULT PRIVILEGES或者手动GRANT SELECT补上。password authentication failed密码里有特殊字符没编码或者pg_hba.conf里127.0.0.1这行认证方式不是md5/scram-sha-256。本地连建议用127.0.0.1而不是localhost避免走 socket 认证。transport mismatch配置里写sse但实际是 stdio或反过来。看你的 server 是怎么起的npx命令就是 stdioHTTP URL 就是 sse。排查顺序建议先手动跑 server 确认库通再确认模型 Key 通最后才怀疑客户端配置。三段分开测比一股脑改配置快得多。6. 把这条链路用起来配通之后你可以把 MCP 服务挂到工作流里让非技术同事直接问数。模型生成 SQL、MCP 执行、结果回显这条链路跑顺了日常取数就不用再找人写脚本。模型侧统一走 TaoToken 的 Key 通道换模型只改 Model IDBase URL 和 Key 不动。数据侧只读账号兜底最坏情况也就是被人问出一堆数据改不了删不了。如果你要长期跑 Agent 类取数任务Coding Plan 那条通道更适合高频调用只是偶尔验证模型生成的 SQL 对不对用模型对话页手动试就行。接入细节以官方文档为准配置片段直接抄第 3 节报错对照第 5 节。