PM

panxianhaoo/mssql_mcp_server-rs

开发工具

本页由 AI 翻译,技术细节请以原文为准。 查看原文

0 stars 0 forks 质量 52 趋势 14

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 含逗号/竖线/换行)的三种输出:

      csv

      id,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),不扫表);可按表名子串过滤
在 GitHub 查看完整 README

安装

docker exec mssql-test /opt/mssql-tools18/bin/sqlcmd \
新手?先看 mcpskill.org 教程 →