Azure密钥库MCP服务器(Python)
一个Python MCP服务器,向AI代理公开Azure Key Vault数据平面操作。使用托管身份进行身份验证,使用最低权限RBAC进行安全秘密访问。部署到Azure容器应用程序,并从GitHub Copilot聊天代理模式连接。
概述
此示例演示了如何构建客户拥有的 模型上下文协议(MCP) 向AI代理公开Azure Key Vault数据平面操作的服务器。
三种集成模式:
- 代理→ 密钥保管库:通过MCP工具阅读秘密
- 密钥保管库→ Agent:从密钥库事件触发代理工作流(事件网格)
- 遥测→ Agent:查询调试和监控的审核日志
主要特点:
- 仅数据平面:只暴露秘密读取操作,没有管理平面访问权限
- 管理身份:用途
DefaultAzureCredential用于安全身份验证 - 最小特权:仅需要
Key Vault Secrets User角色 - 容器应用程序托管:部署到Azure容器应用程序
azd up
\[!重要\] 此MCP服务器使用密钥库 数据平面 只有。它没有也不应该访问管理平面操作,如创建保管库、配置网络或分配RBAC角色。
MCP工具
| 工具 | 说明 | 密钥库API |
|---|---|---|
getSecret | 检索机密值 | GET /secrets/{name} |
listSecrets | 列出秘密名称(不是值) | GET /secrets |
queryKeyVaultLogs | 查询用于调试的审核日志 | Azure监视器日志API |
备注:The queryKeyVaultLogs 该工具需要额外的配置。看 启用遥测查询 在......下面先决条件
- Azure订阅- 免费创建一个
- 已启用RBAC且至少有一个密钥的现有Azure密钥库
- Azure命令行界面 (v2.50+)
入门指南
选择适合您需求的路径:
______________________________________________________________________
选项1:部署到Azure(推荐)
将MCP服务器部署到Azure容器应用程序以供生产使用。这为您提供了一个具有托管身份验证的托管端点。
Azure部署的先决条件
步骤
1.克隆和部署
git clone https://github.com/msmbaldwin/keyvault-mcp-server-python.git
cd keyvault-mcp-server-python
azd auth login
azd up系统将提示您:
- 环境名称:一个简短的名字,比如
kv-mcp-dev - Azure订阅:选择您的订阅
- Azure位置:选择一个地区
- 密钥库名称:现有密钥库的名称
2.配置VS代码
部署后,将MCP服务器添加到您的VS代码设置中:
- 打开VS代码设置(
Ctrl+,) - 搜索“mcp”
- 编辑
settings.json并添加:
{
"mcp": {
"servers": {
"keyvault-mcp-server": {
"type": "http",
"url": "https:///mcp"
}
}
}
}替换 ` URL来自 azd up` 输出。
3.在GitHub Copilot聊天中使用
- 打开GitHub Copilot聊天(
Ctrl+Alt+I) - 选择 代理模式 从下拉列表中
- 点击 工具 验证
getSecret和listSecrets可供使用 - 尝试以下提示:“列出密钥库中的秘密”
______________________________________________________________________
选项2:本地运行
在本地计算机上运行MCP服务器以进行快速测试或开发。
地方发展的先决条件
- Python 3.10+
- Azure命令行界面 (用于身份验证)
步骤
1.克隆并安装依赖项
git clone https://github.com/msmbaldwin/keyvault-mcp-server-python.git
cd keyvault-mcp-server-python
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pip install -r requirements.txt2.验证并运行
# Login to Azure (required for DefaultAzureCredential)
az login
# Set your Key Vault URL
export KEYVAULT_URL="https://.vault.azure.net/"
# Start the server
python src/server.py服务器将于启动 http://localhost:3000.
3.配置VS代码
添加到您的VS代码 settings.json:
{
"mcp": {
"servers": {
"keyvault-mcp-server": {
"type": "http",
"url": "http://localhost:3000/mcp"
}
}
}
}4.在GitHub Copilot聊天中使用
- 打开GitHub Copilot聊天(
Ctrl+Alt+I) - 选择 代理模式 从下拉列表中
- 点击 工具 验证工具是否可用
______________________________________________________________________
选项3:GitHub代码空间
](https://codespaces.new/msmbaldwin/keyvault-mcp-server-python)
代码空间提供了一个预配置的开发环境。最适合贡献者或那些想在没有本地设置的情况下探索代码的人。
备注:代码空间仍然需要Azure身份验证和配置。它便于开发,但不是“零配置”体验。
步骤
- 单击上面的徽章在代码空间中打开
- 容器启动后,向Azure进行身份验证:
az login --use-device-code- 查找您的密钥库名称:
az keyvault list --query '[].name' -o tsv- 启动服务器:
export KEYVAULT_URL="https://.vault.azure.net/"
python src/server.py- MCP设置是预先配置的。重新加载VS代码(
Ctrl+Shift+P→ “重新加载窗口”),然后在副驾驶聊天中使用代理模式。
______________________________________________________________________
安全
此示例遵循安全最佳实践:
| 实践 | 实施 |
|---|---|
| 仅数据平面 | 未暴露管理平面操作 |
| 最小特权 | 用途 Key Vault Secrets User 仅限角色 |
| 管理身份 | 配置中未存储任何秘密 |
| 单保险库范围 | 角色分配仅限于一个保管库 |
所需角色
| 角色 | 范围 | 目的 |
|---|---|---|
Key Vault Secrets User | 密钥库 | 读取秘密 |
Log Analytics Reader | 日志分析工作区 | 查询审计日志(可选) |
应避免的角色
做 不 将这些角色授予MCP服务器标识:
Key Vault Contributor(控制平面访问)Key Vault Administrator(完全数据平面访问)Owner或Contributor在任何范围
故障排除
| 错误 | 原因 | 解决方法 |
|---|---|---|
403 Forbidden | 缺少RBAC角色 | 分配 Key Vault Secrets User 到托管身份 |
401 Unauthorized | 身份未解析 | 验证托管身份是否已附加到容器应用程序 |
404 Not Found | 错误的保管库URL | 检查 KEYVAULT_URL 格式 |
清理
azd down --purge --force扩展图案
启用遥测查询
要启用 queryKeyVaultLogs 代理调试工具:
- 启用密钥库诊断日志记录 转到日志分析工作区
- 设置环境变量:
export LOG_ANALYTICS_WORKSPACE_ID=""- 分配日志分析读取器角色 到管理身份:
az role assignment create \
--role "Log Analytics Reader" \
--assignee-object-id
\
--assignee-principal-type ServicePrincipal \
--scope /subscriptions//resourceGroups//providers/Microsoft.OperationalInsights/workspaces/示例查询:
| 场景 | 查询 | ||
|---|---|---|---|
| 访问失败 | `AzureDiagnostics \ | where ResourceProvider == "MICROSOFT.KEYVAULT" and ResultSignature == "Forbidden"` | |
| 最近访问 | `AzureDiagnostics \ | where OperationName == "SecretGet" \ | summarize count() by CallerIPAddress` |
| 异常模式 | `AzureDiagnostics \ | where ResourceProvider == "MICROSOFT.KEYVAULT" \ | summarize count() by bin(TimeGenerated, 1h)` |
从密钥库事件触发代理
密钥库与 Azure事件网格 在机密、密钥或证书更改时发出事件。使用这些事件触发代理工作流:
| 事件 | 代理工作流 |
|---|---|
SecretNearExpiry | 特工启动秘密轮换 |
CertificateNearExpiry | 代理触发证书续订 |
SecretNewVersionCreated | 代理验证和更新依赖的应用程序 |
要实现,请创建事件网格订阅:
az eventgrid event-subscription create \
--name keyvault-agent-trigger \
--source-resource-id /subscriptions//resourceGroups//providers/Microsoft.KeyVault/vaults/ \
--endpoint-type webhook \
--endpoint https:///api/keyvault-events \
--included-event-types Microsoft.KeyVault.SecretNearExpiry Microsoft.KeyVault.CertificateNearExpiry备注:事件网格触发器需要一个单独的webhook端点(如Azure函数),而不是MCP服务器本身。然后,代理可以调用MCP服务器来检索其他上下文。
相关文档
贡献
该项目欢迎各方提供意见和建议。看 贡献.md 了解详情。
许可证
此项目根据MIT许可证获得许可-请参阅 许可证 了解详情。
