ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MCP(Model Context Protocol)初体验:用TaoToken打通企业SQLServer数据与大模型融合

MCP(Model Context Protocol)初体验:用TaoToken打通企业SQLServer数据与大模型融合 1. 为什么企业 SQLServer 数据接不进大模型很多做企业内部系统的朋友都遇到过这个场景CRM、ERP、订单库都跑在 SQLServer 上业务数据每天都在更新但想让大模型帮忙分析一下上个月哪些客户最可能续约却只能手动把查询结果复制粘贴到对话框里。数据一多粘贴不下表一多模型根本不知道表结构长什么样。这个问题的本质是大模型的知识边界停在训练数据截止日期它看不到你企业内网里那张Customers表今天新增了什么。过去我们试过几种办法各有各的坑。第一种是自定义 API 集成。为每个数据源写一套适配代码SQLServer 要引pyodbc、写连接串、拼 SQL换成 MySQL 又得重写一遍。数据源一多维护成本指数级上升这就是典型的 N×M 集成困境。第二种是插件机制。平台私有插件之间无法在同一上下文里协同调用往往是一次性的缺乏持续上下文感知。第三种是 RAG 检索增强。它能把知识库段落塞进提示词但只能提供只读的静态上下文模型没法实时更新数据更没法主动执行查询。第四种是工具调用框架比如 LangChain。它允许模型调用预定义函数但每个工具都要开发者手动包装无法自动发现和动态适配。MCPModel Context Protocol模型上下文协议就是冲着这些痛点来的。它由 Anthropic 提出并开源用 JSON-RPC 2.0 在模型应用和数据源服务之间通信把模型怎么访问外部数据这件事标准化了。简单说你写一个 MCP Server 对接 SQLServer任何支持 MCP 的宿主应用Claude Desktop、IDE 插件、自建 Agent都能通过统一的客户端发现并调用你的查询工具不用为每个模型重写适配器。它适合谁适合手里有 SQLServer 业务库、想让大模型直接查数做分析、又不想把数据导出到公网的团队。下面我用 Python 走一遍从建 Server 到端到端问答的完整路径中间用 TaoToken 统一 Key 和 API 通道来打通模型调用这一环。2. TaoToken 前置准备统一 Key 与 API 通道在动手写 MCP Server 之前先把模型调用这一层理顺。企业里常见的情况是今天用这个模型明天换那个模型每个都要单独申请 Key、单独配 Base URL代码里到处是硬编码。TaoToken 的作用就是把这些收敛成一个统一的 API 通道和一个 Key。你需要先拿到两样东西一个 API Key和一个统一的 Base URL。Base URL 是https://taotoken.net/api注意这个地址不带任何查询参数直接作为 OpenAI 兼容接口的base_url使用。API Key 在控制台的 API Keys 页面创建创建后只显示一次记得立刻保存。这里要强调一个概念TaoToken 是模型调用的统一入口不是数据库代理。你的 SQLServer 数据始终留在内网MCP Server 跑在你自己的机器上只有模型推理这一步走 TaoToken 的 API 通道。数据流向是宿主应用 → MCP Client → 本地 MCP Server → 内网 SQLServer取到数据后宿主应用再把结果连同问题一起发给模型。数据库连接串、账号密码都不会离开你的环境。如果你用的是 Claude Code 这类编码 Agent或者想长期跑一个数据分析 Agent可以考虑 Coding Plan它更适合高频、长时间的调用场景。如果只是先验证模型能不能理解你的表结构用模型对话页面直接试就行。接入文档里有各语言 SDK 的完整示例配环境变量的时候照着填即可。环境变量建议这样组织避免把 Key 写死在代码里# Windows PowerShell $env:TAOTOKEN_API_KEYsk-你的Key $env:TAOTOKEN_BASE_URLhttps://taotoken.net/api# Linux / macOS export TAOTOKEN_API_KEYsk-你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/apiPython 侧读取时用os.environ.get(TAOTOKEN_API_KEY)这样换环境不用改代码。模型 ID 也要确认好不同模型对工具调用的支持程度不一样选一个明确支持 function calling / tool use 的模型否则 MCP 工具注册了也调不起来。这一步做完你手里就有了一个能访问 SQLServer 的只读账号、一个 TaoToken Key、一个 Base URL、一个支持工具调用的模型 ID。接下来写 Server。3. 可复制配置MCP Server 与客户端 JSON先装依赖。MCP 官方 Python SDK 提供了FastMCP用装饰器就能把函数注册成工具非常省事。pip install mcp pyodbcSQLServer 连接需要 ODBC 驱动Windows 上装 ODBC Driver 18 for SQL ServerLinux 上用微软官方源安装msodbcsql18。装完可以用odbcinst -q -d确认驱动名。下面是最小可用的 MCP Server我把它拆成连接、列表、查询三个工具安全上只允许 SELECT# sqlserver_mcp.py import os import pyodbc from typing import Any, Dict, List from mcp.server.fastmcp import FastMCP mcp FastMCP(namesqlserver-crm, host127.0.0.1, port8080) def get_connection(): conn_str ( DRIVER{ODBC Driver 18 for SQL Server}; SERVER127.0.0.1; DATABASECrmDemo; UIDcrm_readonly; PWD你的只读密码; TrustServerCertificateyes; Encryptno ) return pyodbc.connect(conn_str, timeout5) mcp.tool() def list_tables() - List[Dict[str, str]]: 列出数据库中的所有表及其描述 conn get_connection() cursor conn.cursor() cursor.execute( SELECT t.name AS table_name, COALESCE(ep.value, No description) AS description FROM sys.tables t LEFT JOIN sys.extended_properties ep ON ep.major_id t.object_id AND ep.minor_id 0 AND ep.name MS_Description ORDER BY t.name ) rows [{name: r[0], description: r[1]} for r in cursor.fetchall()] cursor.close(); conn.close() return rows mcp.tool() def execute_query(query: str) - List[Dict[str, Any]]: 执行只读 SQL 查询并返回结果 if not query.strip().upper().startswith(SELECT): return [{error: Only SELECT queries are allowed}] conn get_connection() cursor conn.cursor() cursor.execute(query) columns [c[0] for c in cursor.description] results [] for row in cursor.fetchall(): item {} for i, v in enumerate(row): item[columns[i]] v.isoformat() if hasattr(v, isoformat) else v results.append(item) cursor.close(); conn.close() return results if __name__ __main__: mcp.run()关键点mcp.tool()装饰器会从函数签名、类型注解和 docstring 里提取元数据生成工具描述给模型看。所以 docstring 要写清楚模型靠它判断什么时候该调这个工具。只读账号是硬约束MCP 协议本身支持写操作但企业数据接入初期一定要用只读权限兜底。客户端配置以 Claude Desktop 为例Windows 下路径是C:\Users\你的用户名\AppData\Roaming\Claude\claude_desktop_config.jsonmacOS 在~/Library/Application Support/Claude/claude_desktop_config.json{ mcpServers: { SQL Server CRM: { command: F:\\project\\sqlserver_mcp_demo\\venv\\Scripts\\python.exe, args: [F:\\project\\sqlserver_mcp_demo\\sqlserver_mcp.py], cwd: F:\\project\\sqlserver_mcp_demo, env: { TAOTOKEN_API_KEY: sk-你的Key, TAOTOKEN_BASE_URL: https://taotoken.net/api } } } }三件套对照一下Base URL 填https://taotoken.net/apiKey 填控制台创建的 KeyModel ID 填你选定的支持工具调用的模型。如果你用的是 Cline 或 CC Switch 这类工具配置结构类似把command指向 Python 解释器、args指向脚本即可。Codex 用户则在auth.json里配好对应的凭据字段。4. 验证请求从 SQLServer 取数到大模型问答配置保存后重启宿主应用。以 Claude Desktop 为例打开 Settings能看到 SQL Server CRM 处于 Running 状态点开锤子图标list_tables和execute_query两个工具都在列表里说明服务发现成功。先做一次最小验证直接在对话框问数据库里有哪些表 模型会调用list_tables返回表名列表。如果这一步就报错先看宿主应用的日志通常是 Python 路径不对或依赖没装全。接着做端到端验证。假设Customers表有CustomerID、Name、CustomerType字段Orders表有订单金额和日期。问一句帮我找出 VIP 客户并统计他们最近三个月的订单总额。模型会先调list_tables确认表名再调execute_query执行类似这样的 SQLSELECT c.Name, SUM(o.Amount) AS total FROM Customers c JOIN Orders o ON o.CustomerID c.CustomerID WHERE c.CustomerType VIP AND o.OrderDate DATEADD(month, -3, GETDATE()) GROUP BY c.Name ORDER BY total DESC返回结果后模型把数据整理成表格并给出解读。整个过程你能在对话里看到工具调用的中间步骤这就是 MCP 的价值模型不是猜你的数据而是真的去查了。再试一个需要多步推理的问题哪些潜在客户最可能转化 模型会先查销售机会表的阶段和概率字段再关联客户表最后按阶段加权排序。实测下来只要表结构清晰、字段命名规范模型的任务分解能力相当靠谱。验证成功的标志有三个工具列表里能看到注册的函数、对话中能看到工具调用记录、返回的数据和你在 SSMS 里手动查的一致。三个都满足说明链路通了。5. 本篇常见错排查报错一401 Unauthorized。这是 TaoToken Key 的问题。检查环境变量名是否和代码里读取的一致Key 有没有多余空格Base URL 是不是写成了带路径的形式。注意 Base URL 就是https://taotoken.net/api不要在后面拼/v1之类的后缀SDK 会自己处理。报错二local proxy failed / connection refused。宿主应用连不上 MCP Server。先确认 Python 脚本能单独跑起来python sqlserver_mcp.py看有没有报端口占用。如果 8080 被占改FastMCP的 port 参数。Windows 上还要检查防火墙有没有拦本地回环。报错三Error reading choices / 模型不返回工具调用。说明你选的模型不支持 tool use或者 SDK 版本太旧。换一个明确支持 function calling 的模型 ID并升级mcp和openai相关依赖。工具注册了但模型不调八成是模型能力问题不是配置问题。报错四OAuth / 认证失败。如果你用的是 Claude Code 或 Codex 这类需要 OAuth 的工具确认凭据文件路径正确。Codex 的auth.json里字段名要和文档一致CC Switch 切换配置后记得重启。报错五pyodbc 连接超时。检查 ODBC 驱动名是否和代码里一致ODBC Driver 18和ODBC Driver 17名字不同。SQLServer 如果开了强制加密Encryptno要去掉或改成yes并配好证书。只读账号的权限也要确认至少要有目标库的db_datareader角色。报错六查询返回空但 SSMS 里有数据。多半是连接到了错误的数据库实例或者DATABASE参数写错。在get_connection里打印一下连接串确认 SERVER 和 DATABASE 都对。排查顺序建议先单独跑 Python 脚本确认数据库通再确认宿主应用能发现工具最后确认模型能调工具。一层一层来别跳步。6. 把这条链路用起来链路跑通之后你可以按自己的数据环境做扩展。比如给execute_query加一个行数上限防止模型一次拉回几万行把上下文撑爆或者按业务域拆多个 MCP ServerCRM 一个、订单一个各自用独立的只读账号权限隔离更清晰。模型调用这一层如果只是偶尔验证用模型对话页面手动试最省事如果要长期跑数据分析 AgentCoding Plan 的额度模型更适合高频场景。API Key 和接入参数在控制台和接入文档里都能找到照着配就行。一个实用技巧把常用的查询封装成具名工具比如get_vip_customers、get_monthly_revenue而不是让模型每次自己拼 SQL。这样既降低模型出错概率也方便你做权限和审计控制。工具描述写详细一点模型选工具的准确率会明显提升。最后提醒一句MCP Server 不要直接连生产库跑复杂查询先在只读从库或测试库上验证确认 SQL 性能和返回数据量都在可控范围再考虑往生产环境推。
返回列表