
1. 从导出建表语句到让 AI 自己查库数据库 MCP 到底解决什么问题如果你用 opencode 或 claude code 写过带数据库的业务代码大概率经历过这套流程先把表结构从数据库客户端导出成 SQL 文件粘贴给模型模型生成一段查询或修改语句你再复制回数据库客户端跑一遍发现字段名错了或者类型不匹配又得把报错贴回去重来。一轮下来人成了模型和数据库之间的搬运工。数据库 MCP 服务要解决的就是这个搬运环节。MCP 全称 Model Context Protocol你可以把它理解成给 AI 编程工具装的一个外接插头插上数据库之后模型能自己列出有哪些表、每张表什么字段、索引怎么建的也能自己执行 SELECT 验证刚写的 SQL 对不对。它不再是猜你的数据结构而是真的去读。这篇聚焦的场景很具体在 opencode 和 claude code 两个工具里通过 MCP 连上同一个数据库服务并且用 TaoToken 的统一 Key 把模型调用也收口到一处避免每个工具各配一套 Key、各写一份配置。适合已经在用 AI 写后端代码、手上有 PostgreSQL 或 MySQL、想让模型直接读库的开发者。下面会给可复制的 settings.json 和 config.toml 骨架、统一 Key 的接入步骤以及连通性验证动作。先说清楚边界MCP 连的是你自己的数据库建议用只读账号或测试库别把生产库的写权限直接开给模型。这一点后面排障章节还会再强调。2. TaoToken 统一 Key 前置一次配置多端复用的接入准备多工具并用最烦的就是 Key 分散。claude code 一套、opencode 一套换个模型又要重新找 Key配置散落在不同文件里时间一长自己都记不清哪个 Key 对应哪个工具。TaoToken 在这里的作用是把模型调用的入口统一你只维护一个 Keyopencode 和 claude code 都指向同一个 Base URL模型 ID 按需切换。先拿 Key。打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册登录后进控制台在 API Keys 页面创建一个新 Key。创建时建议按用途命名比如opencode-db-mcp方便以后区分。Key 只在创建时完整显示一次复制下来存到密码管理器里。拿到 Key 之后你需要记住三个东西后面两个工具的配置都围绕它们展开配置项值说明Base URLhttps://taotoken.net/api两个工具共用注意不带末尾斜杠API Key你创建的那串统一入口多端复用Model ID按需选择比如 claude 系列或其它可用模型这里有个容易踩的点Base URL 是https://taotoken.net/api不是官网首页地址。有些工具会在你填的地址后面自动拼/v1/messages或/v1/chat/completions所以填的时候不要自己再加/v1否则会拼成/api/v1/v1/...直接 404。如果你更习惯用命令行管理 Key也可以走 API Keys 页面 https://taotoken.net/api-keys 直接操作。接入文档在 https://taotoken.net/doc 里面有各工具的详细字段说明配置卡住的时候对着文档核对字段名最快。准备工作做完你手上应该有一个 TaoToken Key、Base URL、想用的 Model ID以及一个能连的数据库本地 Docker 起的也行。接下来分两个工具写配置。3. 可复制配置opencode 的 config.toml 与 claude code 的 settings.json 骨架这一节是全文的核心两个工具的配置文件都给完整骨架你改掉 Key 和数据库连接就能用。先说数据库 MCP 服务本身怎么起再说两个工具怎么接。数据库 MCP 我用的是 dbhub它支持 PostgreSQL、MySQL 等用 Docker 起最省事。下面这份 docker-compose 可以直接复制把 DSN 换成你自己的连接串services: dbhub: image: bytebase/dbhub:latest container_name: dbhub ports: - 8080:8080 environment: - DBHUB_LOG_LEVELinfo command: - --transport - http - --port - 8080 - --dsn - postgres://user:passwordhost.docker.internal:5432/dbname restart: unless-stopped--dsn那行按你的数据库改。连宿主机上的 MySQL 可以写成mysql://root:123456host.docker.internal:3306/yourdb。host.docker.internal是容器访问宿主机的地址Mac 和 Windows 的 Docker Desktop 都支持。起服务docker compose up -d docker compose logs -f dbhub日志里出现监听 8080 的提示就说明 MCP 服务起来了MCP 端点是http://localhost:8080/mcp。3.1 opencode 的 config.toml 骨架opencode 的配置放在~/.config/opencode/config.tomlWindows 在%USERPROFILE%\.config\opencode\config.toml。下面这份骨架同时配了模型 provider 和 MCP 服务model taotoken/claude-sonnet-4-5 [provider.taotoken] name TaoToken baseURL https://taotoken.net/api apiKey sk-你的TaoTokenKey [mcp.dbhub] type remote url http://localhost:8080/mcp enabled truemodel那行的格式是provider名/模型IDprovider 名要和下面[provider.taotoken]对应。apiKey填你从控制台拿到的 Key。MCP 段用type remote表示走 HTTP 传输url指向 dbhub 的 MCP 端点。如果你不想手写opencode 也支持交互式添加运行opencode mcp add按提示输入名称、类型、URL最后问是否需要授权验证时选不需要本地服务没有鉴权。加完用opencode mcp ls确认列表里有 dbhub。3.2 claude code 的 settings.json 骨架claude code 的 MCP 配置可以走命令行也可以写进 settings。命令行方式最直接claude mcp add --transport http dbhub http://localhost:8080/mcp模型侧的 Key 通过环境变量注入写进~/.claude/settings.json{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoTokenKey, ANTHROPIC_MODEL: claude-sonnet-4-5 } }注意 claude code 读的是ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY这两个变量名别写成别的。ANTHROPIC_MODEL按你实际要用的模型 ID 填。改完 settings.json 要重启 claude code 才生效。两个工具配完你其实只维护了一个 TaoToken Keyopencode 和 claude code 都指向同一个 Base URL模型 ID 各自按需调整。这就是一次配置多端复用的实际形态。4. 验证请求从 MCP 列表到让模型真的查一次库配置写完不代表通了得一步步验证。顺序是先确认 MCP 服务活着再确认工具认到了 MCP最后让模型实际查一次库。第一步直接打 MCP 端点看响应curl -i http://localhost:8080/mcp能返回 HTTP 响应哪怕是 400 或 405说明服务在监听就比连接被拒强。如果 curl 直接报Connection refused那是 dbhub 没起来回去看docker compose logs。第二步在 opencode 里确认 MCP 已加载opencode mcp ls列表里应该能看到 dbhub状态是 connected 或 enabled。如果显示未连接检查 config.toml 里的 url 和 dbhub 端口是否一致。第三步进 opencode 交互界面直接问一句让它列库里的表比如列出当前数据库所有的表名。模型会通过 MCP 调 dbhub 的 list tables 能力返回真实表名。这一步成功说明整条链路通了opencode → TaoToken → 模型 → MCP → dbhub → 数据库。claude code 侧验证类似启动后输入/mcp查看已连接的 MCP 服务应该能看到 dbhub。然后同样问一句列表明细。实测下来链路通了之后最爽的场景是你让模型查一下 orders 表里最近 7 天的订单数按状态分组它会自己先读表结构确认字段名再写 SQL再通过 MCP 执行拿到结果直接给你。字段名不对它会自己看结构改不用你来回贴报错。这就是开头说的AI 自己迭代。如果你还想在网页端直接和模型对话验证 Key 是否可用可以走模型对话入口 https://taotoken.net/model-chat 不用装任何工具就能测 Key 和模型 ID 对不对。5. 本篇常见错排查401、local proxy failed、reading choices 与 OAuth 报错配置阶段最容易撞的几类报错这里逐个对照。401 Unauthorized。两种可能TaoToken Key 填错或过期或者 Key 没带上。先检查 config.toml 的apiKey和 settings.json 的ANTHROPIC_API_KEY是不是完整复制了有没有多余空格。如果 Key 确认没问题还报 401去控制台看这个 Key 是否被禁用或额度用尽。重新生成一个 Key 换上最快。local proxy failed / connection refused。这类多半是 MCP 服务没起来或者端口对不上。先docker ps看 dbhub 容器在不在再docker compose logs dbhub看有没有启动报错。DSN 写错会导致 dbhub 起来但连不上数据库日志里会有连接失败提示。另外注意localhost在容器语境里指容器自己连宿主机数据库要用host.docker.internal。reading choices / unexpected response。这个通常出现在模型侧说明返回体格式和工具预期的不一致。常见原因是 Base URL 多写了/v1导致请求打到了错误路径。确认 Base URL 就是https://taotoken.net/api不要自己拼/v1/messages。如果模型 ID 写错也可能返回非预期结构核对 Model ID 拼写。OAuth 相关报错。opencode 添加 MCP 时会问是否需要授权验证本地 dbhub 没有鉴权选不需要。如果你误选了需要授权它会尝试走 OAuth 流程然后失败。删掉重新opencode mcp add一遍授权那步选否。claude code 用claude mcp remove dbhub再重新 add。MCP 连上了但模型不调用。有时候工具列表里有 dbhub但模型回答时不去查库。这通常是提示词没引导到位明确说用数据库工具查一下或者先看表结构再写 SQL模型就会走 MCP。另外确认 MCP 的 enabled 是 true。排障时如果怀疑是 Key 或接入配置的问题对照接入文档 https://taotoken.net/doc 逐字段核对比盲猜快得多。需要重新生成 Key 就去 API Keys 页面 https://taotoken.net/api-keys 。6. 长期编码与 Agent 场景把统一 Key 和 MCP 固定成工作流单次配置通了只是开始真正省时间的是把它固定成日常流程。如果你经常用 opencode 或 claude code 跑长任务、写后端、做数据相关的迭代可以考虑把模型调用走 Coding Plan配合 MCP 数据库服务让模型在一个会话里连续读结构、写 SQL、验证结果中间不用你插手。Coding Plan 入口在 https://taotoken.net/coding-plan 适合长期编码和 Agent 类任务。配置方式和前面一样还是那三件套Base URL 用https://taotoken.net/apiKey 用你创建的Model ID 按套餐里可用的填。opencode 的 config.toml 和 claude code 的 settings.json 结构不变只改 model 字段。几个实用习惯供参考。数据库 MCP 一定用只读账号或者指向测试库别给写权限模型执行 DROP 或 UPDATE 是没有二次确认的。DSN 里的密码别硬编码进提交到 git 的 compose 文件用.env或环境变量注入。opencode 和 claude code 的配置文件建议各留一份注释版备份换机器时直接改 Key 就能用。还有一个细节dbhub 的--dsn支持多个数据库吗默认一个实例连一个库。如果你要同时连 PostgreSQL 和 MySQL起两个 dbhub 容器端口错开比如 8080 和 8081然后在两个工具里各加一个 MCP 条目命名区分开比如dbhub-pg和dbhub-mysql。模型会根据你的提问选择对应的库去查。最后回到统一 Key 的价值你只在一个地方管 Keyopencode、claude code、网页对话全指向同一个 Base URL换模型只改 Model ID不用满世界找配置。数据库 MCP 则把人肉搬运表结构和 SQL这件事彻底去掉。两件事叠在一起AI 写数据库相关代码的体验会顺很多。