客户,
一个远程MCP(模型上下文协议)服务器,允许Claude在经过身份验证的用户自己的身份下查询Azure数据资源管理器(Kusto)。服务器充当Claude和Azure Entra ID之间的OAuth代理,因此保留了每个用户的ADX权限、行级安全性和审计跟踪,不涉及共享服务主体。
有关更多信息,请阅读dev.to上的帖子 克劳德和库斯托或MCP和CQRS+.
运作原理
Claude Desktop ──OAuth 2.1──> MCP Server ──OAuth 2.0──> Azure Entra ID
│
└── KQL query ──> Azure Data Explorer
(user's own Bearer token)服务器向Claude提供标准OAuth端点,将身份验证代理给Entra ID(重写作用域和注入凭据),并通过以下方式将生成的用户令牌直接传递给ADX WithAadUserTokenAuthentication.
先决条件
- .NET 10 SDK
- Azure命令行界面 (
az login) - Azure Entra ID租户
- Azure数据资源管理器集群和数据库
- 云层爆发 用于局部隧道(
brew install cloudflared)
设置
1.创建Entra ID应用程序注册
./deploy/create_app_registration.sh \
--tenantId \
--appName mcp-kusto-server-dev \
--keyVaultName 这将创建(或重用)一个应用程序注册:
- SPA重定向本地开发的URI(
http://localhost,http://127.0.0.1) - Claude的Web重定向URI(
https://claude.ai/api/mcp/auth_callback) - Azure数据资源管理器
user_impersonation委托权限 - 客户端密钥存储在密钥库中
手动操作:Azure门户>应用程序注册>新建>单个租户,然后添加上面的重定向URI、API权限和客户端机密。
2.授予Kusto数据库访问权限
通过Claude查询的每个用户都需要访问数据库:
.add database viewers ('aaduser=user@yourdomain.com')3.配置环境
创建 launchSettings.json 在 src/ 文件夹:
{
"profiles": {
"LocalDev": {
"commandName": "Project",
"environmentVariables": {
"AZURE_TENANT_ID": "",
"OAuth_ClientId": "",
"OAuth_ClientSecret": "!@Microsoft.KeyVault(SecretUri=https://.vault.azure.net/secrets/mcp-kusto-server-client-secret/)",
"AzureDataExplorer_ConnectionString": "https://.kusto.windows.net",
"AzureDataExplorer_Database": ""
},
"applicationUrl": "https://localhost:5001"
}
}
}| 变量 | 描述 |
|---|---|
AZURE_TENANT_ID 输入租户ID。 | |
OAuth_ClientId | 应用程序注册客户端ID(不是 AZURE_CLIENT_ID --这与 DefaultAzureCredential) |
OAuth_ClientSecret | 客户端机密或密钥库参考 |
AzureDataExplorer_ConnectionString | kusto集群URL |
AzureDataExplorer_Database | Kusto数据库名称 |
4.在本地运行
./dotnet_run.sh --mcp true这将从以下位置加载环境变量 launchSettings.json,启动Cloudflare隧道,并运行服务器。隧道URL已打印出来——将其用作Claude Desktop中的连接器。
没有隧道(仅服务器):
./dotnet_run.sh5.连接克劳德桌面
- 设置 > 连接器 > 添加连接器
- 粘贴上一步中的隧道URL(例如。
https://xxx-yyy.trycloudflare.com/mcp) - 提示时使用Entra ID进行身份验证
- 使用
execute_kusto_query运行KQL查询的工具
