内容
# 无人机 MCP 服务器
用于与 Drone CI/CD 交互的模型上下文协议(MCP)服务器。该服务器提供工具和资源,用于查询构建信息、仓库等。
## 功能
- **列出仓库**:获取 Drone 实例中的所有仓库
- **列出构建**:列出特定仓库的构建
- **获取构建详情**:检索特定构建的详细信息
- **资源访问**:通过资源 URI 访问构建详情
## 安装
```bash
go mod tidy
go build -o drone-mcp-server .
```
## 配置
设置以下环境变量:
```bash
export DRONE_SERVER=https://drone.example.com
export DRONE_TOKEN=your_drone_token
# 可选:用于 SSE 传输身份验证
export MCP_AUTH_TOKEN=your_sse_auth_token
```
`DRONE_TOKEN` 应该是一个具有适当权限的个人访问令牌,用于读取仓库和构建。
**SSE 身份验证**:使用 SSE 传输时,您可以可选地设置 `MCP_AUTH_TOKEN` 以要求 Bearer 令牌身份验证。客户端必须在其请求中包含 `Authorization: Bearer <token>` 头。如果未设置,SSE 端点将公开可访问(在生产中使用时请谨慎)。
## 用法
### 作为 MCP 服务器
将服务器添加到您的 MCP 客户端配置(例如 Claude Desktop):
```json
{
"mcpServers": {
"drone": {
"command": "/path/to/drone-mcp-server",
"env": {
"DRONE_SERVER": "https://drone.example.com",
"DRONE_TOKEN": "your_token"
}
}
}
}
```
### 直接执行
您可以直接运行服务器进行测试:
```bash
# 标准输入/输出模式(默认)
./drone-mcp-server
# SSE HTTP 模式
./drone-mcp-server --sse --host localhost --port 8080
```
#### 传输模式
1. **标准输入/输出模式(默认)**:通过标准输入/输出使用 MCP 协议进行通信。适用于与 MCP 客户端的本地集成。
2. **SSE HTTP 模式**:使用 HTTP 上的服务器发送事件(SSE)。适用于远程访问或测试。
```bash
# 无身份验证(公共访问)
./drone-mcp-server --sse --host 0.0.0.0 --port 8080
# 启用身份验证(推荐用于生产)
export MCP_AUTH_TOKEN=your-secret-token
./drone-mcp-server --sse --host 0.0.0.0 --port 8080
```
服务器将在 `http://localhost:8080/` 处可用于 SSE 连接。
**身份验证**:如果设置了 `MCP_AUTH_TOKEN`,客户端必须包含以下头:
```
Authorization: Bearer your-secret-token
```
## 可用工具
### 仓库管理
#### `list_repos`
列出 Drone 实例中的所有仓库。
#### `get_repo`
获取仓库详情。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
#### `enable_repo`
启用仓库。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
#### `disable_repo`
禁用仓库。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
#### `repair_repo`
修复仓库。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
#### `chown_repo`
更改仓库所有权。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
#### `sync_repos`
同步仓库列表。
#### `list_incomplete`
列出具有不完整构建的仓库。
### 构建管理
#### `list_builds`
列出特定仓库的构建。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
#### `get_build`
获取特定构建的详细信息。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `build`(数字):构建编号
#### `get_build_last`
获取仓库的最后一个构建(可选按分支)。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `branch`(字符串,可选):分支名称
#### `get_build_logs`
获取特定构建阶段和步骤的日志。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `build`(数字):构建编号
- `stage`(数字):阶段编号
- `step`(数字):步骤编号
#### `restart_build`
重启构建(可选带有参数)。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `build`(数字):构建编号
- `params`(对象,可选):构建参数
#### `cancel_build`
取消正在运行的构建。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `build`(数字):构建编号
#### `promote_build`
将构建提升到目标环境。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `build`(数字):构建编号
- `target`(字符串):目标环境
- `params`(对象,可选):提升参数
#### `rollback_build`
回滚部署到之前的构建。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `build`(数字):构建编号
- `target`(字符串):目标环境
- `params`(对象,可选):回滚参数
#### `approve_build`
批准构建阶段(用于分段部署)。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `build`(数字):构建编号
- `stage`(数字):阶段编号
#### `decline_build`
拒绝构建阶段(用于分段部署)。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `build`(数字):构建编号
- `stage`(数字):阶段编号
#### `create_build`
从提交或分支创建新的构建。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `commit`(字符串,可选):提交 SHA
- `branch`(字符串,可选):分支名称
- `params`(对象,可选):构建参数
### 定时任务管理
#### `list_crons`
列出仓库的定时任务。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
#### `get_cron`
获取定时任务详情。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `cron`(字符串):定时任务名称
#### `create_cron`
创建新的定时任务。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `name`(字符串):定时任务名称
- `expr`(字符串):定时任务表达式
- `branch`(字符串):分支名称
- `disable`(布尔值,可选):禁用定时任务
#### `delete_cron`
删除定时任务。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `cron`(字符串):定时任务名称
#### `execute_cron`
立即执行定时任务。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `cron`(字符串):定时任务名称
### 机密管理
#### `list_secrets`
列出仓库机密。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
#### `get_secret`
获取仓库机密详情。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `name`(字符串):机密名称
#### `create_secret`
创建仓库机密。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `name`(字符串):机密名称
- `value`(字符串):机密值
- `pull_request`(布尔值,可选):允许在拉取请求中
- `pull_request_push`(布尔值,可选):允许在拉取请求推送事件中
#### `update_secret`
更新仓库机密。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `name`(字符串):机密名称
- `value`(字符串):机密值
- `pull_request`(布尔值,可选):允许在拉取请求中
- `pull_request_push`(布尔值,可选):允许在拉取请求推送事件中
#### `delete_secret`
删除仓库机密。
**参数:**
- `owner`(字符串):仓库所有者
- `repo`(字符串):仓库名称
- `name`(字符串):机密名称
#### 组织机密
#### `list_org_secrets`
列出组织机密。
**参数:**
- `namespace`(字符串):组织命名空间
#### `get_org_secret`
获取组织机密详情。
**参数:**
- `namespace`(字符串):组织命名空间
- `name`(字符串):机密名称
#### `create_org_secret`
创建组织机密。
**参数:**
- `namespace`(字符串):组织命名空间
- `name`(字符串):机密名称
- `value`(字符串):机密值
- `pull_request`(布尔值,可选):允许在拉取请求中
- `pull_request_push`(布尔值,可选):允许在拉取请求推送事件中
#### `update_org_secret`
更新组织机密。
**参数:**
- `namespace`(字符串):组织命名空间
- `name`(字符串):机密名称
- `value`(字符串):机密值
- `pull_request`(布尔值,可选):允许在拉取请求中
- `pull_request_push`(布尔值,可选):允许在拉取请求推送事件中
#### `delete_org_secret`
删除组织机密。
**参数:**
- `namespace`(字符串):组织命名空间
- `name`(字符串):机密名称
### 用户管理
#### `get_self`
获取当前认证用户。
#### `list_users`
列出所有用户。
#### `get_user`
获取用户详情。
**参数:**
- `login`(字符串):用户登录名称
#### `create_user`
创建新用户。
**参数:**
- `login`(字符串):用户登录名称
- `email`(字符串,可选):用户邮箱
- `admin`(布尔值,可选):管理员权限
- `active`(布尔值,可选):活动状态
- `token`(字符串,可选):用户令牌
#### `update_user`
更新用户。
**参数:**
- `login`(字符串):用户登录名称
- `admin`(布尔值,可选):管理员权限
- `active`(布尔值,可选):活动状态
#### `delete_user`
删除用户。
**参数:**
- `login`(字符串):用户登录名称
### 模板管理
#### `list_templates`
列出模板(可选按命名空间)。
**参数:**
- `namespace`(字符串,可选):模板命名空间
#### `get_template`
获取模板详情和数据。
**参数:**
- `namespace`(字符串):模板命名空间
- `name`(字符串):模板名称
#### `create_template`
创建新模板。
**参数:**
- `namespace`(字符串):模板命名空间
- `name`(字符串):模板名称
- `data`(字符串):模板数据(YAML)
#### `update_template`
更新模板。
**参数:**
- `namespace`(字符串):模板命名空间
- `name`(字符串):模板名称
- `data`(字符串):模板数据(YAML)
#### `delete_template`
删除模板。
**参数:**
- `namespace`(字符串):模板命名空间
- `name`(字符串):模板名称
## 资源
### 构建详情资源
通过资源 URI 访问构建详情:`drone://builds/{owner}/{repo}/{build}`
**示例:**
```
读取资源:drone://builds/owner1/repo1/123
```
## Docker
在 GitHub 容器注册表中提供多架构 Docker 镜像:
```bash
# 拉取最新镜像
docker pull ghcr.io/yusiwen/drone-mcp-server:latest
# 以标准输入/输出模式运行(适用于 MCP 客户端)
docker run -e DRONE_SERVER=https://drone.example.com \
-e DRONE_TOKEN=your_token \
ghcr.io/yusiwen/drone-mcp-server
# 以 SSE 模式运行,自定义端口
docker run -e DRONE_SERVER=https://drone.example.com \
-e DRONE_TOKEN=your_token \
-p 8080:8080 \
ghcr.io/yusiwen/drone-mcp-server --sse --host 0.0.0.0
# 以 SSE 身份验证运行
docker run -e DRONE_SERVER=https://drone.example.com \
-e DRONE_TOKEN=your_token \
-e MCP_AUTH_TOKEN=your_sse_token \
-p 8080:8080 \
ghcr.io/yusiwen/drone-mcp-server --sse --host 0.0.0.0
```
### Docker Compose 示例
```yaml
version: '3.8'
services:
drone-mcp-server:
image: ghcr.io/yusiwen/drone-mcp-server:latest
environment:
DRONE_SERVER: https://drone.example.com
DRONE_TOKEN: ${DRONE_TOKEN}
MCP_AUTH_TOKEN: ${MCP_AUTH_TOKEN:-}
ports:
- "8080:8080"
command: ["--sse", "--host", "0.0.0.0"]
restart: unless-stopped
```
## 版本
预构建的二进制文件可用于 Linux(x64,arm64),macOS(x64,arm64)和 Windows(x64),可在 [GitHub Releases](https://github.com/yusiwen/drone-mcp-server/releases) 中找到。
### 版本信息
二进制文件包含版本信息:
```bash
./drone-mcp-server --version
```
输出示例:
```
drone-mcp-server
Version: v1.0.0
Commit: abc123
Build date: 2024-01-01T00:00:00Z
Go version: go1.25.1
```
## 项目结构
```
.
├── main.go # 主入口点,处理命令行参数和服务器启动
├── tool/ # 工具处理器模块
│ ├── build.go # 与构建相关的工具(list_builds, get_build, restart_build等)
│ ├── repo.go # 与仓库相关的工具(list_repos, enable_repo, disable_repo等)
│ ├── resource.go # 资源处理(drone://builds/...)
│ ├── cron.go # 定时任务管理工具
│ ├── secret.go # 机密管理工具
│ ├── user.go # 用户管理工具
│ └── template.go # 模板管理工具
├── test_env.sh # 测试脚本(使用环境变量)
├── test_mcp.go # MCP 集成测试
└── README.md
```
## 开发
### 依赖
- Go 1.21+
- [github.com/modelcontextprotocol/go-sdk](https://github.com/modelcontextprotocol/go-sdk) - MCP SDK
- [github.com/drone/drone-go](https://github.com/drone/drone-go) - Drone API 客户端
### 构建
```bash
go build -o drone-mcp-server .
```
### 测试
设置环境变量并运行服务器:
```bash
export DRONE_SERVER=...
export DRONE_TOKEN=...
./drone-mcp-server
```
## 许可证
MIT