用 Python 手搓 MCP 服务:让 AI 用自然语言直连数据库,TaoToken 统一 Key 接入
1. 为什么我要自己写一个 MCP 数据库服务你可能已经习惯了把表结构复制粘贴给 AI让它帮你写 SQL然后再手动去数据库客户端里执行。这个流程在表少的时候还行一旦库里有几十张表、字段名还都是缩写AI 就开始瞎猜写出来的 SQL 不是字段名对不上就是 JOIN 关系搞错。更麻烦的是每次换一个 AI 工具就要重新配一遍 Key、重新贴一遍表结构通道和凭证散落在各个客户端里管理起来很乱。Model Context ProtocolMCP解决的正是这件事它给 AI 客户端和外部数据源之间定了一套标准协议AI 通过 JSON-RPC 调用你暴露出来的工具而不是靠猜。我这次用 Python 从零搭了一个 MCP 服务把「列出所有表」「查看字段定义」「执行只读查询」这几个能力暴露出去AI 就能用自然语言直接查库了。同时我把模型调用的 Key 统一收敛到 TaoToken 一个入口MCP 服务本身只负责数据库这一侧两边职责分开配置一次就能长期用。这篇适合谁会一点 Python、手上有 MySQL 或 SQLite、想让 AI 工具安全查库的开发者。下面从环境准备讲到配置骨架再到自然语言查询的验证步骤命令都可以直接复制。2. TaoToken 前置把模型 Key 统一收口MCP 服务负责「查库」但 AI 客户端要能理解你的自然语言、决定调用哪个工具背后仍然需要模型。如果每个客户端各配一套 Key就又回到了分散的老问题。我的做法是所有支持自定义 API 地址的客户端统一指向 TaoToken 的 API 入口用同一个 Key。TaoToken 在这里的角色是统一的模型接入层兼容常见的 OpenAI 风格接口你不需要为每个工具单独申请凭证。先到控制台创建一个 API Key控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite创建好之后客户端里填的 Base URL 用https://taotoken.net/apiKey 填刚生成的那串。如果你只是想先验证模型通不通可以直接在模型对话页面试一句模型对话https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite注意MCP 服务本身不负责模型调用它只暴露数据库工具。模型 Key 配在 AI 客户端那一侧两边不要混在一起排障时才能快速定位是哪一层的问题。如果你后续要长期跑编码类 Agent反复调用模型可以了解下 Coding Plan额度模型更适合高频场景Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite3. 可复制配置MCP 服务端骨架与 config.toml3.1 目录结构与依赖先建一个干净的项目目录我习惯这样组织mcp-db-python/ ├── server.py ├── db.py ├── config.toml ├── requirements.txt └── .envrequirements.txt里核心就两个MCP 的 Python SDK 和数据库驱动。mcp1.0.0 pymysql1.1.0 python-dotenv1.0.0安装pip install -r requirements.txt3.2 config.toml 骨架MCP 客户端读取服务的方式通常是在客户端的配置里声明一个 stdio 类型的 server。下面这份config.toml是我实际在用的骨架把命令、参数、环境变量都写清楚客户端启动时会按这个拉起 Python 进程[mcp_servers.db_python] command python args [/absolute/path/to/mcp-db-python/server.py] [mcp_servers.db_python.env] DB_TYPE mysql DB_HOST 127.0.0.1 DB_PORT 3306 DB_USER readonly_user DB_PASS your_password DB_NAME test READ_ONLY true MAX_ROWS 200几个参数值得单独说参数作用建议值DB_TYPE数据库类型mysql / sqliteREAD_ONLY是否强制只读trueMAX_ROWS单次查询返回上限100–500DB_USER数据库账号单独建只读账号注意args里的路径一定写绝对路径。MCP 客户端拉起进程时工作目录不一定是你以为的那个相对路径经常导致「找不到 server.py」。3.3 只读校验与工具注册db.py里最关键的是 SQL 白名单校验只允许 SELECT、SHOW、DESC、EXPLAIN 这类语句其他一律拒绝import re ALLOWED_PREFIX (select, show, desc, describe, explain) def is_read_only(sql: str) - bool: cleaned re.sub(r\s, , sql.strip().lower()) if not cleaned.startswith(ALLOWED_PREFIX): return False forbidden (insert, update, delete, drop, alter, truncate, grant) return not any(word in cleaned for word in forbidden)server.py里用 MCP SDK 注册工具把「列表」「看结构」「查询」三件事暴露出去import asyncio from mcp.server import Server from mcp.server.stdio import stdio_server from mcp.types import Tool, TextContent from db import list_tables, get_table_schema, run_query app Server(db-python) app.list_tools() async def list_tools(): return [ Tool(namelist_tables, description列出数据库中所有表, inputSchema{type: object, properties: {}}), Tool(nameget_table_schema, description查看指定表的字段定义, inputSchema{type: object, properties: {table: {type: string}}, required: [table]}), Tool(namerun_query, description执行只读 SQL 查询, inputSchema{type: object, properties: {sql: {type: string}}, required: [sql]}), ] app.call_tool() async def call_tool(name: str, arguments: dict): if name list_tables: return [TextContent(typetext, textstr(list_tables()))] if name get_table_schema: return [TextContent(typetext, textstr(get_table_schema(arguments[table])))] if name run_query: return [TextContent(typetext, textstr(run_query(arguments[sql])))] raise ValueError(funknown tool: {name}) async def main(): async with stdio_server() as (read, write): await app.run(read, write, app.create_initialization_options()) if __name__ __main__: asyncio.run(main())run_query内部先过is_read_only再执行并限制返回行数def run_query(sql: str): if not is_read_only(sql): return {error: 仅允许只读查询} with get_conn() as conn: with conn.cursor() as cur: cur.execute(sql) rows cur.fetchmany(MAX_ROWS) cols [d[0] for d in cur.description] return [dict(zip(cols, row)) for row in rows]4. 验证请求用自然语言查一次库配置写完后先单独跑一下服务确认能启动python server.py终端没有报错、进程挂起等待输入就说明 stdio 通道正常。接着在 AI 客户端里把上面那份config.toml的 server 配置加进去重启客户端让它加载 MCP 服务。然后直接对 AI 说一句自然语言比如帮我看看 test 库里有哪些表然后告诉我 users 表的字段结构。正常情况下AI 会先调用list_tables再调用get_table_schema把结果整理后回给你。接着再试一句带条件的查询查一下 users 表里最近注册的 10 个用户按创建时间倒序。AI 会生成类似这样的 SQL 并调用run_querySELECT * FROM users ORDER BY created_at DESC LIMIT 10;返回结果会以文本形式回到对话里。如果这一步成功了说明「自然语言 → 工具调用 → SQL → 结果」这条链路已经打通。你可以再故意让它执行一条DELETE观察服务是否返回「仅允许只读查询」以此确认安全校验生效。5. 本篇常见错排查5.1 客户端报 server 启动失败九成是路径问题。检查config.toml里args的server.py是不是绝对路径以及command用的python在当前环境里能不能找到。如果你用的是虚拟环境把command换成虚拟环境里的 python 绝对路径例如/Users/you/venv/bin/python。5.2 连不上数据库先确认数据库账号密码和端口再确认账号有没有对应库的权限。生产环境强烈建议单独建一个只读账号只授予 SELECT 权限这样即使校验逻辑有疏漏也删不掉数据。5.3 查询返回空或字段名对不上多半是表名大小写或库名没选对。MySQL 在部分系统上表名区分大小写get_table_schema返回的字段名以数据库实际为准别用 AI 猜的名字去写 SQL。遇到不确定的表先让它调list_tables。5.4 模型侧报鉴权失败这属于客户端到模型那一层和 MCP 服务无关。检查客户端里填的 Base URL 是不是https://taotoken.net/apiKey 有没有多余空格。想快速确认 Key 是否可用去模型对话页面发一句话即可模型对话https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite5.5 返回行数太多把上下文撑爆把MAX_ROWS调小或者在提示词里要求 AI 先加LIMIT。我一般把上限设在 200够日常排查用了。6. 把 Key 和通道固定下来长期用整套跑通之后你会发现真正省事的地方在于数据库这一侧的能力被固化成了 MCP 工具模型这一侧的凭证被收敛成了一个 Key。以后不管换哪个支持 MCP 的客户端只要把config.toml复制过去、Base URL 和 Key 填同一套就能直接查库不用再重新贴表结构、重新配通道。如果你要接的是编码类 Agent需要频繁调用模型可以看下 Coding Plan 的额度方式接入细节和参数说明都在文档里Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteAPI Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite最后留一个我踩过的坑别把生产库的写权限账号配进 MCP 服务哪怕校验写得再严账号权限才是最后一道闸。只读账号 只读校验 行数上限这三样配齐再让 AI 碰数据库才踏实。

相关新闻

5个h5响应式集团网站推荐实测对比评测

5个h5响应式集团网站推荐实测对比评测

5个h5响应式集团网站推荐实测对比评测 别再被那些一眼假的模板网站坑了,真的,太丑了。 我见过太多老板花了几万块,做出来的官网像2005年的,手机端更是灾难,字挤在一起,图片加载半天不动。 想换,但不知道信谁,怕再踩雷。…

2026/9/30 2:43:10 阅读更多 →
OpenClaw 小龙虾 Win11 一键部署精简实操指南(2026 新版):TaoToken 统一 Key 配置与验证

OpenClaw 小龙虾 Win11 一键部署精简实操指南(2026 新版):TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 19:24:41 阅读更多 →
VSCode插件备份新思路:用TaoToken统一管理API配置与插件清单

VSCode插件备份新思路:用TaoToken统一管理API配置与插件清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 15:27:19 阅读更多 →

最新新闻

TypeScript 类型挑战:用 GetReadonlyKeys 精准提取对象中的只读键(type-challenges 5 深度解析)

TypeScript 类型挑战:用 GetReadonlyKeys 精准提取对象中的只读键(type-challenges 5 深度解析)

示例工程 【免费下载链接】type-challenges Collection of TypeScript type challenges with online judge 项目地址: https://gitcode.com/GitHub_Trending/ty/type-challenges 点击查看 免费下载 本文以 type-challenges 仓库中编号 00005、难度为 extreme 的题目…

2026/9/30 6:56:07 阅读更多 →
tldr 别名页机制深度解析:以阿拉伯语页 `pages.ar/common/..md` 为例

tldr 别名页机制深度解析:以阿拉伯语页 `pages.ar/common/..md` 为例

文档教程知识库 【免费下载链接】tldr Collaborative cheatsheets for console commands 📚. 项目地址: https://gitcode.com/GitHub_Trending/tl/tldr 点击查看 免费下载 本文以 tldr 仓库中的阿拉伯语别名页 pages.ar/common/..md 为切入点&#xff0…

2026/9/30 6:56:07 阅读更多 →
wampee如何配置网站

wampee如何配置网站

1.Wampee-3.1.0\bin\apache\apache2.4.33\conf\extra\httpd-vhosts.conf 这里可以配多个域名&#xff0c;修改对应的端口和网站的源码指向<VirtualHost *:88>ServerAdmin webmasterdummy-host.example.comDocumentRoot "E:/Wampee-3.1.0-beta-3.5/www/zw/public&qu…

2026/9/30 6:56:07 阅读更多 →
万物演化论24(第六章) 从一套房子,看见它所依附的整个系统

万物演化论24(第六章) 从一套房子,看见它所依附的整个系统

24&#xff5c;从一套房子&#xff0c;看见它所依附的整个系统在讨论家庭资产配置时&#xff0c;我们很容易把注意力集中在具体的资产上。买房时研究户型、楼层、面积、单价和贷款利率&#xff1b;卖房时关注挂牌价、成交价、租售比和市场行情。这些信息当然重要&#xff0c;但…

2026/9/30 6:56:07 阅读更多 →
20026・北京 GEO 优化公司哪家靠谱?AI 搜索营销服务商筛选指南

20026・北京 GEO 优化公司哪家靠谱?AI 搜索营销服务商筛选指南

一、前言生成式引擎优化&#xff08;GEO&#xff09;这一概念由普林斯顿大学等机构于 2024 年的 KDD 学术会议上正式提出&#xff0c;此后在不到两年的时间里&#xff0c;从一个学术术语成长为数字营销领域增速较快的独立赛道。行业演进大致经历了三个阶段&#xff1a;2023 年至…

2026/9/30 6:56:07 阅读更多 →
人工智能对企业创新韧性的影响(2011-2024年)(全新整理)数据说明:含原始数据、处理过程dofile文件、基准回归结果有效样本:26401条

人工智能对企业创新韧性的影响(2011-2024年)(全新整理)数据说明:含原始数据、处理过程dofile文件、基准回归结果有效样本:26401条

文章目录资料下载地址介绍一、数据介绍二、数据指标三、参考文献四、数据概览项目备注资料下载地址资料下载地址 点击这里下载资料 介绍 本文基于2011-2024年上市公司数据&#xff0c;借鉴《人工智能对企业创新韧性的影响——基于技术能力适应性视角》一文中的基准回归部分&…

2026/9/30 6:55:06 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述&#xff1a;为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多&#xff0c;后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表&#xff0c;动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介&#xff1a;本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档&#xff0c;聚焦城市公共广告资源信息化管理痛点&#xff0c;提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构&#xff0c;含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求&#xff0c;背景很直接&#xff1a;公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关&#xff0c;开放给几个业务团队用。结果第一个月账单出来&#xff0c;额度直接超了 4 倍。仔细查日志&#xff0c;发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集&#xff1a;Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理&#xff1a;核心链路应该先拆哪一步分类&#xff1a;[工程技术]细分主题&#xff1a;Docker 容器化技术与镜像安全管理&#xff1a;核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用&#xff08;包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →