内容
<picture>
<source media="(prefers-color-scheme: dark)" srcset=".github/images/dai-logo-dark.svg">
<source media="(prefers-color-scheme: light)" srcset=".github/images/dai-logo-light.svg">
<img alt="Digital.ai 测试 MCP 服务器" src=".github/images/dai-logo-light.svg" width="600">
</picture>
# Digital.ai 测试 — MCP 服务器
MCP(模型上下文协议)服务器,连接诸如 Claude 之类的 AI 助手与 Digital.ai 测试设备农场。该服务器公开了 **180 种工具**、**2 种资源** 和 **6 个提示**,涵盖 25 个能力领域:设备管理、测试执行、应用生命周期、报告、分析、性能、项目管理、交互式移动检查、交互式浏览器检查等。
---
## 快速入门
```bash
# 1. 拉取镜像(参见安装部分的 GHCR 身份验证)
docker pull ghcr.io/digitalai-opensource/digital-ai-testing-mcp:latest
# 2. 创建您的 .env 文件
curl -O https://raw.githubusercontent.com/digitalai-opensource/digital-ai-testing-mcp/main/.env.example
cp .env.example .env # 设置 DIGITAL_AI_BASE_URL 和 DIGITAL_AI_ACCESS_KEY
```
将以下内容添加到您的 AI 客户端(此处以 Claude Desktop 为例 - 请参阅 [连接 AI 客户端](#连接-ai-客户端) 以获取 VS Code、JetBrains、Copilot 和 Cursor 的相关信息):
```json
{
"mcpServers": {
"digital-ai-testing": {
"command": "docker",
"args": ["run", "--rm", "-i", "--env-file", "/ABSOLUTE/PATH/TO/.env",
"ghcr.io/digitalai-opensource/digital-ai-testing-mcp:latest"]
}
}
}
```
然后询问: *"显示设备农场的整体健康状况。"*
---
## 目录
- [快速入门](#快速入门)
- [前提条件](#前提条件)
- [访问密钥](#访问密钥)
- [安装](#安装)
- [配置](#配置)
- [连接 AI 客户端](#连接-ai-客户端)
- [Claude Desktop](#claude-desktop)
- [Claude Code (VS Code)](#claude-code-vs-code)
- [Claude Code (JetBrains / Android Studio)](#claude-code-jetbrains--android-studio)
- [GitHub Copilot (VS Code)](#github-copilot-vs-code)
- [Cursor](#cursor)
- [示例提示](#示例提示)
- [功能](#功能) — [docs/tools.md](docs/tools.md) 中完整的工具参考
- [工作流参考](#工作流参考)
- [POC 生命周期](#poc-生命周期)
- [项目生命周期](#项目生命周期)
- [样板生成](#样板生成)
- [推荐的代理防护措施](docs/recommended-agent-guardrails.md)
- [参考](#参考)
- [响应格式](#响应格式)
- [理解 maxResults](#理解-maxresults)
- [列表过滤器和排序](#列表过滤器和排序)
- [测试报告模式](#测试报告模式)
- [安全防护](#安全防护)
- [开发](#开发)
- [故障排除](#故障排除)
- [已知限制](#已知限制)
- [许可证](#许可证)
---
## 前提条件
- **Docker** - 运行服务器所需的
- **Node.js 22+** - 仅在从源代码构建时需要(参见安装,选项 B)
- **GitHub 组织成员身份** - 从 GHCR 拉取预构建镜像所需的(参见安装,选项 A)
- **Digital.ai 测试账户** - 有效的访问密钥
---
## 访问密钥
您的 Digital.ai 访问密钥决定了 MCP 服务器可以代表您执行的操作。有三个访问级别。
| 访问级别 | 密钥格式 | 访问权限 |
|---|---|---|
| **云管理员** | `eyJ…` (长 base-64 字符串) | 所有工具:设备管理、用户配置、项目管理、基础设施、性能数据 |
| **项目管理员** | `aut_1_…` | 限于一个项目。可以管理设备标签、查看项目管理员设置、列出用户。v2 API 工具(代理、区域、许可数据)返回 403。 |
| **项目用户** | `aut_1_…` | 限于一个项目。仅限读取/测试操作。不能管理标签、访问管理员设置或删除报告。 |
当使用项目级密钥调用云管理员工具时,MCP 会返回一个纯文本错误,解释发生了什么 - 如果配置了云管理员配置文件,则会提供一个可以直接使用的 `switch_environment(...)` 命令。
### 查找您的密钥
1. 登录到 Digital.ai 测试门户
2. 点击右上角的 **您的姓名或头像**
3. 选择 **访问密钥**
显示的密钥与门户中当前选定的 **项目** 绑定。如果您属于多个项目,每个项目都有一个单独的密钥。
### 使用多个密钥
在 `.env` 中配置命名配置文件,以便在运行时切换上下文而无需编辑文件:
```
# 默认连接(通常是云管理员凭证)
DIGITAL_AI_BASE_URL=https://your-tenant.experitest.com
DIGITAL_AI_ACCESS_KEY=eyJ...your-cloud-admin-key...
# 项目范围的配置文件
DAI_PROFILE_QA_URL=https://your-tenant.experitest.com
DAI_PROFILE_QA_KEY=aut_1_...your-qa-key...
DAI_PROFILE_STAGING_URL=https://your-tenant.experitest.com
DAI_PROFILE_STAGING_KEY=aut_1_...your-staging-key...
```
然后询问 Claude:
- *"有哪些环境已配置?"* → `list_environments`
- *"切换到 QA"* → `switch_environment("qa")`
- *"切换回云管理员"* → `switch_environment("default")`
切换立即生效 - 无需重启。
> **安全:** 永远不要将 `.env` 提交到源代码控制中。每个团队成员都应使用从门户在其自己的帐户下获得的自己的密钥。
---
## 安装
### 选项 A - 从 GitHub 容器注册表(GHCR)拉取(推荐)
无需克隆或构建。适用于标准部署。
**步骤 1 - 与 GHCR 身份验证(每台机器一次)**
在 https://github.com/settings/tokens/new 生成一个 GitHub **经典** 个人访问令牌,拥有 `read:packages` 作用域,然后:
```bash
echo YOUR_GITHUB_TOKEN | docker login ghcr.io -u YOUR_GITHUB_USERNAME --password-stdin
```
**步骤 2 - 拉取镜像**
```bash
docker pull ghcr.io/digitalai-opensource/digital-ai-testing-mcp:latest
```
**步骤 3 - 设置您的 `.env` 文件**
```bash
curl -O https://raw.githubusercontent.com/digitalai-opensource/digital-ai-testing-mcp/main/.env.example
cp .env.example .env
# 编辑 .env - 设置 DIGITAL_AI_BASE_URL 和 DIGITAL_AI_ACCESS_KEY
```
在下面的 AI 客户端配置中使用 `ghcr.io/digitalai-opensource/digital-ai-testing-mcp:latest` 作为镜像名称。
> 镜像在创建 GitHub 版本时发布 - 而不是每次提交。如果 `latest` 尚不可用,请使用[选项 B](#选项-b-从源代码构建) 从源代码构建。
> 要更新:`docker pull ghcr.io/digitalai-opensource/digital-ai-testing-mcp:latest`
---
### 选项 B - 从源代码构建
仅适用于本地开发或修改服务器。
```bash
git clone https://github.com/digitalai-opensource/digital-ai-testing-mcp
cd digital-ai-testing-mcp
cp .env.example .env
# 编辑 .env - 设置 DIGITAL_AI_BASE_URL 和 DIGITAL_AI_ACCESS_KEY
docker build -t digital-ai-testing-mcp:latest .
```
在下面的 AI 客户端配置中使用 `digital-ai-testing-mcp:latest` 作为镜像名称。
> 更改后重新构建:`docker build -t digital-ai-testing-mcp:latest .`
---
## 配置
| 变量 | 必需 | 默认值 | 描述 |
|---|---|---|---|
| `DIGITAL_AI_BASE_URL` | ✅ | - | 您的 Digital.ai 租户 URL |
| `DIGITAL_AI_ACCESS_KEY` | ✅ | - | 访问密钥 - 请参阅 [访问密钥](#访问密钥) 以获取三个访问级别和密钥格式 |
| `MCP_SERVER_NAME` | 可选 | `digital-ai-testing-mcp` | AI 客户端中显示的服务器标识 |
| `MCP_SERVER_VERSION` | 可选 | `package.json` 中的版本 | 覆盖报告的服务器版本(很少需要) |
| `REQUEST_TIMEOUT_MS` | 可选 | `30000` | API 请求超时,单位:毫秒 |
| `UPLOAD_TIMEOUT_MS` | 可选 | `120000` | 文件上传超时,单位:毫秒 |
额外的 `DAI_PROFILE_{NAME}_URL` / `DAI_PROFILE_{NAME}_KEY` 对用于配置命名配置文件,以用于多项目或多环境使用。请参阅 [访问密钥](#访问密钥) 和 `.env.example` 以获取示例。
---
## 连接 AI 客户端
所有客户端都以 Docker 容器的形式启动服务器。下面示例使用 GHCR 镜像名称(选项 A)。如果您从源代码构建(选项 B),请将镜像名称替换为 `digital-ai-testing-mcp:latest`。在所有情况下,请将 `/ABSOLUTE/PATH/TO/.env` 替换为您的 `.env` 文件的绝对路径。
### Claude Desktop
查找您的配置文件:
- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows:** 打开 Claude Desktop → 设置 → 开发者 → **编辑配置**(路径因安装方法而异 - Windows Store 与直接安装程序)
```json
{
"mcpServers": {
"digital-ai-testing": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"--env-file", "/ABSOLUTE/PATH/TO/.env",
"ghcr.io/digitalai-opensource/digital-ai-testing-mcp:latest"
]
}
}
}
```
> **从源代码构建?** 将 `ghcr.io/digitalai-opensource/digital-ai-testing-mcp:latest` 替换为 `digital-ai-testing-mcp:latest`。
重启 Claude Desktop 后编辑 - 工具会自动出现。
### Claude Code (VS Code)
1. 打开 Claude Code 扩展面板
2. 进入 **设置 → MCP 服务器**
3. 添加一个包含上述 Docker 命令的新服务器
### Claude Code (JetBrains / Android Studio)
在 JetBrains Marketplace 上安装 [Claude Code](https://plugins.jetbrains.com/plugin/22828-claude-code) 插件,然后打开您的项目并从项目根目录运行以下命令:
```bash
# macOS / Linux
claude mcp add digital-ai-testing -- docker run --rm -i --env-file /absolute/path/to/.env ghcr.io/digitalai-opensource/digital-ai-testing-mcp:latest
# Windows(使用正斜杠 - 反斜杠被 Claude Code 剥离)
claude mcp add digital-ai-testing -- docker run --rm -i --env-file C:/projects/digital-ai-testing-mcp/.env ghcr.io/digitalai-opensource/digital-ai-testing-mcp:latest
```
> **Windows 用户:** 始终使用正斜杠(`C:/path/to/.env`),永远不要使用反斜杠 - 无论您是通过上述 CLI 命令注册还是通过 Claude Code 面板(**设置 → MCP 服务器**)注册。反斜杠在 Claude Code 将配置写入 `~/.claude.json` 时会被静默剥离,从而导致路径损坏和神秘的 `-32000` 重连错误。
这会将服务器配置存储在 `~/.claude.json` 中,仅限于当前项目。或者,使用 Claude Code 面板:**设置 → MCP 服务器** 并添加与 Claude Desktop 相同的 Docker 命令(在 Windows 上使用正斜杠)。
> **从源代码构建?** 将 GHCR 镜像名称替换为 `digital-ai-testing-mcp:latest`。
重启 Claude Code 面板后添加服务器 - 工具会自动出现。
### GitHub Copilot (VS Code)
GitHub Copilot 在 **代理模式** 下支持 MCP 工具。在两种作用域中注册服务器:
**用户设置** - 在所有工作区可用。打开 `settings.json`(`Ctrl+Shift+P` → "首选项:打开用户设置(JSON)"):
```json
{
"mcp": {
"servers": {
"digital-ai-testing": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"--env-file", "/ABSOLUTE/PATH/TO/.env",
"ghcr.io/digitalai-opensource/digital-ai-testing-mcp:latest"
]
}
}
}
}
```
**工作区设置** - 仅限于一个项目。创建 `.vscode/mcp.json`:
```json
{
"servers": {
"digital-ai-testing": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"--env-file", "/ABSOLUTE/PATH/TO/.env",
"ghcr.io/digitalai-opensource/digital-ai-testing-mcp:latest"
]
}
}
}
```
将 `.vscode/mcp.json` 提交到源代码控制中可自动与整个团队共享服务器配置。
要使用工具:打开 Copilot Chat(`Ctrl+Alt+I`),将模式下拉菜单切换到 **代理**,然后输入您的请求。
> GitHub Copilot 在 Web 上(`github.com/copilot`)不支持外部 MCP 服务器。需要 VS Code。
### Cursor
Cursor 支持 **代理模式** 下的 MCP。 在 **Cursor 设置 → MCP**(或 `Cursor 设置 → 功能 → MCP`)中使用相同的 Docker 命令添加服务器:
```json
{
"mcpServers": {
"digital-ai-testing": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"--env-file", "/ABSOLUTE/PATH/TO/.env",
"ghcr.io/digitalai-opensource/digital-ai-testing-mcp:latest"
]
}
}
}
```
或者,创建项目根目录下的 `.cursor/mcp.json` 文件,并包含相同的 `mcpServers` 对象 - 这将服务器范围限定为该工作区,可以提交以与团队共享。
> **从源代码构建?** 将 GHCR 镜像名称替换为 `digital-ai-testing-mcp:latest`。
> Cursor 适用于 macOS、Windows 和 Linux。它是 macOS 上推荐的选项,其中 Xcode 是主要 IDE,但不支持 MCP。
---
## 示例提示
连接后,用自然语言与服务器对话 - 无需工具名称:
- *"显示设备农场的整体健康状况 - 多少设备可用、预留和离线?*
- *"在 US2 区域查找至少运行 13 版本的可用 Android 手机"*
- *"QA 项目今天的所有测试是否通过了? 我需要一个 go/no-go 用于发布。*
- *"在所有可用的 Android 设备上安装 QA 项目的最新版本"*
- *"查找可用的 Android 手机,然后生成 Java JUnit5 测试样板"*
- *"显示按 OS 的通过/失败分解 - Android 和 iOS 的失败率不同吗?*
- *"最新版本是否引入了 CPU 回归? 比较版本 10553 和 10554 在 Android 上的表现。*
- *"设置 Acme Corp 的新 POC - 6 台设备在 US2、3 台 iOS 和 3 台 Android 设备,直到 8 月 31 日"*
**[→ docs/examples.md](docs/examples.md)** 有 200+ 提示,按场景组织:农场健康状况、设备组、回归签发、测试分析、性能、交互式检查、POC 生命周期等。
---
## 功能
25 个功能域中的 180 种工具。完整的工具参考 - 描述、过滤器、身份验证要求和使用说明 - 位于 **[docs/tools.md](docs/tools.md)**。
| 领域 | 工具 | 亮点 |
|---|---|---|
| [设备](docs/tools.md#devices) | 18 | 列出/查询设备、查找可用设备、释放、重启、标签、Mobile Studio |
| [设备组](docs/tools.md#device-groups) | 9 | 创建组、移动设备、控制项目访问 |
| [预留](docs/tools.md#reservations) | 5 | 预留设备、检查可用窗口 |
| [应用程序](docs/tools.md#applications) | 14 | 上传、生成本地上传命令、安装/卸载、查找最新版本 |
| [存储库](docs/tools.md#repository) | 6 | 测试数据文件存储 |
| [浏览器](docs/tools.md#browsers) | 3 | Selenium 浏览器会话管理 |
| [用户](docs/tools.md#users) | 8 | 账户配置、项目分配、标签 |
| [项目](docs/tools.md#projects) | 17 | 创建/配置项目、设置、应用分配 |
| [配置配置文件](docs/tools.md#provisioning-profiles) | 5 | iOS 签名生命周期 |
| [备份](docs/tools.md#backup) | 1 | 触发系统备份 |
| [健康 & 诊断](docs/tools.md#health--diagnostics) | 11 | 农场健康状况、就绪检查、许可利用率 |
| [覆盖率分析](docs/tools.md#coverage-analytics) | 2 | 已测试 vs. 可用设备差距分析 |
| [报告](docs/tools.md#reporting) | 17 | 搜索/过滤测试报告、稳定性、趋势、清理 |
| [测试视图](docs/tools.md#test-views) | 7 | 仪表视图](|docs/tools.md#test-views) | 7 | 仪表板视图组 |
| [事务 & 性能](docs/tools.md#transactions--performance) | 4 | CPU/内存/电池/速度指数分析 *(云管理员)* |
| [代理](docs/tools.md#agents) | 2 | 主机状态 *(云管理员)* |
| [区域](docs/tools.md#regions) | 2 | 区域状态和基础设施拓扑 *(云管理员)* |
| [NV 服务器](docs/tools.md#nv-servers) | 2 | 网络虚拟化服务器 *(云管理员)* |
| [环境管理](docs/tools.md#environment-management) | 2 | 命名连接配置文件,运行时切换 |
| [工作流](docs/tools.md#workflows) | 6 | POC 和项目生命周期编排 |
| [样板生成](docs/tools.md#boilerplate-generation) | 3 | 即用 Appium 和 Selenium 测试脚本,支持 4 种语言;交付前验证脚本 |
| [远程调试](docs/tools.md#remote-debug) | 1 | 将云设备连接到本地 ADB 设备 |
| [移动检查会话](docs/tools.md#mobile-inspection-sessions) | 22 | AI 驱动的实时设备交互 - 截图、元素发现、完整手势集、按键、应用/设备控制 |
| [网页检查会话](docs/tools.md#web-inspection-sessions) | 8 | AI 驱动的实时浏览器交互 - 导航、Shadow DOM 元素发现、CSS 选择器验证、浏览器中立的 Selenium 脚本生成 |
| [性能比较](docs/tools.md#performance-comparison) | 4 | 双设定 Speed Index 比较,具有混杂检测、MAD 离群值排除和新鲜样本生成 *(云管理员)* |
| [资源 & 提示](docs/tools.md#resources--prompts) | - | 2 个环境资源,6 个引导提示 |
---
## 工作流参考
### POC 生命周期
三个工具涵盖完整的POC生命周期。所有工具都派生项目名称 (`"<Customer> POC"`) 和设备标签 (`"<customername>poc"`) - 在所有三个工具中一致使用 `customerName` - 请始终使用相同的值。
---
### 仓库贡献
本仓库仅包含文档翻译部分,欢迎通过提交 PR 为该项目做出贡献。
#### `create_poc` — 开启新的POC环境
收集所有参数,呈现确认摘要给操作员,然后执行10个顺序步骤:
1. 创建(或重用)一个名为 `<客户> POC` 的设备组
2. 定位默认设备组
3. 从默认组中选择可用的手机 — 区域匹配,无冲突标签,仅限手机(排除平板电脑)。在继续之前,将选择结果呈现给操作员进行确认。
4. 将选定的设备添加到POC组
5. 为每个设备添加派生的POC标签(例如 `acmecorppoc`)
6. 创建(或重用)一个项目;记录Salesforce URL和项目备注中的结束日期
7. 从默认组中删除设备 — 仅在项目存在后执行,以免项目创建失败导致设备 stranded
8. 定位默认项目
9. 创建用户,分配到POC项目,删除默认项目,并为每个帐户添加POC标签。绝不会通过此工作流程授予Cloud Admin访问权限。
10. 将ExperiBank(或指定的应用)分配给POC项目 — 如果找不到确切的版本,则回退到最新的可用版本
如果任何步骤失败,工作流程将停止,报告已完成的步骤和所有创建的资源ID,并提供恢复(重新调用 — 检测到现有资源并重用)或解开(`delete_poc`)路径。
**必填参数:**
| 参数 | 描述 |
|---|---|
| `customerName` | 例如 `"Acme Corp"` → 派生项目 `"Acme Corp POC"` 和标签 `"acmecorppoc"` |
| `region` | 测试区域,例如 `"US2"`、`"EU"`、`"SG"` |
| `salesforceUrl` | Salesforce Opportunity URL — 记录在项目备注中 |
| `endDate` | 接受ISO(`"2026-08-31"`)、相对偏移(`"+14d"`、`"+2w"`)或自然语言(`"in 2 weeks"`) |
| `users` | 数组 `{email, firstName, lastName, role}` — 角色必须是 `"User"` 或 `"ProjectAdmin"` |
**可选参数:**
| 参数 | 默认值 |
|---|---|
| `deviceCount` | `6` |
| `iosCount` | `ceil(deviceCount / 2)` |
| `androidCount` | `floor(deviceCount / 2)` |
| `automationType` | `"appium-server"` (替代:`"appium-grid"`) |
| `appName` | `"ExperiBank"` |
| `appVersion` | `"1.0"` |
步骤1和6在创建前检查是否存在同名的组/项目 — 允许在部分失败后重新运行。
---
#### `close_poc` — 逐步关闭,无需删除
逆向 `create_poc` 的设备和用户更改,同时保留项目和设备组:
1. 按派生名称定位POC项目和设备组
2. 列出POC组中的设备
3. 从每个设备中删除POC标签(保留所有其他标签)
4. 将设备从POC组移出并返回默认组
5. 按POC标签处理用户:**删除没有任何其他项目成员资格的帐户;仅为也属于其他项目的用户撤销POC访问权限**
仅 `customerName` 是必需的。
> Digital.ai REST API 不提供用户锁定或禁用端点。通过 `delete_user` 删除帐户是唯一可用的 API 方式,用于删除仅为 POC 提供的用户访问权限。
---
#### `delete_poc` — 完全拆除
执行与 `close_poc` 相同的逐步关闭,然后永久删除设备组和项目。需要 `confirmDeletion: true`。
在任何破坏性操作之前,工作流程会收集完整的库存(项目ID、组ID、设备列表、用户明细),并呈现给明确确认。与 `close_poc` 不同,用户处理是通过此前期库存进行批量确认的,而不是通过每个用户的提示。
**最佳实践:** 首先运行 `close_poc` — 它在保留项目和设备组的同时逐步关闭。注意, `close_poc` 不是完全可逆的:设备移动和标签删除可以撤销,但它永久删除POC-only用户帐户(每个删除需要逐一确认操作员)。仅在确认项目数据不再需要时才使用 `delete_poc`。如果没有 `confirmDeletion: true`,调用 `delete_poc` 将返回一个安全说明,并建议使用 `close_poc` 作为替代。
---
## 项目生命周期
三个工具镜像POC生命周期,用于常规项目管理。它们应用相同的多项目用户保护规则:属于其他项目的用户仅被撤销当前项目的访问权限,绝不会从平台中删除。
#### `setup_project` — 配置新的项目环境
在开始时,工作流程会询问是否仅创建简单的项目记录还是完整的环境(设备组、设备分配、用户配置、应用分配)。
完整设置步骤:
1. 创建(或重用)具有指定名称和自动化类型的项目;记录项目备注中的备忘录
2. 创建(或重用)设备组并将其链接到项目
3. 飞行前检查目标应用是否存在于存储库中
4. 选择匹配目标OS和区域的可用设备 — 呈现给操作员进行确认
5. 将选定的设备添加到项目组
6. 为每个设备添加项目派生的标签
7. 从其他组中删除设备 — 仅当 `isolateDevices: true` 时;默认情况下,现有的组链接(包括默认)保持完整
8. 创建用户,将他们分配给项目并具有指定角色,从默认项目中删除,并标记每个帐户
9. 将指定应用程序分配给项目
**必填参数:**
| 参数 | 描述 |
|---|---|
| `projectName` | 新项目的名称 |
| `region` | 设备选择的目標区域 |
**可选参数:**
| 参数 | 默认值 | 描述 |
|---|---|---|
| `deviceCount` | `6` | 要分配的总设备数 |
| `iosCount` | `ceil(deviceCount / 2)` | iOS 设备数量 |
| `androidCount` | `floor(deviceCount / 2)` | Android 设备数量 |
| `automationType` | `"appium-server"` | `"appium-server"` 或 `"appium-grid"` |
| `isolateDevices` | `false` | 在分配前从所有其他组中删除设备 |
| `users` | `[]` | `{email, firstName, lastName, role}` 数组 |
| `appName` | _(无)_ | 要分配给项目的应用 |
| `memo` | _(无)_ | 要记录在项目上的备注 |
---
#### `close_project_resources` — 释放资源,无需删除
在保留项目记录的同时逐步关闭项目环境:
1. 定位项目及其关联的设备组
2. 列出项目组中的设备
3. 从每个设备中删除项目派生的标签
4. 将设备返回默认组
5. 处理用户:**删除没有任何其他项目成员资格的帐户;仅为多项目用户撤销项目访问权限** (每个操作由操作员单独确认)
仅 `projectName` 是必需的。活跃的会话和安装在设备上的应用程序不会被触及 — 如有需要,请单独使用 `release_orphaned_sessions` 释放会话,使用 `uninstall_application` 删除应用程序。
---
#### `teardown_project` — 完全项目删除
执行 `close_project_resources` 的所有步骤,然后永久删除设备组和项目。需要 `confirmDeletion: true`。
工作流程在任何不可逆操作之前呈现完整的库存摘要。应用相同的多项目用户保护。
**最佳实践:** 首先运行 `close_project_resources`,然后在调用 `teardown_project` 之前确认项目不再需要。
---
## 模板生成
### 创建测试的两种方法
服务器支持两种测试创建模式,适用于移动和Web,并根据上下文指示代理在它们之间路由:
| | **自主** (`get_test_boilerplate` / `get_web_test_boilerplate`) | **交互** (`start_inspection_session` / `start_browser_inspection_session` / `collaborative_test_creation` / `collaborative_web_test_creation` 提示) |
|---|---|---|
| **何时** | 意图具体 — 标准化流程(“创建登录测试”)或逐级细节 — 以及可以选择选择器(工作区中的应用源或之前的检查会话) | 请求模糊(“我想要应用X的测试”),无源访问(仅聊天,或没有此应用代码的IDE),或用户想要在实时设备或浏览器上观看/驱动 |
| **用户参与** | 不需要 — 代理从模板+源知识+最佳实践编写测试 | 协作 — 代理与用户逐步构建测试(浏览器会话中继截图;移动会话共享实时设备视图URL) |
| **输出** | 在IDE中:本地测试自动化项目。仅聊天:内联呈现可移植项目文件 | 相同,加上选择器在途中针对真实应用或页面验证 |
**混合通常最佳:** 即使在自主模式下,代理也可以打开一个简短的检查会话 — 无需用户参与 — 来捕获或验证元素ID或CSS选择器。代理被明确指示 **绝不伪造选择器** — 当有疑问时,它会验证实时,当模式本身不明确时,它会询问。
> **更强的保证:** 服务器在MCP `instructions`中自动提供此路由策略,并且两个模板工具在结构上拒绝为真实应用或URL发出代码而没有验证的选择器。因为并非每个客户端都公开服务器 `instructions` — 而且没有MCP服务器可以拦截代理手动编写的文件 — 您可以安装客户端强化以获得更强、与客户端无关的保证。参见 **[推荐的代理防护措施](docs/recommended-agent-guardrails.md)**。
### `get_test_boilerplate`
生成一个完整、预配置的Appium测试脚本。Digital.ai服务器URL和访问密钥从活动连接配置文件中预填充 — 切换配置文件以生成带有项目范围密钥的脚本,而不是您的管理员密钥。
| 参数 | 值 | 默认值 |
|---|---|---|
| `platform` | `android` \| `ios` | _(必填)_ |
| `language` | `java-junit5` \| `java-testng` \| `nodejs` \| `python` | _(必填)_ |
| `appId` | `list_applications` 的数字应用ID | 推荐 |
| `deviceCategory` | `PHONE` \| `TABLET` | `PHONE` |
| `testName` | 任意字符串 | `"My First Mobile Test"` |
| `packageName` | Android包名(例如 `com.mycompany.app`) | _(可选)_ |
| `mainActivity` | Android主活动(例如 `.MainActivity`) | _(可选)_ |
| `bundleIdentifier` | iOS包ID(例如 `com.mycompany.app`) | _(可选)_ |
| `region` | `find_available_device` 响应中的区域代码(例如 `US2`、`SG1`) | _(可选,强烈推荐)_ |
| `projectType` | `standalone-gradle` \| `standalone-maven` \| `android-gradle-submodule` | `standalone-gradle` |
| `includePerformanceTransactions` | `true` \| `false` | `false` |
| `includeAxeScan` | `true` \| `false` | `false` |
| `confirmSelectorsVerified` | `true` \| `false` | _(可选)_ |
| `outputFormat` | `json` \| `human` | `json` |
> **检查门(v42):** 当您针对真实应用(`appId`/`packageName`/`bundleIdentifier`)时,此工具返回 **无代码** 和结构化 `{ status: "blocked", reason: "no_verified_selectors" }` 错误,除非MCP过程中存在实时检查会话,或您设置 `confirmSelectorsVerified: true` (用于通过rdb/UIAutomator、`open_mobile_studio`或权威源捕获的选择器的逃生舱)。内置的ExperiBank演示(无应用标识符)永远不会被阻塞。这使得在结构上不可能接收占位符脚手架并将其作为完成的测试交付。
**推荐工作流程** 用于构建新测试:
1. `get_application_info` — 确认包名、启动活动和应用ID
2. `get_test_boilerplate` — 生成具有预填充功能的启动测试(此步骤)
3. `open_mobile_studio` 或 `get_automation_properties` — 检查实时元素ID(无需ADB)
4. `release_orphaned_sessions(maxAgeHours=4, dryRun=true)` — 预飞行设备检查
5. `find_available_device` — 选择一个健康的设备并读取其 `region`
6. 编写/运行测试
7. `release_device` — 显式清理
**性能事务:** 传递 `includePerformanceTransactions: true` 用 `startPerformanceTransaction` / `endPerformanceTransaction` 调用括住测试主体。开始参数是NV网络配置文件(默认为`"Monitor"` — 观察而不限制);结束参数是事务名称。平台记录CPU、内存、电池和速度指数指标;结果出现在报告器事务选项卡(`endPerformanceTransaction`后~1分钟)和 `list_transactions` 查询。先决条件:NV服务器必须在线并在设备区域连接隧道(`list_nv_servers`)。注意:限流配置文件立即激活NV整流;`"Monitor"` 是直通且无ANR风险。
**无障碍扫描:** 传递 `includeAxeScan: true` 以注入Deque Axe DevTools Mobile无障碍扫描(`mobile: axeScan` 执行脚本调用)。自动设置所需的 `appium:automationName` 功能(Android的AxeUiAutomator2,iOS的AxeXCUITest)。需要MCP环境中的`AXE_DEVTOOLS_API_KEY`。
两个标志可以组合 — Axe扫描在性能事务边界内运行。
**元素定位器:** 使用 `open_mobile_studio` — 它是平台的原生UI检查器,不需要本地工具。对于需要直接ADB访问的场景(文件推送、shell命令),使用 `get_remote_debug_command` 连接设备本地。
> ⚠️ 生成的脚本是一个 **最终产品工件** — 不要将其作为发现步骤执行。运行它时没有已知元素选择器会创建整个团队可见的不完整会话。使用 `open_mobile_studio` 先发现选择器。
### `validate_test_script`
交付后备措施(v43)适用于 `get_test_boilerplate` 门控无法捕获的情况 — 手工编写的选择器测试。通过呈现或保存任何测试之前传递完整的 `scriptContent` ;它扫描未替换的 `<…>` 占位符选择器、故意搭建的防护措施、占位符/伪造的凭证和已知先前制造事件的资源ID。返回 `isError` 并在找到任何高严重性模式时返回 `fail` 判决,因此无法交付非功能性测试。 `pass` 是必要但不充分的 — 它确认明显的占位符已消失,而不是选择器是真实的;实时检查仍然是权威来源。
| 参数 | 值 | 默认值 |
|---|---|---|
| `scriptContent` | 完整的测试脚本文本 | _(必填)_ |
| `fileName` | 结果的标签 | _(可选)_ |
| `outputFormat` | `json` \| `human` | `json` |
`projectType` 仅控制Java输出布局(忽略Node.js和Python): `standalone-gradle` 生成 `src/test/java/` 同时具有 `build.gradle` 和 `pom.xml`; `standalone-maven` 仅生成 `pom.xml`; `android-gradle-submodule` 将文件范围限定在 `e2e-tests/` 以嵌入现有Android Studio项目。
**每种语言生成的文件:
| 语言 | 文件 |
|---|---|
| `java-junit5` / `java-testng` | `AndroidNative.java` 或 `iOSNative.java` + `build.gradle` + `pom.xml` |
| `nodejs` | `wdio.conf.js` + 测试文件 + 设置shell步骤 |
| `python` | 测试文件 + `requirements.txt` |
所有模板默认为ExperiBank演示应用作为起点。ExperiBank可在大多数农场设备上验证连接性,然后切换到您自己的应用。
### `get_web_test_boilerplate`
生成用于浏览器测试的完整、预配置的Selenium测试脚本。Digital.ai服务器URL和访问密钥从活动连接配置文件中预填充。
| 参数 | 值 | 默认值 |
|---|---|---|
| `language` | `java-junit5` \| `java-testng` \| `nodejs` \| `python` | _(必填)_ |
| `url` | 被测试页面的URL | _(可选)_ |
| `testName` | 任意字符串 | `"My First Web Test"` |
| `targetBrowser` | `chrome` \| `firefox` \| `edge` \| `safari` | _(可选)_ |
| `shadowDomSupport` | `auto` \| `always` \| `never` | `auto` |
| `confirmSelectorsVerified` | `true` \| `false` | _(可选)_ |
| `outputFormat` | `json` \| `human` | `json` |
> **检查门:** 当您针对真实URL(提供 `url`)时,此工具返回 **无代码** 和结构化 `{ status: "blocked", reason: "no_verified_selectors" }` 错误,除非MCP过程中存在实时浏览器会话,否则您设置 `confirmSelectorsVerified: true` (用于通过先前的 `start_browser_inspection_session` 会话捕获的选择器)。这与移动模板门控镜像。
**浏览器中立:** 当 `targetBrowser` 被省略时,生成的脚本在运行时从环境变量 `BROWSER` 读取浏览器名称。这意味着相同的脚本在Chrome、Firefox、Edge和Safari上运行而无需修改 — 只需更改env变量或CI矩阵。指定 `targetBrowser` 仅当您需要浏览器特定选项(例如Safari会话设置)时才需要。
**Shadow DOM支持:`shadowDomSupport` 为 `auto` (默认值)或 `always`。当`shadowDomSupport`为`auto`或`always`时,生成的脚本包括一个`shadowQuery(host, cssSelector)`助手,用于使用`executeScript`遍历到shadow根。将其用于构建Web组件、Lit、Polymer或其他shadow-DOM框架的应用。 `get_page_dom`在检查期间自动检测shadow DOM,并报告存在时`hasShadowDom: true`。
**推荐的Web测试构建工作流程:
1. `list_available_browsers` — 确认哪些浏览器和操作系统组合在您的区域可用
2. `start_browser_inspection_session` — 在目标URL上打开实时浏览器会话
3. `get_page_dom` — 提取渲染的DOM,包括shadow树;注意元素ID和`data-testid`值
4. `find_web_elements` / `tap_element` / `type_into_element` — 与元素交互以验证选择器是否有效
5. `take_inspection_screenshot` — 在每个关键步骤中中继截图以进行验证
6. `stop_browser_inspection_session`
7. `get_web_test_boilerplate(confirmSelectorsVerified: true)` — 生成已验证的脚本
## 性能比较报告
比较两个条件集之间的性能(速度指数、CPU、内存、电池、持续时间)- 应用 v1 与 v2、设备 A 与设备 B、操作系统版本 X 与 Y、地区与地区、两个网络配置文件或两个自动化脚本。适用于所有访问级别 - 云管理员可以看到所有项目;项目级密钥(项目管理员和项目用户)只能看到自己项目的事务。
headline 指标以三种方式报告每次 - **修剪平均值、中位数和原始平均值** - 因此,小样本或噪声样本不能隐藏在单个数字后面。
| 工具 | 用途 |
|---|---|
| `compare_performance_transactions` | 两组比较;每侧修剪平均值/中位数/平均值 + 增量和百分比变化。 默认排除 MAD 离群值(每侧 ≥4 个样本)。传递 `comparisonAxis` 以嵌入混杂检查。 |
| `assess_comparison_confounds` | 裁决 - **干净 / 有条件 / 混杂** - 通过标记除声明轴(设备型号、操作系统、操作系统版本、网络配置文件、项目、事务名称)之外的任何维度在两侧之间或内部的变化,以及缺少遥测和样本不平衡。 |
| `detect_performance_outliers` | 单个集合上的鲁棒中位数/MAD 离群值标记;返回保留的集合和推荐的排除/重新运行。 |
| `performance_transaction_control` | 第 2 阶段:在检查会话中生成新的样本 - `start`(带有 NV 配置文件)→ 运行验证的流程 → `end`(命名记录)。记录在约 1 分钟后出现在报告中。 |
> **为什么混杂检查很重要:** 比较事务 1894(速度指数 1015)和 1895(1000)似乎是 1.5% 的版本差异 - 但它们在不同的设备型号、不同的操作系统版本和不同的项目上运行,并且 1894 没有 CPU/内存遥测。`assess_comparison_confounds` 返回 **混杂** 并命名所有三个,因此差异永远不会被误读为版本回归。
**`performance_comparison_report` 提示** 统筹整个工作流程:定义轴 → 清除混杂因素 → 确定样本大小 → **需要明确的计划确认和时间估计** → 运行具有离群值驱动的重新运行的系列 → 用根本原因推理报告增量。
---
## 参考
### 响应格式
所有返回数据的工具都接受 `outputFormat` 参数:
| 值 | 默认值 | 使用场景 |
|---|---|---|
| `"json"` | ✅ 是 | 链接工具调用 - ID 和值直接传递给下一个工具,无需解析 |
| `"human"` | 否 | 显示结果给操作员 - 格式化为易读的文本,带有状态指示器 |
默认值为 `"json"`,因为主要消费者是 AI 代理,它们需要提取 ID 以进行后续调用。代理可以渲染 JSON 以供人类显示;它们不能可靠地解析文本以提取 ID。
```json
# 示例:传递设备组 ID,无需字符串操作
list_device_groups { outputFormat: "json" }
→ {"deviceGroups":[{"id":"7","name":"Default"},{"id":"12","name":"Acme Corp POC"}]}
get_devices_in_group { groupId: "7" }
→ {"devices":[{"id":"abc123","name":"iPhone 14 Pro",...}]}
add_devices_to_group { groupId: "12", deviceIds: ["abc123"] }
```
仅执行变异的工具(创建、删除、安装等)返回简单的成功字符串,不具有 `outputFormat` 参数。
### 了解 maxResults
Digital.ai API 返回完整的数据集 - 大多数端点没有服务器端分页。MCP 将响应限制在 `maxResults`(默认值:50,最大值:500)以保持响应大小可控,适用于 AI 助手。
使用过滤器缩小结果范围,而不是提高 `maxResults`。当结果被截断时,您将看到:
> ⚠️ 显示 50 个,共 312 个结果。使用过滤器缩小结果范围,或增加 maxResults(最大 500)以查看更多。
### 列表过滤器和排序
| 工具 | 可用过滤器 | 可用 `sortBy` 值 |
|---|---|---|
| `list_users` | firstName, lastName, email, authenticationType, isCloudAdmin, tag | firstName, lastName, email, userName, authenticationType |
| `list_devices` | query (@-syntax), region, model | deviceName, deviceOs, osVersion, manufacturer, displayStatus, agentName, region |
| `get_devices_in_group` | osType, status, category, excludeTags, requireTags | _(无)_ |
| `list_reservations` | username, project, deviceUid | reservationStart, reservationEnd, username, project, deviceUid |
| `list_projects` | name (部分匹配) | name, id |
| `list_project_users` | username (部分), role (精确) | firstName, lastName, email, userName, role |
| `list_applications` | nameContains, osType, packageName, bundleIdentifier, fileType, isForSimulator | applicationName, version, createdAt (默认), osType |
| `list_test_reports` | status, name, has_attachment, success; startDate/endDate (日期范围) | start_time |
所有列表工具都接受 `sortOrder: "asc" | "desc"`(默认值:"asc")。
### 测试报告架构
报告字段使用 **snake_case** 以匹配 API 响应:
| 字段 | 类型 | 描述 |
|---|---|---|
| `uuid` | 字符串 | 唯一的测试执行标识符 |
| `test_id` | 数字 | 数值报告 ID |
| `name` | 字符串 | 测试名称 |
| `status` | 字符串 | `Passed`, `Failed`, `Incomplete`, `Skipped`, `Error`, `Healed` |
| `success` | 布尔值 | 当状态为 Passed 时为真 |
| `start_time` | 字符串 | ISO 8601 执行开始时间戳 |
| `duration` | 数字 \| 空值 | 毫秒(`null` 表示进行中的会话) |
| `project_id` | 数字 | 所属项目 |
| `has_attachment` | 字符串 | `"Y"` 或 `"N"` |
**确认有效的过滤器属性:** `status`, `name` (使用 `contains` 进行子字符串匹配), `has_attachment`, `success`, `test_id`, `project_id`, `device.os` (区分大小写:`"Android"` / `"iOS"`), `duration`, `attachment_count`, `attachments_size`, `status_code`. 运算符:`=`, `>`, `<`, `>=`, `<=`, `contains`.
**CSRF 阻止的过滤器** - 返回 401,无论密钥类型如何:`start_time`, `create_time`, `uuid`. 使用 `list_test_reports` 上的 `startDate`/`endDate` 参数进行日期范围过滤。
**报告 ID 类型:**
| 标识符 | 来源 | 如何检索 |
|---|---|---|
| `test_id` | 列表结果 | `get_test_report(testId: N)` |
| `uuid` | 列表结果 | 无直接端点 - 通过 `test_id` 查找 |
| `report_api_id` | 会话启动工具返回 | `get_test_by_report_id(reportApiId: "...")` - 等待会话关闭约 60 秒 |
**示例:**
```
# 最近的失败
list_test_reports
filter: [{"property":"status","operator":"=","value":"Failed"}]
sort: [{"property":"start_time","descending":true}]
limit: 20
# 日期范围
list_test_reports
startDate: "2026-05-01T00:00:00Z"
endDate: "2026-05-15T23:59:59Z"
# 按操作系统划分的通过/失败
get_grouped_test_reports
groupBy: ["device.os"]
pivotBy: ["status"]
# 项目摘要
get_project_test_summary
startDate: "2026-05-01T00:00:00Z"
projectName: "我的项目"
```
---
## 安全防护
所有破坏性操作都需要 `confirmDeletion: true`. 没有它:
> ⚠️ 安全防护触发。 "删除用户 42" 是一个无法撤销的破坏性操作。包含 `confirmDeletion: true` 以继续。未进行任何更改。
第一个调用准确描述了将要删除的内容。第二个调用 - 使用 `confirmDeletion: true` - 执行删除。这可以防止 AI 助手误解意图时发生意外数据丢失。
在任何请求离开服务器之前,会运行另外两个防护:
- **身份验证预检:** 报告删除工具(`delete_test_reports*`, `cleanup_inspection_sessions`)首先检查活动密钥类型,如果使用项目级密钥调用,则返回清晰的“切换到云管理员配置文件”消息,而不是不透明的 CSRF 401 错误。
- **上传路径验证:** 读取本地文件以进行上传的工具拒绝相对路径、路径遍历和凭证文件名称(`.env*`、SSH 私钥)- 误导性请求无法将机密发布到云存储库。
---
## 开发
```bash
npm install
npm run build # 编译 TypeScript 到 dist/
npm run dev # nodemon + ts-node 实现实时重载
```
**运行测试** - 大多数测试套件需要一个有效的 `.env` 文件和有效的凭证,并调用真正的 Digital.ai API。例外是 `test:tools`,它通过内存中的 MCP 传输在没有实时 API 访问的情况下练习已注册的工具处理程序(防护、身份验证门、路径验证):
```bash
npm run test # 所有测试
npm run test:tools # 工具层防护/门回归测试(离线)
npm run test:devices # 设备管理
npm run test:users # 用户管理
npm run test:applications # 应用生命周期
npm run test:reservations # 预订
npm run test:projects # 项目管理
npm run test:reporting # 测试报告
npm run test:test-views # 测试视图组
npm run test:browsers # 浏览器/Selenium
npm run test:device-groups # 设备组
npm run test:repository # 文件存储库
npm run test:provisioning # iOS 配置文件
npm run test:health # 环境健康
npm run test:utils # 实用函数
npm run test:transactions # 性能事务
npm run test:analytics # 分析工具
npm run test:infrastructure # 代理 / 地区 / NV 服务器 / 会话
```
也可以从 VS Code 运行测试:`Ctrl+Shift+P` → “Tasks: Run Task”。
---
## 故障排除
### 常见症状
| 症状 | 原因 | 修复 |
|---|---|---|
| 管理工具上的 `403 Forbidden`(代理、区域、许可证) | 活动配置文件是项目级密钥 - v2 端点需要云管理员访问权限 | 请 Claude: *"切换到我的云管理员配置文件"* - 它将调用 `list_environments` 并选择正确的配置文件 |
| 报告删除工具返回“需要云管理员访问权限” | 报告突变端点对项目级密钥(项目管理员和项目用户)禁用 CSRF | 切换到云管理员配置文件,重新运行,切换回来 |
| `install_application` 在您可以看到的设备上返回 400 | 设备通过 rdb(远程调试)会话保留 | 先 **安装**,然后运行 `get_remote_debug_command` - 不要反过来 |
| `install_application` 返回 400(无 rdb 参与) | 应用未分配给包含目标设备的项目 | 先调用 `assign_app_to_project` |
| 可重复的 `NoSuchElementException`,而 sibling 测试通过 | 设备健康状况,不是测试代码 - 设备卡在错误状态或离线但被合并 | 运行 `get_device_health_summary`;在 `@region='<healthy-region>'` 上限定 deviceQuery |
| `list_test_reports` 结果中缺少测试 | 项目有自己的报告实例 - 未限定的查询搜索默认范围 | 传递 `projectName`(`list_projects` 中的确切名称) |
| rdb 失败:`validation error / Failed to reserve device` | 项目级密钥解析为内部设备 ID 而不是真实的序列号 | 请 Claude: *"切换到云管理员"* → 重新生成 rdb 脚本 → 切换回来 |
| 设备查询因 `@manufacturer` / `@tag` 而无结果 | 这些字段在服务器端被静默忽略 | 在 `find_available_device` 上使用 `manufacturer`/`tags` 参数 - 它们在客户端过滤 |
### `Failed to reconnect to digital-ai-testing: -32000`
在 Windows 上,这通常意味着 `--env-file` 路径存储时已剥离反斜杠。打开 `~/.claude.json`,找到该项目的 `mcpServers` 条目,并检查 env 文件路径是否正确(例如 `C:/projects/digital-ai-testing-mcp/.env`)。如果它显示类似 `C:projectsdigital-ai-testing-mcp.env`,则反斜杠被删除。在文件中直接修复路径(使用正斜杠),然后运行 `/mcp` 进入 Claude Code 以重新连接。
### 工作流工具失败?
运行此序列:
```
1. get_server_info — 确认工具数量(期望 180)和活动配置文件
2. check_workflow_readiness — 哪些依赖工具存在或缺失
3. check_connectivity — 确认后端 API 可达
```
`check_workflow_readiness` 返回结构化报告:
```json
{
"allWorkflowsReady": true,
"registeredToolCount": 180,
"workflows": {
"create_poc": { "ready": true, "missingRead": [], "missingWrite": [] },
"setup_project": { "ready": true, "missingRead": [], "missingWrite": [] }
}
}
```
如果 `ready` 为 `false`,则 `missingRead` 和 `missingWrite` 会列出缺少的工具。最常见的原因是 Docker 镜像过时 - 重建:
```bash
docker build -t digital-ai-testing-mcp:latest .
```
服务器在启动时还会记录就绪检查(在 Docker 日志中可见):`Workflow readiness: all workflows ready ✓`,或 `⚠️ DEGRADED: create_poc — missing: ...` 当工具缺失时。
---
## 已知限制
四个最常见的问题:
1. **没有 API 来触发 Appium 测试执行。** 测试从 Appium 客户端(IDE、CI 脚本)启动。服务器管理设备、应用、预订和结果 - 它本身无法启动 Appium 会话。(交互式 [移动检查会话](docs/tools.md#mobile-inspection-sessions) 和 [浏览器检查会话](docs/tools.md#web-inspection-sessions) 是例外:用于 Android、iOS 和桌面浏览器的实时 WebDriver 会话,用于元素发现。)
2. **检查会话支持 Android 和 iOS**,在旧的 Appium Grid(JWP)和 Appium Server(W3C/OSS)项目上。iOS 注意事项:没有清除应用数据,Grid 设备上没有剪贴板,导航栏按钮(iOS 没有返回按钮)用于后退导航。
3. **没有用户禁用/锁定端点。** 删除仅用于 POC 的用户意味着删除帐户 - 这就是 `close_poc` 需要每个用户确认的原因。
4. **项目级密钥的报告 API 限制** - 服务器端排序和报告删除需要云管理员访问权限。工具会自动补偿(客户端排序,清除预检错误),但在项目级密钥下,查询速度较慢。
查看 [docs/limitations.md](docs/limitations.md) 以获取完整的 14 项列表。
---
## 许可证
本项目根据 Apache License, Version 2.0 授权。完整许可证文本请参见 [LICENSE](./LICENSE)。
使用此软件还需遵守 [Supplemental Terms of Use](./SUPPLEMENTAL_TERMS.md),其中涉及 AI 客户端责任、代理行动风险、责任限制以及其他与 Digital.ai MCP Server for Testing 相关的义务。通过使用此软件,您同意 Apache 2.0 许可证和补充使用条款。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器