Azure Blob存储MCP服务器
模型上下文协议(MCP)服务器,提供与Azure Blob存储交互的工具。此服务器使Claude等AI助手能够读取、搜索和探索存储在Azure Blob存储容器中的文件。
特性
- 列出容器:查看Azure存储帐户中的所有blob容器
- 列出金发女郎:使用可选的前缀过滤浏览容器中的blob
- 读取Blob内容:检索文本文件的全部内容,并自动截断大文件
- 读取Blob块:按字节范围读取大文件的特定部分
- 在Blob中搜索:在特定blob文件中搜索文本
- 在容器中搜索:搜索容器中的所有文本文件
- 获取Blob元数据:在不下载内容的情况下检索元数据和属性
需求
- .NET 10.0 SDK
- Docker和Docker Compose(用于使用Azurite进行本地开发)
- Azure存储帐户(用于生产)或Azurite(用于本地开发)
快速开始
1.克隆和构建
git clone
cd mcp-azure-storage-account
dotnet build2.启动当地发展环境
docker-compose up -d这将开始:
- 蓝铜矿:端口10000(Blob)、10001(队列)、10002(表)上的Azure存储模拟器
- MCP 服务器:在端口5001上运行
3.在本地运行服务器
dotnet run --project src/Viamus.Azure.StorageAccount.Mcp.Server服务器将在以下位置可用:
- MCP端点:
http://localhost:5001/mcp - 健康检查:
http://localhost:5001/health
配置
环境变量
| 变量 | 描述 | 必填 |
|---|---|---|
AZURE_STORAGE_CONNECTION_STRING | Azure存储的完整连接字符串 | 是\* |
AZURE_STORAGE_ACCOUNT_NAME | 存储帐户名(使用DefaultAzureCredential) | 是\* |
\*必须提供其中之一。
地方发展(Azurite)
Azurite的默认连接字符串已在中预先配置 launchSettings.json:
DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;生产(Azure存储帐户)
设置 AZURE_STORAGE_CONNECTION_STRING 带有Azure存储连接字符串或设置的环境变量 AZURE_STORAGE_ACCOUNT_NAME 要使用托管身份/DefaultAzureCredential。
可用的MCP工具
list_containers
列出Azure存储帐户中的所有blob容器。
退货:包含名称和最后修改日期的容器数组。
list_blobs
列出特定容器中的所有blob。
参数:
containerName(必填):容器名称prefix(可选):按前缀过滤blob(例如。,logs/用于类似文件夹的过滤)
退货:包含名称、大小、内容类型和上次修改日期的blob数组。
get_blob_content
获取blob文件的完整内容。
参数:
containerName(必填):容器名称blobName(必填):blob的名称/路径maxCharacters(可选):返回的最大字符数(默认值:100000)
退货:包含元数据的Blob内容。大文件会自动截断。
get_blob_chunk
获取blob文件的特定块/部分。
参数:
containerName(必填):容器名称blobName(必填):blob的名称/路径startPosition(必填):起始字节位置(从0开始)length(必填):要读取的字节数
退货:使用位置信息和剩余字节对内容进行分块。
search_in_blob
在blob文件中搜索特定术语。
参数:
containerName(必填):容器名称blobName(必填):blob的名称/路径searchTerm(必填):要搜索的文本caseSensitive(可选):区分大小写的搜索(默认值:false)maxResults(可选):返回的最大结果数(默认值:50)
退货:用行号匹配行。
search_in_container
在容器中的所有文本文件中搜索特定术语。
参数:
containerName(必填):容器名称searchTerm(必填):要搜索的文本blobPrefix(可选):筛选要搜索的blobcaseSensitive(可选):区分大小写的搜索(默认值:false)maxResults(可选):返回的最大结果数(默认值:100)
退货:将行与blob名称和行号匹配。
get_blob_metadata
获取特定blob的详细元数据和属性。
参数:
containerName(必填):容器名称blobName(必填):blob的名称/路径
退货:Blob元数据,包括大小、内容类型和读取建议。
与Claude Desktop集成
步骤1:配置Claude桌面
将MCP服务器添加到Claude Desktop配置文件中:
视窗: %APPDATA%\Claude\claude_desktop_config.json macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"azure-blob-storage": {
"url": "http://localhost:5001"
}
}
}步骤2:启动服务器
启动Claude Desktop之前,请确保MCP服务器正在运行:
# Start Azurite (if using local development)
docker-compose up azurite -d
# Start the MCP server
dotnet run --project src/Viamus.Azure.StorageAccount.Mcp.Server步骤3:验证连接
打开Claude Desktop,让Claude列出您的容器来验证连接:
“列出我的Azure存储帐户中的所有容器”
为上下文创建CLAUDE.md文件
为了帮助Claude了解您的特定blob存储结构和用例,请创建一个 CLAUDE.md 项目根目录中的文件。此文件提供有关数据组织的上下文。
CLAUDE.md示例
# Azure Blob Storage Context
## Storage Structure
This Azure Blob Storage account contains the following containers:
### `logs`
Application logs organized by date and service:
- `logs/api/YYYY-MM-DD/*.log` - API server logs
- `logs/worker/YYYY-MM-DD/*.log` - Background worker logs
- `logs/errors/YYYY-MM-DD/*.json` - Error reports in JSON format
### `documents`
User-uploaded documents:
- `documents/{user-id}/` - User-specific files
- `documents/shared/` - Shared documents accessible to all users
### `backups`
Database backups:
- `backups/daily/YYYY-MM-DD.sql.gz` - Daily compressed SQL backups
- `backups/weekly/YYYY-WW.sql.gz` - Weekly backups
### `media`
Media files (images, videos):
- `media/images/{uuid}.{ext}` - Uploaded images
- `media/thumbnails/{uuid}.jpg` - Generated thumbnails
## Common Tasks
1. **Finding recent errors**: Search in `logs/errors/` for today's date
2. **User file lookup**: List blobs with prefix `documents/{user-id}/`
3. **Log analysis**: Search for specific error codes in `logs/api/`
## File Formats
- `.log` files are plain text, one entry per line
- `.json` files are structured JSON, can be searched directly
- `.sql.gz` files are compressed and cannot be read directly
## Naming Conventions
- Dates use ISO format: YYYY-MM-DD
- UUIDs are lowercase with hyphens
- All paths use forward slashesCLAUDE.md的提示
- 记录您的文件夹结构:解释文件的组织方式
- 描述命名约定:帮助克劳德理解模式
- 列出常见任务:提供频繁操作的示例
- 注释文件格式:指出哪些文件是文本可读的
- 包括搜索提示:建议有效的搜索策略
运行测试
dotnet test项目结构
mcp-azure-storage-account/
├── src/
│ └── Viamus.Azure.StorageAccount.Mcp.Server/
│ ├── Program.cs # Application entry point
│ ├── Services/
│ │ ├── IAzureBlobStorageService.cs
│ │ └── AzureBlobStorageService.cs
│ └── Tools/
│ └── BlobStorageTools.cs # MCP tool definitions
├── tests/
│ └── Viamus.Azure.StorageAccount.Mcp.Server.Tests/
│ ├── Services/
│ │ └── AzureBlobStorageServiceTests.cs
│ └── Tools/
│ └── BlobStorageToolsTests.cs
├── docker-compose.yml
├── README.md
└── CLAUDE.md # Your storage context file错误处理
所有工具都返回结构化的JSON响应。当找不到资源时:
{
"Error": "NotFound",
"Message": "Blob 'file.txt' not found in container 'my-container'",
"ResourceType": "Blob",
"ResourceName": "file.txt",
"ContainerName": "my-container"
}对于其他错误:
{
"Error": "ErrorCode",
"Message": "Description of what failed",
"Details": "Detailed error message",
"StatusCode": 500
}Docker部署
塑造形象
docker build -t azure-blob-mcp-server -f src/Viamus.Azure.StorageAccount.Mcp.Server/Dockerfile .使用Docker Compose运行
docker-compose up -dDocker的环境变量
environment:
- AZURE_STORAGE_CONNECTION_STRING=your-connection-string许可证
麻省理工学院
贡献
- 克隆该仓库
- 创建要素分支
- 进行更改
- 运行测试:
dotnet test - 提交拉取请求
