SQL MCP服务器构建工具

提供从设置客户端服务主体、RBAC、DAB配置到启动和运行SQL MCP服务器的完整步骤,支持多租户隔离策略。

  • by helenzusa1
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 helenzusa1/sql-mcp-server

使用说明

1.目标

您已经有了SQL数据库,并准备好了表,您想知道如何创建SQL MCP服务器,以及如何在构建后运行服务器?

本文以Fabric SQL数据库为例,给出了从设置客户端服务主体、RBAC、DAB配置到启动SQL MCP服务器并运行服务器的完整步骤。

代码示例如下:https://github.com/helenzusa1/sql-mcp-server

此回购中提供的解决方案是为向多租户方向发展而准备的。

1.1隔离策略

这支持多种隔离策略,具体取决于架构:

多实例隔离

每个租户使用单独的SQL数据库和连接字符串。这是一种部署级隔离策略。

基于身份的访问控制(RBAC)

多个租户共享相同的SQL数据库和MCP服务器,但使用不同的Microsoft Entra身份进行身份验证。
SQL权限限制了每个租户可以执行哪些表或操作。

真正的服务器端多租户(推荐)

该存储库侧重于为隔离奠定基础,并旨在在实现以下条件时演变为真正的多租户:
所有租户共享相同的数据库和MCP服务器。
通过使用TenantId列,结合SQL行级安全性(RLS)、视图或存储过程,在服务器端强制实施租户隔离。
真正的服务器端多租户需要显式配置。DAB/SQL MCP Server不会自动按租户限定请求范围,除非您实现:(1)Entra身份验证,(2)角色/声明映射或策略,以及(3)数据库强制,如行级安全性(RLS)、租户筛选视图或存储过程。然后,MCP层可以依靠这些策略来确保租户隔离。

2.准备工作

Microsoft Fabric中的SQL数据库。
一些桌子。在这个例子中,有三个表:products、orders和order_details。
VS代码工作室与Powershell。
在Microsoft Entra ID中注册的应用程序,具有应用程序ID、租户ID和秘密值。此应用程序将用作租户,演示如何为多租户场景做准备。

3.成果

DAB正在运行,您可以通过Swagger(REST)和GraphQL工具验证端点。DAB根据您的配置公开REST和GraphQL端点。您看到的“UI”是Swagger/OpenAPI体验(用于REST)和GraphQL游乐场,而不是自定义数据库UI。您可以通过Swaggr UI检索表,并在GraphQL中运行查询。

SQL MCP服务器已准备好包含在AI代理中。
步骤提供了精确的powershell命令供用户遵循。

4.步骤

步骤0-安装DAB工具

在Powershell中:

dotnet new tool-manifest 
dotnet tool install microsoft.dataapibuilder --prerelease  
dotnet tool restore  

dotnet dab --version  

在此之后,您应该看到在项目文件夹下创建的.config子文件夹,以及在.config中创建的dotnet-tools.json。

步骤1-注册Entra应用程序(服务主体),代表用户

在Microsoft Entra ID中注册应用程序:sql msp服务器
应用程序(客户端)ID:yyyyyyyy-yyyyyyyy-yyyyyy-yyyyyy
应用程序秘密值(不使用秘密ID):zzzzzzzzz

授予结构工作区权限
添加您的应用程序sql mcp服务器
角色:贡献者(SQL数据库访问的最低要求)

步骤2-授予应用程序SQL权限

--创建Entra支持的数据库用户,在fabric sql查询中运行:

CREATE USER [sql-mcp-server] FROM EXTERNAL PROVIDER;  
GO 

--授予读/写权限

ALTER ROLE db_datareader ADD MEMBER [sql-mcp-server]; 
ALTER ROLE db_datawriter ADD MEMBER [sql-mcp-server]; 

仅当需要更改架构或管理操作时,才更改db_owner。

ALTER ROLE db_owner ADD MEMBER [sql-mcp-server];
GO

此图像中显示了权限示例。 和

步骤3-构建服务主体连接字符串

$Env:SQL_CONNECTION_STRING = `  
"Server=tcp:xxxx.database.fabric.microsoft.com,1433;  
Database=example_sql_db-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;  
Encrypt=True;  
TrustServerCertificate=False;  
Authentication=Active Directory Service Principal;  
User Id=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy;  
Password=zzzzzzzzzzz"  

步骤 4 - 初始化 DAB 配置

从结构中的SQL数据库中获取这些数据,ADO。NET连接字符串:

在Powershell中:


dab init --database-type mssql --host-mode Development --connection-string "$Env:SQL_CONNECTION_STRING"

如果失败,请运行以下命令:

dotnet tool run dab init --database-type mssql --host-mode Development --connection-string "$Env:SQL_CONNECTION_STRING"  

在此之后,您应该看到dab-config.json已在您的项目文件夹中创建。

您应该只初始化DAB一次,然后更新表键字段权限。对于“连接字符串”,您可以使用完整的参数值,也可以使用@env('SQL_CONNECION_string')。

{
  "$schema": "https://github.com/Azure/data-api-builder/releases/download/v1.7.86/dab.draft.schema.json",
  "data-source": {
    "database-type": "mssql",
    "connection-string": "@env('SQL_CONNECTION_STRING')",
    "options": {
      "set-session-context": false
    }
  },
  "runtime": {
    "rest": {
      "enabled": true,
      "path": "/api",
      "request-body-strict": true
    },
    "graphql": {
      "enabled": true,
      "path": "/graphql",
      "allow-introspection": true
    },
    "mcp": {
      "enabled": true,
      "path": "/mcp"
    },
    "host": {
      "cors": {
        "origins": [],
        "allow-credentials": false
      },
      "authentication": {
        "provider": "AppService"
      },
      "mode": "development"
    }
  },

"entities": {
  "products": {
    "source": {
      "object": "dbo.products",
      "type": "table",
      "key-fields": ["ProductID"]
    },
    "permissions": [
      { "role": "authenticated", "actions": [{ "action": "*" }] }
    ]
  },

 _**** same for other tables.
}
}

步骤5-启动DAB(HTTP或STDIO)

启动DAB有两种方法:


dotnet tool run dab start 
-- This will start MCP in HTTP mode. 

dotnet tool run dab start --mcp-stdio role:anonymous 
-- This will start MCP in Stdio mode. 

如果您在dab-config.json中使用@env('SQL_CONNECTION.STRING')作为“连接字符串”,那么每次启动dab之前,您都需要设置$env:stringCONNECTION_STRING。

步骤6-REST API

在以HTTP或STDIO模式启动DAB后,您可以启动Swagger UI,如图所示。

http://localhost:5000/api/products
http://localhost:5000/api/orders
http://localhost:5000/api/order_details

图查询语言
http://localhost:5000/graphql

尝试以下操作:

query { 
  products { 
    items {  
      ProductID,
      ProductName
    } 
  } 
}  

但是,对于HTTP和STDIO模式,运行MCP服务器的方法是不同的。

步骤7-如何运行和使用MCP服务器

请参考https://github.com/helenzusa1/sql-mcp-server/blob/main/How-to-Run-MCP.md