关于 testdino-mcp
testdino-mcp 将 TestDino 测试管理平台接入 AI Agent,供开发与测试团队通过自然语言查询测试数据并管理测试流程。它涵盖自动化测试分析、手动测试管理和发布跟踪。
主要功能
- 01检查账户、组织与项目访问
- 02筛选测试运行并查看详情
- 03分析失败模式与错误聚类
- 04管理手动用例、套件和测试运行
- 05规划发布并跟踪进度
- 06创建探索会话并提交缺陷
适用场景
- 01检查某分支测试运行的结果
- 02追踪失败用例的根因和修复情况
- 03在聊天中分配并记录手动测试结果
- 04从失败测试创建并跟踪问题
MCP 相关
这是一个 MCP 服务,向兼容客户端提供 TestDino 测试数据查询、分析及管理工具。可配置在 Cursor、Claude Desktop 等 MCP 客户端中。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
6收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 是 | 你的姓名(用于问候消息)。 |
详细介绍
TestDino MCP
一个将 TestDino 连接到 AI Agent 的模型上下文协议(MCP)服务。该服务支持你通过自然语言命令直接与 TestDino 测试数据交互。
快速开始
将以下内容添加到 MCP 客户端配置中(Cursor 的配置文件为 ~/.cursor/mcp.json),然后重启客户端:
{
"mcpServers": {
"TestDino": {
"command": "npx",
"args": ["-y", "@testdino/mcp"],
"env": {
"TESTDINO_PAT": "your-pat-here"
}
}
}
}
从 TestDino → 用户设置 → 个人访问令牌 获取你的 PAT,然后向助手提问:“检查 TestDino 健康状况。” 你应该会看到自己的账户、组织和项目。Cursor 和 Claude Desktop 的完整设置说明请参阅集成。
这是什么?
此 MCP 服务连接了 TestDino 测试管理平台与 AI Agent。你无需手动浏览 TestDino 控制面板,只需向 AI 助手提问即可:
- 检查测试运行结果
- 分析测试失败
- 获取详细的测试用例信息
- 管理手动测试用例和测试套件
- 规划发布、启动手动测试运行并分配测试人员
- 运行探索性测试会话
- 在聊天中记录每个用例的判定结果(通过 / 失败 / 阻塞 / 等)
一切操作都可以通过简单的对话命令完成。
功能
- 🔍 健康检查:验证连接并校验你的 TestDino PAT。获取账户信息,并列出所有可用的组织和项目。
- 📊 测试运行管理:列出并获取测试运行的详细信息,并可按分支、时间、作者、提交和环境筛选。
- 🧪 测试用例分析:获取单个测试用例的全面详情,包括错误、日志、执行步骤和产物(截图、视频、追踪记录)。
- 🐛 AI 辅助调试:结合历史数据汇总、失败模式分析和便于 AI 理解的调试提示,排查测试用例失败问题。分析多次执行中的模式,以确定根本原因。
- 🧭 测试质量审计:获取由服务端整理的审计提示词和分支信号,分析本地测试代码,并将完成的报告存回 TestDino,而无需上传原始源文件。
- 📝 测试用例管理:创建、更新、列出和获取手动测试用例,并支持全面的筛选和分类(状态、优先级、严重性、类型、层级、行为、标签)。
- 📁 测试套件组织:创建和管理测试套件层级,以组织手动测试用例。
- 🚀 发布规划:创建、浏览和更新发布(即里程碑),最多可嵌套 3 层,并跟踪发布中所有运行的汇总进度统计。
- ▶️ 手动测试运行:启动范围限定为特定套件或整个项目的测试运行,将其关联到发布,并可直接在聊天中更新工作流状态。
- ✅ 按用例分配与判定结果:在一次运行中,将每个测试用例分配给测试人员(按用户
_id或电子邮件),并设置结果——passed、failed、blocked、skipped、retest——与 UI 中的操作完全一致。 - 🔭 探索性测试会话:创建包含任务/章程的探索性测试会话,分配测试人员、关联发布并跟踪状态。
- 🧩 大规模失败分类:按底层错误特征对一次运行中的失败测试进行分组,查看哪些失败来自同一根本原因、哪些各不相同,从而优先修复真正的问题。
- 🔗 问题跟踪器集成:连接 Jira、Linear、Asana 或 monday.com,直接从失败的测试或运行中创建可跟踪的问题,并可在之后直接于聊天中查看其状态。
- 🔌 兼容 MCP:基于 Model Context Protocol 标准构建。你可以将 TestDino MCP 配置用于任何兼容 MCP 的 IDE 或 AI Agent(Cursor、Claude Desktop 等)。
- ⚡ 轻松设置:使用 npx,只需几分钟即可完成安装和配置。无需安装!
- 🔐 安全:PAT 安全地存储在本地配置中。一个 PAT 即可访问你有权限使用的所有组织和项目。
可用工具
该服务提供 57 个工具,涵盖十二个领域,工具、提示词和技能指南与托管版 TestDino MCP 相同:
测试执行与结果:
health- 验证连接并验证 PAT。显示账户信息、可用组织以及具有访问权限的项目。list_testruns- 浏览测试运行,并使用筛选条件(分支、时间范围、作者、提交、环境)。支持分页和批量操作。get_run_details- 获取特定测试运行的详细信息,包括统计数据、测试套件、测试用例和元数据。支持批量操作(以逗号分隔 ID,最多 20 个)。list_testcase- 列出测试用例,并提供全面的筛选条件(按测试运行、状态、浏览器、错误类别、分支、环境、提交、作者、规范文件、标签、运行时、构件等筛选)。可以按测试运行条件筛选,也可以直接按测试用例属性筛选。get_testcase_details- 获取特定测试用例的详细信息,包括错误消息、堆栈跟踪、测试步骤、控制台日志和构件。可仅通过 testcase_id 识别,也可通过 testcase_name 与 testrun_id/counter 识别。debug_testcase- 汇总多次执行的历史失败数据,以调试测试用例。返回失败模式、错误类别、常见错误消息、错误位置、特定于浏览器的问题,以及预先格式化的调试提示词,供 AI 分析。非常适合用于根因分析和识别不稳定的测试行为。get_debug_evidence- 调查任何失败测试时,都从这里开始:一次调用即可返回不稳定性判定、每次尝试的特征、回归边界(最后一次通过 → 首次失败),以及每个已存储构件(跟踪、屏幕截图、视觉差异图像)的短时有效下载链接。支持 JSON 或 Markdown。get_flake_verdict- 比较一次运行中某项测试的重试尝试,并判定失败是否会重复:deterministic、flaky或inconclusive。verify_fix- 新运行完成后,检查修复是否经受住了此前发现失败的那次运行:fixed、not_fixed、changed_failure、still_failing、unstable、no_runs_since_baseline或baseline_not_found。get_audit_report- 获取审计上下文(服务端整理的提示词 + 分支中失败率最高/不稳定/最慢的测试),以开始新的审计、浏览历史报告,或通过reportId检索报告。submit_audit_report- 向 TestDino 提交已完成的审计报告(评分、发现、建议、Markdown)。
测试用例管理:
list_manual_test_cases- 搜索并列出手动测试用例,并提供全面的筛选条件(项目、套件、状态、优先级、严重性、类型、层级、行为、自动化状态、标签、不稳定状态)。get_manual_test_case- 获取特定手动测试用例的详细信息,包括步骤、自定义字段、前置条件、后置条件和所有元数据。create_manual_test_case- 创建新的手动测试用例,并设置步骤、前置条件、后置条件和元数据(优先级、严重性、类型、层级、行为)。update_manual_test_case- 更新现有手动测试用例(标题、描述、步骤、状态、优先级、严重性、类型、层级、行为、前置条件、后置条件)。list_manual_test_suites- 列出测试套件层级,以查找用于组织的套件 ID。支持按父套件筛选。create_manual_test_suite- 创建新的测试套件文件夹,以便组织测试用例。提供 parentSuiteId 即可创建嵌套套件。
自动化关联:
18. list_automated_tests - 列出 TestDino 在某个项目中发现的 Playwright 测试;这些测试是用于关联的 pwTestId + fullTitle 的来源。可按规格文件、套件或标题自由文本筛选。
19. get_test_case_links - 显示与手动测试用例关联的自动化测试,以及它们最新的自动化结果。
20. link_automated_test - 将一个 Playwright 测试关联到手动测试用例,以便在该用例中显示其自动化结果。
21. unlink_automated_test - 移除手动测试用例与 Playwright 测试之间的关联。
22. bulk_link_automated_tests - 在一次调用中关联多达 500 组用例/测试,并提供逐项结果,以便查看部分失败情况。
发布(也称为里程碑):
list_releases- 浏览项目的发布,并使用筛选条件(搜索、类型、完成状态、父级发布)。发布用于归组运行和会话,最多可嵌套 3 层。get_release- 获取单个发布的完整详情,包括日期、状态、父级/根级层级结构,以及该发布及其后代中所有运行的汇总进度统计信息。接受内部_id或MS-12这类计数器格式的 ID。create_release- 创建新的发布,并设置名称、类型、日期及可选的父级发布以进行嵌套。update_release- 修改现有发布的名称、日期、完成标记、类型和关联的问题。已关闭的发布仍可编辑。
手动测试运行:
list_manual_runs- 浏览项目中的手动运行。可按状态、运行状态、环境、发布、标签或名称自由文本搜索进行筛选。get_manual_run- 获取单次运行的完整详情,包括测试统计信息(总数/通过/失败/受阻/未测试)、贡献者、附件和关联的发布。接受内部_id或RUN-12这类计数器格式的 ID。create_manual_run- 创建新的手动运行。选择selectionMode='all'以包含项目中的所有用例,或选择'selected'并提供套件/用例 ID 以指定范围。使用releaseId将其关联到发布。update_manual_run- 修改运行元数据,包括名称、环境、状态、关联的发布和标签。已关闭的运行只读,但releaseId除外。list_run_test_cases- 获取运行中逐个用例的执行行,即 UI 中运行的测试用例表所显示的内容。每行都包含当前受指派人和当前结果。可按受指派人(电子邮件或 _id)或结果筛选。update_run_test_case- 设置运行中某个测试用例的受指派人和/或结果,相当于在 UI 中点击“指派给”+结果状态标记。对未测试的用例也有效(首次编辑时会自动创建逐用例记录)。接受 caseKey(TC-156)、测试用例 _id 或内部tcm_rtc_…ID。
探索性测试会话:
list_sessions- 浏览项目中的探索性测试会话。可按状态、运行状态、sessionType、受指派人(电子邮件或 _id)、发布和标签筛选。get_session- 获取单个会话的完整详情,包括名称、任务、状态、受指派人、关联的发布和发现结果。接受内部_id或SES-12这类计数器格式的 ID。create_session- 创建新的探索性测试会话,并设置任务/章程、sessionType、受指派人、预估时长及可选的关联发布。update_session- 修改会话元数据,包括名称、任务、受指派人、状态、预估时长、关联的问题和附件。
错误分析:
get_run_error_clusters- 按错误特征对运行中的失败测试进行分组,以便大规模分类处理。此工具会显示共享相同根因错误的测试群组,并可选用status筛选(all、failed、flaky)。可在list_testruns之后使用,以了解运行失败的原因。
集成(问题跟踪工具):
38. connect_integration - 返回提供商(Jira、Linear、Asana、monday.com、GitHub)的 OAuth 连接 URL。将该 URL 展示给用户以供授权;不要以编程方式打开它。
39. get_integration_status - 报告某个提供商是否已连接到某个项目。将 includeCreateOptions 设为 true,还可获取创建问题时可用的字段。在调用 create_external_issue 之前,请先调用此工具。
40. create_external_issue - 根据 TestDino 源实体(例如失败的测试用例或运行)在已连接的问题跟踪工具中创建问题(Jira、Linear、Asana、monday.com)。支持 preview,并可通过 idempotencyKey 实现幂等重试。
41. get_external_issue - 按 ID 或键值(一个或多个)获取先前创建的问题,并返回其在提供商中的当前状态(Jira、Linear、Asana)。
提供商支持:所有提供商均可连接并检查状态。问题创建支持 Jira、Linear、Asana 和 monday.com。问题读取支持 Jira、Linear 和 Asana。GitHub 作为 PR/CI 集成受支持,而非问题跟踪工具。
AI 洞察:
get_ai_insights- TestDino 在三个层级提供 AI 分析:项目概览(指定日期范围内各类别的失败计数和主要问题项)、运行(AI 失败分类、失败集群、错误分析表、由大模型撰写的摘要)以及测试用例(建议和快速修复)。如果项目已关闭 AI 功能(Settings → AI),则返回disabled状态。get_trace_analysis- 将失败测试的托管 Playwright 跟踪解析为短时有效的下载 URL,并返回用于本地跟踪 CLI 调试的操作手册(打开 → 操作 → 快照 → 关闭)。
重新运行:
get_rerun_selection- 确定重新运行已完成运行中的哪些测试——失败项、不稳定项、两者兼有,或手动选择的列表——并以精确的 Playwright--test-list行及可在本地运行它们的 CLI 命令形式返回。还会返回rerun_mechanism:同一提交的重新运行会在该运行自己的 GitHub 运行中进行(这样红色检查就能转绿),还是会启动单独的工作流运行,以及原因。此工具为只读;不会执行任何操作。rerun_test- 在 CI 中启动重新运行。用户同意后需要设置confirm: true,并且需要指定mode——same-commit(失败的那个提交:这些失败是真实问题,还是不稳定导致的?)或latest(分支最新提交:我的修复是否有效?)。没有默认模式;省略该参数会被拒绝,以便让用户作出选择。每次拒绝都会在触发任何操作之前发生。
请先询问。 调用
get_rerun_selection,向用户展示将运行的内容以及rerun_mechanism的说明,然后询问他们想选择哪种模式。重新运行会消耗 CI 时长。
测试控制(隔离、关键、受托人、关注):
list_test_controls- 按照 Test Controls 页面所示,列出 Test Controls 下的测试:已隔离的测试(有效、即将结束、已解除)、关键测试、你关注的测试,或适合隔离的不稳定候选测试。get_test_controls- 获取某个测试的受托人、关键标记、关注状态和有效隔离信息,以及过去 90 天内隔离措施避免其导致失败的运行。get_quarantine- 获取某项隔离措施及其完整历史记录和覆盖的运行。quarantine_tests- 将 1–100 个测试隔离至指定结束日期,并提供必填原因;dry_run可先显示将执行的操作。update_quarantine- 延长隔离期限、更改受托人或备注,或关联工单。release_quarantine- 立即结束隔离;该测试的失败将再次导致构建失败。set_test_critical- 将测试标记为关键或取消标记(适用于负责人和管理员)。assign_test- 按邮箱、用户 ID 或"me"分配测试,或取消分配。watch_test- 关注测试或停止关注测试。
账户、项目和拉取请求:
55. get_org_details - 套餐、剩余执行次数及重置时间、执行次数用尽后的处理方式、套餐包含的席位和项目、额外执行次数,以及各项目的测试健康状况。
56. get_project_details - 单个项目的健康状况、用量、已连接的集成、分支 → 环境映射,以及排名前 10 的不稳定、缓慢、失败、长期存在和速度变慢的测试。
57. get_pull_requests - 最新的拉取请求及其最近一次测试运行,或某个拉取请求的测试运行。
请先征求确认。 隔离、解除隔离和标记为关键会改变导致构建失败的情况;这些工具被标记为具有破坏性,因此客户端会在运行前征求确认。
提示词: testdino_guide(技能指南)、fix_run(将失败的运行分类并制定修复计划)、fix_case(查明单个失败测试的根本原因)、fix_flake(将重试后仍失败的测试导向合适的修复方式)以及 optimize_swarm(分析多机器运行耗时的原因,并找出一项能改善耗时的改动)。
AI 洞察也可直接获取:向
get_run_details传入include_ai_insights: true(在ai_insights下附加运行的 AI 洞察),或向debug_testcase传入(在ai_fixes下附加建议和快速修复)。
安装选项
使用 TestDino MCP 主要有 3 种方式:
选项 1:通过 npx 使用(推荐——无需安装)
- 无需安装
- 需要时自动下载并运行
- 始终使用最新版本
- 可在任何兼容 MCP 的平台上配置
选项 2:全局安装
npm install -g @testdino/mcp
- 安装一次,即可在任何项目中使用
- 需要 Node.js 20+ 和 npm
- 使用命令:
testdino-mcp
选项 3:项目内安装
npm install @testdino/mcp
- 安装在项目的
node_modules中 - 使用命令:
npx @testdino/mcp
集成
Cursor IDE 简易集成指南:
步骤 1:获取个人访问令牌(PAT)
- 登录你的 TestDino 账户
- 前往 用户设置 → 个人访问令牌
- 在 个人访问令牌 部分生成新的 PAT。
- 重要: 此 PAT 可访问你有权限使用的所有组织和项目
步骤 2:配置 Cursor
-
打开或创建 MCP 配置文件:
- Windows:
%APPDATA%\Cursor\mcp.json - macOS/Linux:
~/.cursor/mcp.json - 项目专用: 项目根目录中的
.cursor/mcp.json
- Windows:
-
如果你使用 npx 或在项目内安装,请添加配置:
{
"mcpServers": {
"TestDino": {
"command": "npx",
"args": ["-y", "@testdino/mcp"],
"env": {
"TESTDINO_PAT": "Your PAT here"
}
}
}
}
重要: 将 Your PAT here 替换为步骤 1 中获取的实际个人访问令牌(PAT)。
步骤 3:重启并验证
- 完全关闭并重启 Cursor
- 通过提问验证连接:“检查 TestDino 健康状况”
- 你应该能看到账户名称、可用的组织和项目!
其他方式:全局安装
如果你更倾向于全局安装,而不是使用 npx 或在项目内安装:
npm install -g @testdino/mcp
然后使用此配置:
{
"mcpServers": {
"TestDino": {
"command": "testdino-mcp",
"env": {
"TESTDINO_PAT": "Your PAT here"
}
}
}
}
此服务使用标准 MCP 协议,因此也适用于其他兼容 MCP 的客户端。
Claude Desktop
Claude Desktop 使用相同格式的配置,但文件位置不同:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"TestDino": {
"command": "npx",
"args": ["-y", "@testdino/mcp"],
"env": {
"TESTDINO_PAT": "your-pat-here"
}
}
}
}
重启 Claude Desktop,然后提问 “检查 TestDino 健康状况” 以进行验证。
本地开发
默认情况下,此服务会连接到 https://mcp.testdino.com。开发期间若要将其指向本地 API,请设置 TESTDINO_API_URL(参见 .env.example):
TESTDINO_API_URL=http://localhost:3001
使用方法
配置完成后,只需用自然语言与 AI 助手对话即可。重要: 工具需要在 mcp.json 中将个人访问令牌(PAT)配置为 TESTDINO_PAT。此 PAT 会自动提供对你有权限使用的所有组织和项目的访问权限。
示例命令
在 Cursor、Claude Desktop 或其他兼容 MCP 的客户端中尝试以下自然语言命令:
连接与设置:
- “检查我的 TestDino 连接是否正常”
- “验证我的 TestDino PAT”
探索测试运行:
- “显示最近 5 次测试运行”
- “develop 分支上有哪些测试运行?”
- “列出最近 3 天的测试运行”
- “显示作者为 john 的测试运行”
- “查找提交 abc123 对应的测试运行”
- “列出 production 环境中的所有测试运行”
分析测试结果:
- “获取测试运行 test_run_6901b2abc6b187e63f536a6b 的详情”
- “获取计数器为 42 的测试运行详情”
- “测试运行 test_run_6901b2abc6b187e63f536a6b 中哪些测试用例失败了?”
- “显示最近一次测试运行中的所有不稳定测试”
- “列出 production 环境中所有失败的测试用例”
- “显示 main 分支中耗时超过 100 秒的测试用例”
- “查找提交 abc123 对应测试用例中的所有超时问题”
调试测试失败:
- “调试项目 proj_123 中的测试用例 'Verify user login'”
- “调试 testdino 报告中的 'Verify that User Can Complete the Journey from Login to Order Placement @webkit'”
- “分析项目 proj_123 中 'Checkout flow' 测试用例的失败情况”
- “'API authentication' 测试有哪些失败模式?”
- “为什么测试用例 'User registration' 会失败?”
- “调试测试用例 'Verify that user can login and logout successfully @chromium'”
管理手动测试用例:
- “列出项目 proj_123 中的所有手动测试用例”
- “在项目 proj_123 中搜索带有标签 'smoke' 的手动测试用例”
- “显示项目 proj_123 中所有优先级为 critical 的手动测试用例”
- “获取项目 proj_123 中手动测试用例 TC-123 的详情”
- “在测试套件 Authentication Tests 中为登录功能创建一个新的手动测试用例”
- “更新测试用例 TC-123,将其标记为已弃用”
- “列出项目 proj_123 中的所有测试套件”
- “在项目 proj_123 中创建一个名为 'Authentication Tests' 的新测试套件”
发布版本:
- “列出项目 proj_123 中的所有发布版本”
- “显示此项目中尚未关闭的迭代”
- “获取发布版本 MS-12 的详情,并显示汇总后的测试进度”
- “创建一个名为 'Sprint 42' 的迭代发布版本,时间为 5 月 12 日至 5 月 26 日”
- “将发布版本 MS-12 标记为已完成”
手动测试运行:
- “列出发布版本 MS-12 中的手动运行”
- “显示 staging 上所有进行中的运行”
- “获取运行 RUN-7 的详情”
- “在 staging 上创建一个名为 'Sprint 42 Smoke' 的手动运行,关联发布版本 MS-12,并涵盖 Authentication 套件”
- “将运行 RUN-7 的状态设为 Done”
- “将运行 RUN-7 重新关联到发布版本 MS-13”
为运行分配用例并记录判定结果:
- “列出运行 RUN-1 中的测试用例及其当前负责人和结果”
- “将运行 RUN-1 中的 TC-156 分配给 [email protected],并标记为 Passed”
- “将运行 RUN-1 中的 TC-157 标记为 Failed”
- “将运行 RUN-1 中的 TC-158 分配给 [email protected]——将结果留为未测试”
- “显示运行 RUN-1 中分配给 [email protected] 且仍未测试的所有用例”
探索性会话:
- “列出项目 proj_123 中的活跃探索性会话”
- “显示分配给 [email protected] 的会话”
- “获取会话 SES-3 的详情”
- “创建一个名为 'Auth charter — May 12' 的探索性会话,任务为 'find session-handling bugs around 2FA',分配给 [email protected],预估时长为 60 分钟”
- “更新会话 SES-3,将其标记为 Done”
文档
- 安装指南:Cursor、Claude Desktop 和其他兼容 MCP 的客户端的详细设置说明
- 工具文档:各工具的参考文档,包含示例、参数和使用场景
- AI Agent 技能指南:面向 AI Agent 的指南,介绍工具选择模式、决策树和最佳实践
系统要求
- Node.js:版本 20.0.0 或更高
- NPM:建议使用最新版本(用于包管理)
- TestDino 账户:有效账户,且具有测试运行和/或测试用例管理访问权限
- 个人访问令牌(PAT):身份验证所必需。可从 TestDino Settings → Personal Access Tokens 获取
核心功能说明
使用 debug_testcase 进行 AI 辅助调试
debug_testcase 工具可通过分析历史执行数据,帮助你了解测试失败的原因:
- 历史分析:汇总多次测试运行的数据,以识别模式
- 失败模式:识别常见的错误类别、消息和位置
- 浏览器特定问题:检测特定浏览器的失败模式
- 不稳定测试检测:分析重试模式和不稳定性指标
- 适合 AI 的输出:返回预先格式化的调试提示词,供 AI 分析
- 代码关联:提供错误位置的文件和行号,帮助 AI 关联源代码
示例工作流:
- 提问:“调试 testdino 报告中的测试用例‘验证用户登录’”
- AI 使用 projectId 和 testcase_name 调用
debug_testcase - 工具返回包含失败模式的历史数据
- AI 分析数据,并与你的测试代码进行关联(如果可以访问)
- AI 根据模式和代码分析提供具体的修复建议
支持
- 文档:完整的工具文档请参阅 docs/TOOLS.md
- 安装帮助:详细的设置说明请参阅 docs/INSTALLATION.md
- TestDino 支持:[email protected]
- TestDino 文档:https://docs.testdino.com
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。