diff --git a/README.md b/README.md index 3c568fe..60fbac7 100644 --- a/README.md +++ b/README.md @@ -1,372 +1,38 @@ -# 禅道 MCP +# MCP Tools Monorepo -让 AI 助手能够直接管理禅道中的 Bug、需求、测试用例、文档、产品、项目、用户和附件。 +AI 助手工具集 — 通过 MCP (Model Context Protocol) 让 AI 客户端管理禅道、TestLink、Apifox 等平台。 -本项目提供两种使用方式: +## 📦 Packages -- **MCP Server**:接入 Cursor、Claude Desktop、Codex 等支持 MCP 的 AI 客户端。 -- **CLI 命令行**:通过 `zentao` 命令在终端中直接查询和维护禅道数据。 +| 包名 | 版本 | 说明 | +| -------------------------------------------------- | ----- | ------------------------- | +| [@acehubert/zentao-api](./packages/zentao-api) | 0.5.0 | 禅道 API 调用模块 | +| [@acehubert/zentao-mcp](./packages/zentao-mcp) | 0.5.0 | 禅道 MCP Server & CLI | +| [@acehubert/testlink-mcp](./packages/testlink-mcp) | 0.1.0 | TestLink MCP Server & CLI | +| [@acehubert/apifox-mcp](./packages/apifox-mcp) | 0.1.0 | Apifox MCP Server & CLI | -## ✨ 功能特性 - -- 支持禅道 REST API v1、REST API v2 和内置 API。 -- 支持 Bug 查询、创建、解决、关闭。 -- 支持需求查询、创建、关闭。 -- 支持测试用例查询、创建。 -- 支持产品、项目、用户查询。 -- 支持文档空间树、文档详情、文档创建/编辑、目录创建/编辑。 -- 支持附件和图片读取。 -- 支持自签名证书环境。 -- 提供 AI skills,帮助助手按正确流程使用禅道 MCP 和 CLI。 - -## 📦 安装 - -### 环境要求 - -- Node.js >= 18 -- npm、yarn、pnpm 中任意一种包管理器 -- 一个可访问目标禅道系统的账号 - -### 直接通过 npx 使用 - -推荐在 MCP 客户端中使用 `npx`,无需全局安装: - -```bash -npx -y @acehubert/zentao-mcp@latest -``` - -### 全局安装 CLI - -如果需要在终端中直接使用 `zentao` 命令: - -```bash -npm i -g @acehubert/zentao-mcp@latest -zentao --version -``` - -如果提示 `command not found`,请确认 npm 全局 `bin` 目录已加入 `PATH`。 - -### 本地开发安装 - -克隆仓库后安装依赖并构建: +## 🛠 开发 ```bash yarn install yarn build -``` - -常用开发命令: - -```bash yarn typecheck yarn lint yarn test ``` -## ⚙️ 连接配置 - -MCP Server 和 CLI 支持通过本地配置或环境变量配置禅道连接信息。 - -推荐使用本地配置,避免密码进入普通业务命令的 shell 历史: - -```bash -zentao config set -``` - -也可以逐项设置: +版本管理采用 **lerna independent** 模式,各包独立发版。 ```bash -zentao config set url "https://zentao.example.com" -zentao config set account "your_account" -zentao config set password "your_password" -zentao config set version "v2" -zentao config set skipSSL "false" -zentao config get -zentao config get url -zentao config remove password +yarn release # 交互式发布 +yarn release:git # 从 git tag 发布 +yarn release:alpha # 发布 alpha 预发版 ``` -解析优先级为:命令行参数 > 本地配置 > 环境变量。 -MCP Server 和 CLI 共用同一份本地配置,因此 `config set` 后无需再为 MCP 单独配置同样的值。 - -也可以使用环境变量配置连接信息: - -```bash -export ZENTAO_URL="https://zentao.example.com" -export ZENTAO_ACCOUNT="your_account" -export ZENTAO_PASSWORD="your_password" -export ZENTAO_VERSION="v2" -export ZENTAO_SKIP_SSL="false" -``` - -配置项说明: - -- `ZENTAO_URL`:禅道访问地址,例如 `https://zentao.example.com`。 -- `ZENTAO_ACCOUNT`:禅道账号。 -- `ZENTAO_PASSWORD`:禅道密码。 -- `ZENTAO_VERSION`:禅道 API 类型,可选 `legacy`、`v1`、`v2`。 -- `ZENTAO_SKIP_SSL`:是否跳过 SSL 证书校验。自签名证书内网环境可设为 `true`。 - -> 注意:不要把 `ZENTAO_PASSWORD` 提交到仓库,也不要写入公开日志。 - -## 🤖 MCP 使用说明 - -在支持 MCP 的客户端中添加如下配置: - -```json -{ - "mcpServers": { - "zentao": { - "command": "npx", - "args": ["-y", "@acehubert/zentao-mcp@latest"], - "env": { - "ZENTAO_URL": "https://zentao.example.com", - "ZENTAO_ACCOUNT": "your_account", - "ZENTAO_PASSWORD": "your_password", - "ZENTAO_VERSION": "v2", - "ZENTAO_SKIP_SSL": "false" - } - } - } -} -``` - -配置完成后,AI 客户端会获得以下 MCP 工具: - -- `zentao_client`:客户端信息查询、当前客户端版本获取。 -- `zentao_bugs`:Bug 列表、详情、创建、解决、关闭。 -- `zentao_stories`:需求列表、详情、创建、关闭。 -- `zentao_testcases`:测试用例列表、详情、创建。 -- `zentao_products`:产品列表、详情。 -- `zentao_projects`:项目列表、详情。 -- `zentao_users`:当前用户、用户列表、用户详情。 -- `zentao_docs`:文档空间树、文档详情、文档创建/编辑、目录创建/编辑。 -- `zentao_file`:附件和图片读取。 - -本项目采用统一 action 模式。先选择资源工具,再通过 `action` 指定操作。 - -示例: - -```json -{ - "action": "list", - "productID": 1, - "browseType": "unclosed", - "limit": 20 -} -``` - -常见工作流: - -1. 先用 `list`、`tree` 或 `view` 定位目标 ID。 -2. 再执行 `create`、`edit`、`resolve`、`close` 等写操作。 -3. 写操作完成后,再次用 `view` 验证结果。 - -## 💻 CLI 使用说明 - -安装后可使用: - -```bash -zentao [arguments] [flags] -``` - -查看帮助: - -```bash -zentao --help -zentao client --help -zentao bugs --help -zentao docs --help -``` - -### 客户端 - -```bash -zentao client getVersion -``` - -### Bug - -```bash -zentao bugs list --productID 1 --browseType unclosed --limit 20 -zentao bugs view --bugID 123 -``` - -`browseType` 表示 Bug 状态,默认 `unclosed`: - -- v1/v2:`all` 全部、`unclosed` 未关闭、`assignedtome` 指派给我、`openedbyme` 我创建、`assignedbyme` 由我指派。 -- legacy:`all` 所有、`unclosed` 未关闭、`openedbyme` 由我创建、`assigntome` 指派给我、`resolvedbyme` 由我解决、`toclosed` 待关闭、`unresolved` 未解决、`unconfirmed` 未确认、`longlifebugs` 久未处理、`postponedbugs` 被延期、`overduebugs` 过期 BUG、`needconfirm` 需求变动。 - -创建 Bug: - -```bash -zentao bugs create \ - --productID 1 \ - --title "登录按钮点击后无响应" \ - --severity 2 \ - --pri 2 \ - --type codeerror \ - --steps "【前置条件】进入登录页\n【操作步骤】点击登录按钮\n【预期结果】正常提交\n【实际结果】无响应" -``` - -解决和关闭 Bug: - -```bash -zentao bugs resolve --bugID 123 --resolution fixed --comment "已修复,待验证" -zentao bugs close --bugID 123 --comment "验证通过" -``` - -### 需求 - -```bash -zentao stories list --productID 1 --browseType unclosed --limit 20 -zentao stories view --storyID 456 -``` - -需求列表的 `browseType` 默认 `unclosed`。v1/v2 可用值:`all` 全部、`unclosed` 未关闭、`assignedtome` 指派给我、`openedbyme` 我创建、`assignedbyme` 由我指派。 - -创建需求: - -```bash -zentao stories create \ - --productID 1 \ - --title "优化登录流程" \ - --category feature \ - --pri 2 \ - --spec "用户可以通过手机号和验证码登录" \ - --reviewer "zhangsan" \ - --verify "输入正确验证码后登录成功" -``` - -关闭需求: - -```bash -zentao stories close --storyID 456 --closedReason done --comment "需求已完成" -``` - -### 测试用例 - -`steps` 参数需要传入 JSON 数组字符串: - -```bash -zentao testcases list --productID 1 --limit 20 -zentao testcases view --caseID 789 - -zentao testcases create \ - --productID 1 \ - --title "手机号验证码登录成功" \ - --type feature \ - --pri 2 \ - --steps '[{"desc":"输入手机号","expect":"手机号格式正确"},{"desc":"输入验证码并提交","expect":"登录成功"}]' -``` - -### 产品、项目、用户 - -```bash -zentao products list --limit 20 -zentao products view --productID 1 - -zentao projects list --limit 20 -zentao projects view --projectID 1 - -zentao users me -zentao users list --limit 20 -zentao users view --userID 1 -``` - -### 文档 - -文档操作依赖文档库 ID 和目录 ID。写入前建议先查询空间树: - -```bash -zentao docs tree --spaceType product --spaceID 1 -zentao docs view --docID 1001 -``` - -创建目录和文档: - -```bash -zentao docs createModule \ - --libID 1 \ - --spaceID 1 \ - --moduleName "接口文档" - -zentao docs create \ - --libID 1 \ - --moduleID 111 \ - --title "登录接口文档" \ - --content "接口地址、请求参数、响应格式..." -``` - -编辑文档和目录: - -```bash -zentao docs edit \ - --docID 1001 \ - --title "登录接口文档" \ - --content "更新后的文档内容" - -zentao docs editModule \ - --moduleID 111 \ - --libID 1 \ - --moduleName "登录接口" -``` - -## 🧩 API 版本选择 - -不同禅道部署可能支持不同 API: - -- `v2`:优先推荐,适合较新的禅道 REST API。 -- `v1`:适合使用 `/api.php/v1/...` 的禅道 REST API。 -- `legacy`:适合只支持传统内置 API 的部署。 - -如果遇到接口不存在或鉴权异常,可以依次尝试: - -```bash -export ZENTAO_VERSION="v2" -export ZENTAO_VERSION="v1" -export ZENTAO_VERSION="legacy" -``` - -## 🔐 安全建议 - -- 不要把禅道账号密码写入 README、脚本或仓库配置。 -- 优先通过 MCP 客户端 `env` 或本地 shell 环境变量传入密码。 -- 执行批量关闭、批量解决、批量编辑前,先确认目标 ID 和影响范围。 -- 生产环境写操作建议遵循 `查询 -> 确认 -> 写入 -> 验证` 的流程。 -- `ZENTAO_SKIP_SSL=true` 只建议用于可信内网的自签名证书环境。 - -## ❓ 常见问题 - -### MCP Server 启动失败 - -请检查: - -- `ZENTAO_URL` 是否可访问。 -- `ZENTAO_ACCOUNT` 和 `ZENTAO_PASSWORD` 是否正确。 -- `ZENTAO_VERSION` 是否匹配目标禅道版本。 -- 自签名证书环境是否需要设置 `ZENTAO_SKIP_SSL=true`。 - -### CLI 找不到 `zentao` 命令 - -请确认已经全局安装: - -```bash -npm i -g @acehubert/zentao-mcp@latest -``` - -如果仍然找不到命令,请检查 npm 全局 `bin` 目录是否在 `PATH` 中。 - -### 文档创建失败 - -请先执行: - -```bash -zentao docs tree --spaceType product --spaceID 1 -``` +## 📋 Changelog -确认 `libID`、`moduleID` 和目标文档空间后再创建或编辑。 +详见各包目录下的 CHANGELOG.md,或查看根目录 [CHANGELOG.md](./CHANGELOG.md)。 -### 权限不足 +## 📄 License -请确认配置的禅道账号拥有目标产品、项目、文档库或附件的访问权限。 +MIT diff --git a/packages/apifox-mcp/README.md b/packages/apifox-mcp/README.md new file mode 100644 index 0000000..b179f03 --- /dev/null +++ b/packages/apifox-mcp/README.md @@ -0,0 +1,167 @@ +# Apifox MCP + CLI + +一个同时支持 `MCP` 和 `CLI` 的 Apifox/OpenAPI 文档工具。 + +## 开发安装 + +项目使用 `Yarn 3`。 + +```bash +yarn install +yarn build +``` + +常用开发命令: + +```bash +yarn build +yarn typecheck +yarn lint +``` + +## 来源类型 + +工具支持三种来源,三选一: + +- `--projectId` +- `--siteId` +- `--oas` + +说明: + +- 来源参数必须显式通过命令行传入 +- 不支持通过环境变量传入 `projectId`、`siteId`、`oas` + +## 环境变量 + +支持以下环境变量: + +- `APIFOX_ACCESS_TOKEN` +- `APIFOX_API_BASE_URL` +- `APIFOX_API_VERSION` +- `APIFOX_API_PAGE_SIZE` +- `APIFOX_DATA_LOCATION` + +示例: + +```bash +export APIFOX_ACCESS_TOKEN="your_access_token" +export APIFOX_DATA_LOCATION="/tmp" +``` + +## MCP 用法 + +启动时如果已经传入来源参数,MCP 会注册带后缀的工具名,便于多实例区分。 + +示例: + +```bash +apifox-mcp --projectId=12345 +apifox-mcp --siteId=abcde +apifox-mcp --oas=https://petstore.swagger.io/v2/swagger.json +``` + +如果启动时没有传来源参数,MCP 会注册无后缀工具名: + +- `read_apifox_oas` +- `read_apifox_oas_ref_resources` +- `refresh_apifox_oas` +- `get_apifox_cache_info` + +同时这些工具的 schema 会带 `oneOf`,要求在调用时传入以下之一: + +- `projectId` +- `siteId` +- `oas` + +如果启动时传了来源参数,则工具 schema 不再要求重复传来源。 + +### MCP 配置示例 + +以 `projectId` 为例: + +```json +{ + "mcpServers": { + "api-docs": { + "command": "npx", + "args": ["-y", "@acehubert/apifox-mcp@latest", "--projectId=12345"], + "env": { + "APIFOX_ACCESS_TOKEN": "your_access_token" + } + } + } +} +``` + +## CLI 用法 + +CLI 所有命令都要求显式传入来源参数。 + +### 查看文档 + +```bash +apifox oas view --projectId=12345 +apifox oas view --siteId=abcde +apifox oas view --oas=/tmp/openapi.json +``` + +### 刷新缓存 + +```bash +apifox oas refresh --projectId=12345 +apifox oas refresh --oas=https://petstore.swagger.io/v2/swagger.json +``` + +### 读取 `$ref` 资源 + +```bash +apifox refs read \ + --projectId=12345 \ + --path=/paths/_users.json \ + --path=/components/schemas/User.json +``` + +### 查看缓存信息 + +```bash +apifox cache info --projectId=12345 +``` + +返回内容包括: + +- `cacheDir` +- `cacheFile` +- `exists` +- `source` +- `lastUpdatedAt` + +### CLI 帮助 + +```bash +apifox --help +apifox oas --help +apifox refs --help +apifox cache --help +``` + +## 缓存行为 + +拉取文档后会在本地生成缓存,并把 OpenAPI 文档拆成: + +- 主索引 `index.json` +- `paths/*.json` +- `components/**/*.json` + +`cache info` 中的 `lastUpdatedAt` 使用缓存文件 `index.json` 的修改时间。 + +## 当前目录约定 + +- `skills/` 是项目内 skills 源目录 +- `.claude/skills` 已软链接到 `skills/` + +## 备注 + +- 读取 `projectId` 来源时必须提供有效的 `APIFOX_ACCESS_TOKEN` +- `siteId` 与 `oas` 来源不要求 token +- `oas` 后缀命名会基于输入地址或路径生成稳定 hash diff --git a/packages/testlink-mcp/README.md b/packages/testlink-mcp/README.md new file mode 100644 index 0000000..3304569 --- /dev/null +++ b/packages/testlink-mcp/README.md @@ -0,0 +1,564 @@ +# TestLink MCP Server + +让 AI 助手能够直接管理 TestLink 中的测试项目、测试套件、测试用例、测试计划、构建、执行结果和需求。通过 MCP (Model Context Protocol),你可以用自然语言与 AI 交流来查询、创建、更新和维护 TestLink 测试资产。 + +## ✨ 功能特性 + +### 测试项目管理 + +- 📋 获取 TestLink 测试项目列表 +- 🔎 为后续套件、计划、需求操作定位项目 ID + +### 测试套件管理 + +- 📋 获取项目下的一级测试套件 +- 🔍 查看测试套件详情 +- ➕ 创建测试套件 +- 🌲 创建嵌套测试套件 +- ✏️ 更新测试套件名称和描述 + +### 测试用例管理 + +- 🔍 查看测试用例详情 +- 📋 获取测试套件下的测试用例 +- ➕ 创建测试用例 +- ✏️ 更新测试用例名称、摘要、前置条件、步骤、重要性、执行类型和状态 +- 🗑️ 标记测试用例为废弃 +- 🆔 支持数字 ID 和外部 ID(如 `PREFIX-123`) + +### 测试计划管理 + +- 📋 获取项目下的测试计划 +- ➕ 创建测试计划 +- 📋 获取测试计划中的测试用例 +- 🔗 将测试用例加入测试计划 +- 🗑️ 删除测试计划 + +### 构建与执行管理 + +- 📋 获取测试计划下的构建 +- ➕ 创建构建 +- 🔒 关闭构建 +- 📊 获取测试执行结果 +- ✅ 记录测试执行结果 + +### 需求管理 + +- 📋 获取项目下的需求 +- 🔍 查看需求详情 + +## 🚀 快速开始 + +### 方式一:使用 npx(推荐) + +无需安装,直接在 MCP 客户端配置中使用: + +#### Cursor 配置 + +编辑 `~/.cursor/mcp.json`(Windows: `%USERPROFILE%\.cursor\mcp.json`): + +```json +{ + "mcpServers": { + "testlink": { + "command": "npx", + "args": ["-y", "@acehubert/testlink-mcp"], + "env": { + "TESTLINK_URL": "https://your-testlink-server.com/testlink", + "TESTLINK_API_KEY": "your_api_key" + } + } + } +} +``` + +#### Claude Desktop 配置 + +编辑 `claude_desktop_config.json`: + +```json +{ + "mcpServers": { + "testlink": { + "command": "npx", + "args": ["-y", "@acehubert/testlink-mcp"], + "env": { + "TESTLINK_URL": "https://your-testlink-server.com/testlink", + "TESTLINK_API_KEY": "your_api_key" + } + } + } +} +``` + +### 方式二:全局安装 + +```bash +npm install -g @acehubert/testlink-mcp +``` + +全局安装后会提供两个命令: + +- `testlink-mcp`:启动 MCP Server,用于接入 MCP 客户端。 +- `testlink`:命令行工具,用于在终端直接操作 TestLink。 + +然后在 MCP 配置中使用: + +```json +{ + "mcpServers": { + "testlink": { + "command": "testlink-mcp", + "env": { + "TESTLINK_URL": "https://your-testlink-server.com/testlink", + "TESTLINK_API_KEY": "your_api_key" + } + } + } +} +``` + +### 方式三:从源码运行 + +1. 克隆项目并安装依赖: + +```bash +git clone https://github.com/aceHuber/testlink-mcp.git +cd testlink-mcp +yarn install +yarn build +``` + +2. 在 MCP 配置中使用本地路径: + +```json +{ + "mcpServers": { + "testlink": { + "command": "node", + "args": ["/path/to/testlink-mcp/dist/index.js"], + "env": { + "TESTLINK_URL": "https://your-testlink-server.com/testlink", + "TESTLINK_API_KEY": "your_api_key" + } + } + } +} +``` + +## ⚙️ 环境变量说明 + +| 变量名 | 必填 | 说明 | +| ------------------ | ---- | ------------------------------------------------------------- | +| `TESTLINK_URL` | ✅ | TestLink 服务地址,通常包含 `/testlink` 路径 | +| `TESTLINK_API_KEY` | ✅ | TestLink 个人 API Key,可在 TestLink 个人设置中获取或重新生成 | + +也可以通过启动参数传入: + +```bash +testlink-mcp \ + --url "https://your-testlink-server.com/testlink" \ + --apiKey "your_api_key" +``` + +## 💻 CLI 使用说明 + +`testlink` CLI 适合在终端中做一次性查询、脚本化检查和小批量维护。 + +安装: + +```bash +npm install -g @acehubert/testlink-mcp +testlink --version +``` + +推荐使用本地配置或环境变量配置连接信息,避免 API Key 进入普通业务命令的 shell 历史: + +```bash +testlink config set url "https://your-testlink-server.com/testlink" +testlink config set apiKey "your_api_key" +testlink config get +testlink config get url +testlink config remove apiKey +``` + +解析优先级为:命令行参数 > 本地配置 > 环境变量。 +MCP Server 和 CLI 共用同一份本地配置,因此 `config set` 后无需再为 MCP 单独配置同样的值。 + +也可以使用环境变量配置连接信息: + +```bash +export TESTLINK_URL="https://your-testlink-server.com/testlink" +export TESTLINK_API_KEY="your_api_key" +``` + +也可以在命令行中临时传入连接参数: + +```bash +testlink projects list \ + --url "https://your-testlink-server.com/testlink" \ + --apiKey "your_api_key" +``` + +基本格式: + +```bash +testlink [arguments] [flags] +``` + +查看帮助: + +```bash +testlink --help +testlink --version +testlink cases --help +testlink suites --help +testlink plans --help +``` + +CLI 输出为格式化 JSON,方便结合 `jq` 或脚本继续处理。 + +### 测试项目 + +```bash +testlink projects list +``` + +### 测试套件 + +查询: + +```bash +testlink suites list --projectId 1 +testlink suites view --suiteId 10 +``` + +创建: + +```bash +testlink suites create \ + --projectId 1 \ + --suiteName "登录模块" \ + --details "登录相关测试套件" +``` + +创建子套件: + +```bash +testlink suites create \ + --projectId 1 \ + --suiteName "手机号验证码登录" \ + --parentId 10 +``` + +更新: + +```bash +testlink suites update \ + --suiteId 10 \ + --projectId 1 \ + --data '{"name":"登录测试套件","details":"更新后的套件说明"}' +``` + +### 测试用例 + +`data` 参数需要传入 JSON 对象字符串。测试用例 ID 支持数字 ID 和外部 ID。 + +查询: + +```bash +testlink cases list-in-suite --suiteId 10 +testlink cases view --testCaseId PREFIX-123 +``` + +创建: + +```bash +testlink cases create \ + --data '{"testprojectid":"1","testsuiteid":"10","name":"手机号验证码登录成功","authorlogin":"qa","summary":"验证手机号验证码登录流程","steps":[{"step_number":1,"actions":"输入手机号","expected_results":"手机号格式正确"},{"step_number":2,"actions":"输入验证码并提交","expected_results":"登录成功"}],"importance":2,"execution_type":1}' +``` + +更新: + +```bash +testlink cases update \ + --testCaseId PREFIX-123 \ + --data '{"summary":"更新后的用例摘要","importance":3}' +``` + +标记为废弃: + +```bash +testlink cases delete --testCaseId PREFIX-123 +``` + +> TestLink XML-RPC 客户端不提供直接删除测试用例的方法,`cases delete` 会将用例状态标记为废弃。 + +### 测试计划 + +查询: + +```bash +testlink plans list --projectId 1 +testlink plans list-cases --planId 20 +``` + +创建: + +```bash +testlink plans create \ + --data '{"project_id":"PROJECT_PREFIX","name":"回归测试计划","notes":"主干回归测试计划","active":1,"is_public":1}' +``` + +添加测试用例: + +```bash +testlink plans add-case \ + --data '{"testcaseid":"PREFIX-123","testplanid":"20","testprojectid":"1","version":1,"urgency":2}' +``` + +删除: + +```bash +testlink plans delete --planId 20 +``` + +### 构建 + +查询: + +```bash +testlink builds list --planId 20 +``` + +创建: + +```bash +testlink builds create \ + --data '{"plan_id":"20","name":"2026.04.24","notes":"发布验证构建","active":1,"open":1}' +``` + +关闭: + +```bash +testlink builds close --buildId 30 +``` + +### 执行结果 + +查询: + +```bash +testlink executions list --planId 20 +testlink executions list --planId 20 --buildId 30 +``` + +记录结果: + +```bash +testlink executions create \ + --data '{"test_case_id":"PREFIX-123","plan_id":"20","build_id":"30","status":"p","notes":"测试环境验证通过"}' +``` + +常见执行状态: + +- `p`:通过 +- `f`:失败 +- `b`:阻塞 + +### 需求 + +```bash +testlink requirements list --projectId 1 +testlink requirements view --projectId 1 --requirementId 100 +``` + +### 脚本化示例 + +```bash +testlink cases list-in-suite --suiteId 10 \ + | jq '.[] | {id, external_id, name}' +``` + +写操作建议遵循以下流程: + +1. 使用 `list` 或 `view` 确认目标 ID。 +2. 执行 `create`、`update`、`delete`、`close` 或 `create execution`。 +3. 再次使用 `view` 或 `list` 验证结果。 + +## 💬 使用示例 + +配置完成后,你可以用自然语言与 AI 交流来管理 TestLink: + +### 测试项目和套件 + +```text +> "帮我列出 TestLink 中所有测试项目" +> "查看项目 1 下有哪些测试套件" +> "在项目 1 下创建一个登录模块测试套件" +``` + +### 测试用例 + +```text +> "查看测试用例 PREFIX-123 的详细信息" +> "列出套件 10 下的所有测试用例" +> "创建一个手机号验证码登录成功的测试用例" +> "把测试用例 PREFIX-123 的重要性改成高" +``` + +### 测试计划和构建 + +```text +> "列出项目 1 的测试计划" +> "把用例 PREFIX-123 加入测试计划 20" +> "为测试计划 20 创建一个今天的构建" +> "关闭构建 30" +``` + +### 执行结果和需求 + +```text +> "查看测试计划 20 在构建 30 下的执行结果" +> "记录用例 PREFIX-123 在构建 30 中执行通过" +> "列出项目 1 下的需求" +> "查看需求 100 的详细信息" +``` + +## 🛠️ 可用工具列表 + +### 测试项目 + +| 工具名称 | 描述 | +| --------------- | ---------------------- | +| `list_projects` | 获取所有 TestLink 项目 | + +### 测试套件 + +| 工具名称 | 描述 | +| -------------------------- | -------------------------- | +| `list_test_suites` | 获取项目下的一级测试套件 | +| `read_test_suite` | 查看测试套件详情 | +| `list_test_cases_in_suite` | 获取测试套件下的测试用例 | +| `create_test_suite` | 创建测试套件,支持父级套件 | +| `update_test_suite` | 更新测试套件名称和描述 | + +### 测试用例 + +| 工具名称 | 描述 | +| -------------------------- | ------------------------ | +| `read_test_case` | 查看测试用例详情 | +| `create_test_case` | 创建测试用例 | +| `update_test_case` | 更新测试用例 | +| `delete_test_case` | 将测试用例标记为废弃 | +| `list_test_cases_in_suite` | 获取测试套件下的测试用例 | + +### 测试计划 + +| 工具名称 | 描述 | +| ------------------------------ | ------------------------ | +| `list_test_plans` | 获取项目下的测试计划 | +| `create_test_plan` | 创建测试计划 | +| `delete_test_plan` | 删除测试计划 | +| `get_test_cases_for_test_plan` | 获取测试计划中的测试用例 | +| `add_test_case_to_test_plan` | 将测试用例加入测试计划 | + +### 构建和执行 + +| 工具名称 | 描述 | +| ----------------------- | ------------------ | +| `list_builds` | 获取测试计划下构建 | +| `create_build` | 创建构建 | +| `close_build` | 关闭构建 | +| `read_test_execution` | 获取测试执行结果 | +| `create_test_execution` | 记录测试执行结果 | + +### 需求 + +| 工具名称 | 描述 | +| ------------------- | ---------------- | +| `list_requirements` | 获取项目下的需求 | +| `get_requirement` | 查看需求详情 | + +## 📝 参数说明 + +### 测试用例 ID + +`read_test_case`、`update_test_case`、`delete_test_case`、`create_test_execution` 等操作支持两种用例 ID: + +| 格式 | 示例 | 说明 | +| ------- | ------------ | -------------------- | +| 数字 ID | `123` | TestLink 内部用例 ID | +| 外部 ID | `PREFIX-123` | TestLink 外部用例 ID | + +### 测试用例重要性 + +常见值: + +| 值 | 描述 | +| --- | ---- | +| `1` | 低 | +| `2` | 中 | +| `3` | 高 | + +### 测试执行类型 + +常见值: + +| 值 | 描述 | +| --- | ---- | +| `1` | 手工 | +| `2` | 自动 | + +### 执行状态 + +常见值: + +| 状态 | 描述 | +| ---- | ---- | +| `p` | 通过 | +| `f` | 失败 | +| `b` | 阻塞 | + +## ⚠️ 注意事项 + +1. **权限**:确保配置的 TestLink 账号有足够权限进行相应操作。 +2. **API Key 安全**:不要将 `TESTLINK_API_KEY` 提交到公开仓库、日志或脚本中。 +3. **URL 路径**:`TESTLINK_URL` 通常需要包含 TestLink 部署路径,如 `https://example.com/testlink`。 +4. **删除语义**:测试用例删除会标记为废弃;删除测试计划是真实删除操作,执行前请确认影响范围。 +5. **构建关闭**:关闭构建会阻止继续记录新执行结果,生产环境操作前请确认。 +6. **批量操作**:批量更新、关闭构建、删除计划或记录执行结果前,应先查询并确认目标 ID。 + +## 🧑‍💻 开发 + +安装依赖: + +```bash +yarn install +``` + +类型检查: + +```bash +yarn typecheck +``` + +代码检查: + +```bash +yarn lint +``` + +构建: + +```bash +yarn build +``` + +本地启动 MCP Server: + +```bash +TESTLINK_URL="https://your-testlink-server.com/testlink" \ +TESTLINK_API_KEY="your_api_key" \ +yarn dev +```