从0写一个 MCP 服务器:用 Node/TS 把 SQL Server 里的 ERP 数据变成 AI 助手能查的工具(TaoToken 统一 Key 接入版)
1. 为什么要把 ERP 数据接给 AI 助手很多做电商或制造业的朋友都遇到过这个场景ERP 系统里躺着商品、订单、成本、库存这些核心数据但 AI 助手完全碰不到。你问它上个月利润最高的 10 个 SKU 是哪些它只能干瞪眼因为它既不会连 SQL Server你也不该直接把数据库账号密码丢给它。MCPModel Context Protocol模型上下文协议就是解决这个断层的东西。它让你把查数据库这件事封装成一个受控的工具ToolAI 助手负责决定什么时候调用、传什么参数你的服务端负责真正执行 SQL 并返回结果。边界清晰权限可控。这篇我会用一个电商 ERP 场景从零用 Node/TS 写一个 MCP 服务器把 SQL Server 里的商品表、订单表、成本利润表暴露成 AI 能调用的工具再通过 TaoToken 统一 Key 接入模型通道。全程可复制跟着敲就能跑起来。适合谁看有 Node/TS 基础、手上有 SQL Server 数据、想让 Claude 或 Codex 直接查业务库的后端同学。不需要你懂 MCP 协议细节我会把关键机制讲清楚。2. TaoToken 前置准备统一 Key 与接入通道在写服务端之前先把模型通道准备好。MCP 服务器本身只负责提供工具真正调用工具的是 AI 客户端Claude Desktop、Codex CLI 等。这些客户端要连大模型就需要一个稳定的 API 通道。TaoToken 在这里的角色是统一 Key 和 API 通道你注册后拿到一个 Key就能在多个模型客户端里复用不用每个客户端单独配一套。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。具体操作分三步第一步登录控制台创建 API Key。地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在 API Keys 页面点新建复制生成的 Key形如 sk-xxxx这个 Key 只显示一次存好。第二步如果你要长期跑编码或 Agent 任务建议看下 Coding Plan地址 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它针对高频调用做了额度优化比按次计费划算。第三步验证模型通道是否通。可以直接在模型对话页测试地址 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 选一个模型发一句话能正常回复说明 Key 和通道都没问题。注意MCP 服务器和模型通道是两件事。MCP 服务器跑在你本地或内网负责连 SQL Server模型通道负责 AI 的推理。两者通过 AI 客户端串起来别搞混。3. 从零搭 MCP 服务器环境、依赖与 SQL Server 连接3.1 环境准备你需要 Node.js 18 以上建议 22一台能连通的 SQL Server示例用your-server-ip,1433库名demo_db以及一个支持 MCP 的客户端。下面所有库名、表名、IP 都是示意替换成你自己的。3.2 项目初始化mkdir erp-mcp cd erp-mcp npm init -y npm install modelcontextprotocol/sdk mssql zod npm install -D tsx typescript types/node types/mssqltsx让我们直接跑 TypeScript省掉编译步骤调试期很省事。3.3 连接 SQL Server用mssql底层是 tedious 驱动封装一个带连接池的配置。新建src/db.tsimport sql from mssql; export const sqlConfig: sql.config { user: process.env.ERP_SA || sa, password: process.env.ERP_PWD || your_strong_password, server: your-server-ip, port: 1433, database: demo_db, options: { encrypt: false, trustServerCertificate: true, }, pool: { max: 10, min: 0, idleTimeoutMillis: 30000, }, }; export async function getPool() { return sql.connect(sqlConfig); }密码走环境变量ERP_PWD别硬编码进仓库。生产环境务必给 MCP 单独建一个只读账号只授予SELECT权限。3.4 定义三个业务工具新建src/index.ts注册三个工具查商品、查订单、按 SKU 汇总成本利润。import { McpServer } from modelcontextprotocol/sdk/server/mcp.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; import { z } from zod; import { getPool } from ./db.js; import sql from mssql; const server new McpServer({ name: erp-mcp, version: 1.0.0 }); // 工具1按关键词/分类查商品 server.tool( query_products, 按关键词或分类查询 ERP 商品表(tb_products), { keyword: z.string().optional().describe(商品名模糊匹配), category: z.string().optional().describe(商品分类), }, async ({ keyword, category }) { const pool await getPool(); const req pool.request(); let sqlText SELECT TOP 50 ProductId, ProductName, Sku, Price, Category FROM tb_products WHERE 11; if (keyword) { req.input(kw, sql.NVarChar, %${keyword}%); sqlText AND ProductName LIKE kw; } if (category) { req.input(cat, sql.NVarChar, category); sqlText AND Category cat; } const r await req.query(sqlText); return { content: [{ type: text, text: JSON.stringify(r.recordset, null, 2) }], }; } ); // 工具2查指定日期范围的订单 server.tool( query_orders, 查询指定日期范围内的订单(tb_orders), { start: z.string().describe(起始日期 YYYY-MM-DD), end: z.string().describe(结束日期 YYYY-MM-DD), }, async ({ start, end }) { const pool await getPool(); const req pool.request(); req.input(s, sql.Date, start); req.input(e, sql.Date, end); const r await req.query( SELECT OrderId, ProductId, Qty, Amount, Status FROM tb_orders WHERE CreateAt BETWEEN s AND e ); return { content: [{ type: text, text: JSON.stringify(r.recordset, null, 2) }], }; } ); // 工具3按 SKU 汇总某月成本与利润 server.tool( profit_summary, 按 SKU 汇总某月成本与利润, { month: z.string().describe(月份 YYYY-MM), }, async ({ month }) { const pool await getPool(); const req pool.request(); req.input(m, sql.NVarChar, ${month}%); const r await req.query( SELECT ProductId, SUM(Amount) AS Revenue, SUM(Cost) AS Cost, SUM(Amount - Cost) AS Profit FROM tb_orders WHERE CreateAt LIKE m GROUP BY ProductId ORDER BY Profit DESC ); return { content: [{ type: text, text: JSON.stringify(r.recordset, null, 2) }], }; } ); const transport new StdioServerTransport(); await server.connect(transport); console.error(ERP MCP server running on stdio);三个工具都用req.input()参数化这是防注入的关键后面排障会细说。3.5 启动与注册到客户端本地跑起来export ERP_PWD你的密码 npx tsx src/index.ts看到ERP MCP server running on stdio就说明服务端起来了。接着注册到 Claude Desktop 的claude_desktop_config.json{ mcpServers: { erp: { command: npx, args: [tsx, /path/to/erp-mcp/src/index.ts], env: { ERP_PWD: 你的密码 } } } }重启客户端后AI 就能看到这三个工具了。4. 验证请求让 AI 真正查一次 ERP 数据配置完成后直接在对话框里问帮我查利润最高的 5 个 SKU2026-06。AI 会自动调用profit_summary工具传入month: 2026-06服务端执行 SQL 返回 JSONAI 再把结果整理成人话给你。你也可以手动验证工具是否注册成功。在支持 MCP 的客户端里通常有工具列表能看到query_products、query_orders、profit_summary三个条目。如果客户端支持直接调用传一组参数试试{ keyword: 手机, category: 数码 }返回的recordset就是tb_products里匹配的商品。这一步通了说明从 SQL Server 到 AI 助手的链路完整了。如果你用的是 Codex CLI 或 Cursor注册方式类似都是把 MCP 服务器命令和参数写进各自的配置文件。模型通道那边把 TaoToken 的 API Key 填进客户端的模型配置即可接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 有详细说明。5. 本篇常见错排查5.1 SQL 注入千万别拼字符串我试过图省事写WHERE ProductName LIKE %${keyword}%一旦有人让 AI 传入 OR 11全表就裸了。正确做法是req.input()参数化让 mssql 走预编译参数。上面三个工具全部用了参数化这是底线。5.2 连接池与超时配置pool上限避免高并发把 SQL Server 连接打满。工具里用await getPool()复用连接别每次sql.connect新建。客户端超时会掐进程长查询加SET LOCK_TIMEOUT或限制TOP N。5.3 工具描述写清楚AI 靠工具描述决定调不调、怎么调。query_orders的描述里写明日期格式 YYYY-MM-DDAI 就不会传错格式。描述含糊AI 就容易瞎调。5.4 权限最小化生产环境给 MCP 单独建只读账号只授SELECT。别用 sa 账号跑一旦工具被滥用损失可控。5.5 客户端连不上服务端先确认npx tsx src/index.ts能独立跑起来再看客户端配置里的路径是不是绝对路径。相对路径在客户端启动时容易找不到文件。6. 下一步把更多数据源接进来MCP 把数据库能力变成 AI 可调用、你可控边界的工具是今年很值得上手的技术。这篇用 ERP SQL Server 走完了全流程建服务端、连库、定义工具、防注入、注册客户端。下一步你可以加 Resources把表结构暴露给 AI 做 schema 理解或者加 Prompts固化月度利润复盘这类话术。想验证模型通道是否稳定可以去模型对话页多试几个模型长期跑 Agent 任务的话Coding Plan 的额度更合适。接入过程中遇到工具注册或 Key 配置的问题优先查接入文档大部分坑那里都有答案。

相关新闻

可白嫖源码---课程设计--毕业设计--springboot汽车租赁系统[编号:project10283](案件分析)

可白嫖源码---课程设计--毕业设计--springboot汽车租赁系统[编号:project10283](案件分析)

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。 有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一 一回复站内私信,发送完整文件 摘 要 随…

2026/9/29 6:00:16 阅读更多 →
GraphRAG 踩坑实录:从 Demo 到团队协同,如何用 TaoToken 统一 Key 避免图谱变“死图”?

GraphRAG 踩坑实录:从 Demo 到团队协同,如何用 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 6:00:16 阅读更多 →
【GitHub项目实战】GPT-SoVITS-v4-TTS 实现音频文本推理与流式生成

【GitHub项目实战】GPT-SoVITS-v4-TTS 实现音频文本推理与流式生成

构建一个完整的语音克隆系统不仅仅是模型调用那么简单。它需要将音频清洗、数据切分、语义提取、特征编码等多个步骤紧密连接,每一步都直接决定了语音合成的质量和稳定性。在实际部署落地中,数据预处理环节常常是最耗时、最关键的一环,远比“安装模型->生成语音”来得复杂…

2026/9/29 6:00:16 阅读更多 →

最新新闻

Nginx安装全攻略:源码编译、包管理器与Docker部署对比

Nginx安装全攻略:源码编译、包管理器与Docker部署对比

干运维这一行的,谁没被Nginx折磨过两回?但说实话,折腾多了你会发现,Nginx的安装压根不是技术问题,而是选择问题。同一个Nginx,在不同机器、不同场景下,安装方式差了十万八千里,后续的…

2026/9/30 8:00:34 阅读更多 →
PDF 字体嵌入:7 步修复中文方块字与换机缺字

PDF 字体嵌入:7 步修复中文方块字与换机缺字

PDF 字体嵌入:7 步修复中文方块字与换机缺字 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址: https://gitcode.com…

2026/9/30 8:00:34 阅读更多 →
近日总结  面试经验

近日总结 面试经验

先放面经吧,只取了部分(有些忘记录音了,有些是电话面,没有录音),从8月份离职到现在9月份的,大概50天内的部分面经:面试岗位:Java开发工程师,1-3年经验信利恒丰…

2026/9/30 8:00:34 阅读更多 →
KaiwuDB时序数据库实战:从部署到百万级数据性能压测全记录

KaiwuDB时序数据库实战:从部署到百万级数据性能压测全记录

KaiwuDB 这个项目,我是从一次物联网平台改造开始接触的。当时被一票海量设备状态数据困扰,单表堆了几千万行之后查询明显吃力,于是在选型对比中把时序数据库纳入重点考察范围,而 KaiwuDB 恰好是那段时间频繁出现在我视野里的一个名…

2026/9/30 8:00:34 阅读更多 →
StorageClass与Provisioner:从原理到PVC Pending排查实战

StorageClass与Provisioner:从原理到PVC Pending排查实战

前阵子帮一位朋友排查K8s集群里PVC一直Pending的问题,绕了不少圈子,最后发现是StorageClass里provisioner字段和实际安装的CSI驱动对不上。这类问题在社区里非常常见,正好我也拿豆包这类AI问答工具把StorageClass和Provisioner的关系梳理过一…

2026/9/30 8:00:34 阅读更多 →
Windows Server 2012 R2远程桌面多用户并发配置全指南

Windows Server 2012 R2远程桌面多用户并发配置全指南

1. 为什么默认装完Windows Server 2012 R2根本不能多人同时远程登录?刚接手一台新部署的Windows Server 2012 R2物理机,客户急着要让5个部门主管同时远程接入做报表——我连RDP连接都还没点开,就发现事情不对劲:第一个用户登录后&…

2026/9/30 7:59:33 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

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

周新闻

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

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

如何划分训练/验证集: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 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

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