
Rust 中 MS SQL Server 的 MCP 服务器
概览
Microsoft SQL Server 的 MCP(Model Context Protocol)服务器,Rust 实现。 基于官方 Rust SDK rmcp 与 tiberius TDS 驱动,通过 stdio 提供 JSON-RPC (启用 http feature 后也可走 streamable-http)。 - :执行只读 SQL 查询 - 仅允许单条 SELECT(含 WITH ...SELECT);任何修改语句(INSERT/UPDATE/DELETE/DDL/EXEC 等)与多语句批次都会被拒绝 - SELECT 返回 RFC 4180 CSV 格式结果(首行列名;含逗号/引号/换行的值按引号包裹转义) - NULL 值渲染为 NULL、二进制渲染为十六进制、时间渲染为 ISO 格式;money/smallmoney 保留 4 位定点小数 - 日期时间的小数位**:d atetime2(7) 输出 7 位(.1234567)、datetime2(1) 输出 1 位(.1)、time(0) 不带小数;datetimeoffset 输出转换后的本地时间 + 偏移后缀(如 2026-10-01 12:00:00.123+08:00) - 对 INFORMATION_SCHEMA.TABLES 的查询返回 Tables_in_{database} 风格的表清单(识别基于词法分析,注释与字符串里的同名文本不会误触发;写成 [INFORMATION_SCHEMA]。
概述(AI 翻译)
中文 |英语
Microsoft SQL Server 的 MCP(Model Context Protocol)服务器,Rust 实现。
基于官方 Rust SDK rmcp 与
tiberius TDS 驱动,通过 stdio 提供 JSON-RPC
(启用 http feature 后也可走 streamable-http)。
功能
- 工具
execute_sql:执行只读 SQL 查询 - 仅允许单条
SELECT(含WITH ... SELECT);任何修改语句(INSERT/UPDATE/DELETE/DDL/EXEC 等)与多语句批次都会被拒绝 SELECT返回 RFC 4180 CSV 格式结果(首行列名;含逗号/引号/换行的值按引号包裹转义)- NULL 值渲染为
NULL、二进制渲染为十六进制、时间渲染为 ISO 格式;money/smallmoney保留 4 位定点小数 - 日期时间的小数位数跟随列的 scale:[
datetime2(7)输出 7 位(.1234567)、datetime2(1)输出 1 位(.1)、time(0)不带小数;[datetimeoffset输出转换后的本地时间 + 偏移后缀(如2026-10-01 12:00:00.123+08:00) - 对
INFORMATION_SCHEMA.TABLES的查询返回Tables_in_{database}风格的表清单(识别基于词法分析,注释与字符串里的同名文本不会误触发;写成[INFORMATION_SCHEMA].[TABLES]这种方括号形式不触发) - 工具
explain_query:返回查询的实际执行计划(SET STATISTICS PROFILE),每算子一行 - 查询会真正执行(这是拿到实际行数的代价);只接受单条只读
SELECT(守卫与execute_sql相同),对重量级查询请先评估执行代价 - 表格含物理/逻辑算子、参数(Argument)、预估行数与实际行数(
Rows/Executes)、预估 CPU/IO 成本、警告列等,便于对照“预估 vs 实际”定位偏差 - 会话级开关不落在连接池的连接上:每次分析使用一条独立短连接、执行完即关闭,池内连接绝无被
STATISTICS PROFILE污染的可能 - 需要被引用对象所在数据库的
SHOWPLAN权限,缺失时服务端会报 Msg 262 中止语句
本页由 AI 翻译,技术细节请以原文为准。
README
以下为原文 README 节选,完整内容请查看原文。
mssql_mcp_server-rs
中文 | English
Microsoft SQL Server 的 MCP(Model Context Protocol)服务器,Rust 实现。
基于官方 Rust SDK rmcp 与
tiberius TDS 驱动,通过 stdio 提供 JSON-RPC
(启用 http feature 后也可走 streamable-http)。
功能
- 工具
execute_sql:执行只读 SQL 查询- 仅允许单条
SELECT(含WITH ... SELECT);任何修改语句(INSERT/UPDATE/DELETE/DDL/EXEC 等)与多语句批次都会被拒绝 SELECT返回 RFC 4180 CSV 格式结果(首行列名;含逗号/引号/换行的值按引号包裹转义)- NULL 值渲染为
NULL、二进制渲染为十六进制、时间渲染为 ISO 格式;money/smallmoney保留 4 位定点小数 - 日期时间的小数位数跟随列的 scale:
datetime2(7)输出 7 位(.1234567)、datetime2(1)输出 1 位(.1)、time(0)不带小数;datetimeoffset输出转换后的本地时间 + 偏移后缀(如2026-10-01 12:00:00.123+08:00) - 对
INFORMATION_SCHEMA.TABLES的查询返回Tables_in_{database}风格的表清单(识别基于词法分析,注释与字符串里的同名文本不会误触发;写成[INFORMATION_SCHEMA].[TABLES]这种方括号形式不触发)
- 仅允许单条
- 工具
explain_query:返回查询的实际执行计划(SET STATISTICS PROFILE),每算子一行- 查询会真正执行(这是拿到实际行数的代价);只接受单条只读
SELECT(守卫与execute_sql相同),对重量级查询请先评估执行代价 - 表格含物理/逻辑算子、参数(Argument)、预估行数与实际行数(
Rows/Executes)、预估 CPU/IO 成本、警告列等,便于对照"预估 vs 实际"定位偏差 - 会话级开关不落在连接池的连接上:每次分析使用一条独立短连接、执行完即关闭,池内连接绝无被
STATISTICS PROFILE污染的可能 - 需要被引用对象所在数据库的
SHOWPLAN权限,缺失时服务端会报 Msg 262 中止语句 - 无查询算子的语句(不带 FROM/WHERE 的常量
SELECT,如SELECT 1)没有计划可报,会返回明确说明而不是空表
- 查询会真正执行(这是拿到实际行数的代价);只接受单条只读
- 工具
describe_table:查看表或视图的结构(列名、类型、可空性、长度/精度、默认值)与索引信息(名称、类型、唯一性、主键、键列、包含列)- 参数
table接受users、dbo.users或视图名;表名经参数绑定传入,无注入风险 - 返回两段 CSV:先是列信息(按列序),空一行后以注释行
# INDEXES引出第二段索引信息。每个索引列一行(复合主键的每个键列各自成行,INCLUDE列亦单独一行并标IS_INCLUDED_COLUMN=YES),因此不存在逗号拼接导致的列错位;无索引时第二段仅表头 - 列信息为 9 列:
TABLE_SCHEMA, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, COLUMN_DEFAULT, COLLATION_NAME COLLATION_NAME逐列给出排序规则(SQL Server 支持列级 collation,同一张表可混用不同规则),非字符类型该列为NULL;这一列放在最末,以降低对既有「按位置」消费者的影响- 不带 schema 时匹配所有 schema,结果含
TABLE_SCHEMA/OBJECT_SCHEMA列 - 跳过
#开头的注释行后,两段均可交由标准 CSV 解析器读取
- 参数
format参数(execute_sql/explain_query/table_sizes/list_databases):输出格式可选csv(默认)、json、markdown(简写md),大小写不敏感-
json输出对象数组,含逗号/引号的值无需转义即可无歧义解析;值一律为字符串,以保留 money 定点、二进制十六进制等渲染语义 -
markdown输出表格,单元格内的|转义为\|、换行折叠为 `` -
注意
describe_table不支持format:它返回带# INDEXES等注释行分隔的多段结构,切成 JSON/Markdown 会破坏分段(要视图定义用include_dependent_views,要行数用include_row_count) -
同一条
SELECT id, note FROM ...(note含逗号/竖线/换行)的三种输出:csvid,note 1,"a,b" 2,x|y 3,"l1 l2"json[ { "id": "1", "note": "a,b" }, { "id": "2", "note": "x|y" }, { "id": "3", "note": "l1\nl2" } ]markdown| id | note | | --- | --- | | 1 | a,b | | 2 | x\|y | | 3 | l1l2 |
-
- 工具
table_sizes:报告用户表的行数与磁盘占用(取自元数据,恒 O(1),不扫表);可按表名子串过滤
安装
docker exec mssql-test /opt/mssql-tools18/bin/sqlcmd \