@xurenxiang1219/pingcode-mcp 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/.env.example +115 -0
  2. package/.env.stdio.local.example +13 -0
  3. package/README.md +222 -0
  4. package/dist/approve-write.d.ts +3 -0
  5. package/dist/approve-write.d.ts.map +1 -0
  6. package/dist/approve-write.js +81 -0
  7. package/dist/approve-write.js.map +1 -0
  8. package/dist/auth/cimd-client-resolver.d.ts +35 -0
  9. package/dist/auth/cimd-client-resolver.d.ts.map +1 -0
  10. package/dist/auth/cimd-client-resolver.js +293 -0
  11. package/dist/auth/cimd-client-resolver.js.map +1 -0
  12. package/dist/auth/memory-store.d.ts +15 -0
  13. package/dist/auth/memory-store.d.ts.map +1 -0
  14. package/dist/auth/memory-store.js +46 -0
  15. package/dist/auth/memory-store.js.map +1 -0
  16. package/dist/auth/pingcode-oauth-client.d.ts +23 -0
  17. package/dist/auth/pingcode-oauth-client.d.ts.map +1 -0
  18. package/dist/auth/pingcode-oauth-client.js +103 -0
  19. package/dist/auth/pingcode-oauth-client.js.map +1 -0
  20. package/dist/auth/pingcode-oauth-provider.d.ts +70 -0
  21. package/dist/auth/pingcode-oauth-provider.d.ts.map +1 -0
  22. package/dist/auth/pingcode-oauth-provider.js +414 -0
  23. package/dist/auth/pingcode-oauth-provider.js.map +1 -0
  24. package/dist/auth/redis-store.d.ts +16 -0
  25. package/dist/auth/redis-store.d.ts.map +1 -0
  26. package/dist/auth/redis-store.js +54 -0
  27. package/dist/auth/redis-store.js.map +1 -0
  28. package/dist/auth/runtime.d.ts +10 -0
  29. package/dist/auth/runtime.d.ts.map +1 -0
  30. package/dist/auth/runtime.js +57 -0
  31. package/dist/auth/runtime.js.map +1 -0
  32. package/dist/auth/store.d.ts +35 -0
  33. package/dist/auth/store.d.ts.map +1 -0
  34. package/dist/auth/store.js +55 -0
  35. package/dist/auth/store.js.map +1 -0
  36. package/dist/auth/token-cipher.d.ts +7 -0
  37. package/dist/auth/token-cipher.d.ts.map +1 -0
  38. package/dist/auth/token-cipher.js +36 -0
  39. package/dist/auth/token-cipher.js.map +1 -0
  40. package/dist/config.d.ts +54 -0
  41. package/dist/config.d.ts.map +1 -0
  42. package/dist/config.js +270 -0
  43. package/dist/config.js.map +1 -0
  44. package/dist/domain/content-hash.d.ts +5 -0
  45. package/dist/domain/content-hash.d.ts.map +1 -0
  46. package/dist/domain/content-hash.js +17 -0
  47. package/dist/domain/content-hash.js.map +1 -0
  48. package/dist/domain/requirement-context.d.ts +29 -0
  49. package/dist/domain/requirement-context.d.ts.map +1 -0
  50. package/dist/domain/requirement-context.js +2 -0
  51. package/dist/domain/requirement-context.js.map +1 -0
  52. package/dist/domain/test-case-context.d.ts +56 -0
  53. package/dist/domain/test-case-context.d.ts.map +1 -0
  54. package/dist/domain/test-case-context.js +2 -0
  55. package/dist/domain/test-case-context.js.map +1 -0
  56. package/dist/domain/work-item-context.d.ts +47 -0
  57. package/dist/domain/work-item-context.d.ts.map +1 -0
  58. package/dist/domain/work-item-context.js +2 -0
  59. package/dist/domain/work-item-context.js.map +1 -0
  60. package/dist/environment.d.ts +2 -0
  61. package/dist/environment.d.ts.map +1 -0
  62. package/dist/environment.js +21 -0
  63. package/dist/environment.js.map +1 -0
  64. package/dist/index.d.ts +3 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +52 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/inspect-wiki.d.ts +3 -0
  69. package/dist/inspect-wiki.d.ts.map +1 -0
  70. package/dist/inspect-wiki.js +49 -0
  71. package/dist/inspect-wiki.js.map +1 -0
  72. package/dist/logger.d.ts +9 -0
  73. package/dist/logger.d.ts.map +1 -0
  74. package/dist/logger.js +40 -0
  75. package/dist/logger.js.map +1 -0
  76. package/dist/mcp/create-server.d.ts +10 -0
  77. package/dist/mcp/create-server.d.ts.map +1 -0
  78. package/dist/mcp/create-server.js +40 -0
  79. package/dist/mcp/create-server.js.map +1 -0
  80. package/dist/mcp/pagination-guidance.d.ts +19 -0
  81. package/dist/mcp/pagination-guidance.d.ts.map +1 -0
  82. package/dist/mcp/pagination-guidance.js +36 -0
  83. package/dist/mcp/pagination-guidance.js.map +1 -0
  84. package/dist/mcp/reference-resolution.d.ts +19 -0
  85. package/dist/mcp/reference-resolution.d.ts.map +1 -0
  86. package/dist/mcp/reference-resolution.js +160 -0
  87. package/dist/mcp/reference-resolution.js.map +1 -0
  88. package/dist/mcp/tool-registry.d.ts +2 -0
  89. package/dist/mcp/tool-registry.d.ts.map +1 -0
  90. package/dist/mcp/tool-registry.js +55 -0
  91. package/dist/mcp/tool-registry.js.map +1 -0
  92. package/dist/mcp/tool-runtime.d.ts +22 -0
  93. package/dist/mcp/tool-runtime.d.ts.map +1 -0
  94. package/dist/mcp/tool-runtime.js +214 -0
  95. package/dist/mcp/tool-runtime.js.map +1 -0
  96. package/dist/mcp/tools/member-role.d.ts +8 -0
  97. package/dist/mcp/tools/member-role.d.ts.map +1 -0
  98. package/dist/mcp/tools/member-role.js +451 -0
  99. package/dist/mcp/tools/member-role.js.map +1 -0
  100. package/dist/mcp/tools/metadata.d.ts +5 -0
  101. package/dist/mcp/tools/metadata.d.ts.map +1 -0
  102. package/dist/mcp/tools/metadata.js +606 -0
  103. package/dist/mcp/tools/metadata.js.map +1 -0
  104. package/dist/mcp/tools/project-context.d.ts +4 -0
  105. package/dist/mcp/tools/project-context.d.ts.map +1 -0
  106. package/dist/mcp/tools/project-context.js +111 -0
  107. package/dist/mcp/tools/project-context.js.map +1 -0
  108. package/dist/mcp/tools/project.d.ts +7 -0
  109. package/dist/mcp/tools/project.d.ts.map +1 -0
  110. package/dist/mcp/tools/project.js +370 -0
  111. package/dist/mcp/tools/project.js.map +1 -0
  112. package/dist/mcp/tools/relation.d.ts +7 -0
  113. package/dist/mcp/tools/relation.d.ts.map +1 -0
  114. package/dist/mcp/tools/relation.js +592 -0
  115. package/dist/mcp/tools/relation.js.map +1 -0
  116. package/dist/mcp/tools/runtime-info.d.ts +4 -0
  117. package/dist/mcp/tools/runtime-info.d.ts.map +1 -0
  118. package/dist/mcp/tools/runtime-info.js +49 -0
  119. package/dist/mcp/tools/runtime-info.js.map +1 -0
  120. package/dist/mcp/tools/ship-suite.d.ts +7 -0
  121. package/dist/mcp/tools/ship-suite.d.ts.map +1 -0
  122. package/dist/mcp/tools/ship-suite.js +636 -0
  123. package/dist/mcp/tools/ship-suite.js.map +1 -0
  124. package/dist/mcp/tools/ship.d.ts +7 -0
  125. package/dist/mcp/tools/ship.d.ts.map +1 -0
  126. package/dist/mcp/tools/ship.js +617 -0
  127. package/dist/mcp/tools/ship.js.map +1 -0
  128. package/dist/mcp/tools/sync.d.ts +10 -0
  129. package/dist/mcp/tools/sync.d.ts.map +1 -0
  130. package/dist/mcp/tools/sync.js +1110 -0
  131. package/dist/mcp/tools/sync.js.map +1 -0
  132. package/dist/mcp/tools/task.d.ts +5 -0
  133. package/dist/mcp/tools/task.d.ts.map +1 -0
  134. package/dist/mcp/tools/task.js +236 -0
  135. package/dist/mcp/tools/task.js.map +1 -0
  136. package/dist/mcp/tools/test-case-bulk.d.ts +7 -0
  137. package/dist/mcp/tools/test-case-bulk.d.ts.map +1 -0
  138. package/dist/mcp/tools/test-case-bulk.js +297 -0
  139. package/dist/mcp/tools/test-case-bulk.js.map +1 -0
  140. package/dist/mcp/tools/test-case-delete.d.ts +7 -0
  141. package/dist/mcp/tools/test-case-delete.d.ts.map +1 -0
  142. package/dist/mcp/tools/test-case-delete.js +247 -0
  143. package/dist/mcp/tools/test-case-delete.js.map +1 -0
  144. package/dist/mcp/tools/test-case.d.ts +5 -0
  145. package/dist/mcp/tools/test-case.d.ts.map +1 -0
  146. package/dist/mcp/tools/test-case.js +155 -0
  147. package/dist/mcp/tools/test-case.js.map +1 -0
  148. package/dist/mcp/tools/test-library.d.ts +7 -0
  149. package/dist/mcp/tools/test-library.d.ts.map +1 -0
  150. package/dist/mcp/tools/test-library.js +302 -0
  151. package/dist/mcp/tools/test-library.js.map +1 -0
  152. package/dist/mcp/tools/wiki.d.ts +5 -0
  153. package/dist/mcp/tools/wiki.d.ts.map +1 -0
  154. package/dist/mcp/tools/wiki.js +266 -0
  155. package/dist/mcp/tools/wiki.js.map +1 -0
  156. package/dist/mcp/write-approval.d.ts +48 -0
  157. package/dist/mcp/write-approval.d.ts.map +1 -0
  158. package/dist/mcp/write-approval.js +321 -0
  159. package/dist/mcp/write-approval.js.map +1 -0
  160. package/dist/observability/metrics.d.ts +46 -0
  161. package/dist/observability/metrics.d.ts.map +1 -0
  162. package/dist/observability/metrics.js +79 -0
  163. package/dist/observability/metrics.js.map +1 -0
  164. package/dist/pingcode/access-token-provider.d.ts +5 -0
  165. package/dist/pingcode/access-token-provider.d.ts.map +1 -0
  166. package/dist/pingcode/access-token-provider.js +2 -0
  167. package/dist/pingcode/access-token-provider.js.map +1 -0
  168. package/dist/pingcode/client.d.ts +43 -0
  169. package/dist/pingcode/client.d.ts.map +1 -0
  170. package/dist/pingcode/client.js +300 -0
  171. package/dist/pingcode/client.js.map +1 -0
  172. package/dist/pingcode/errors.d.ts +20 -0
  173. package/dist/pingcode/errors.d.ts.map +1 -0
  174. package/dist/pingcode/errors.js +14 -0
  175. package/dist/pingcode/errors.js.map +1 -0
  176. package/dist/pingcode/schemas.d.ts +465 -0
  177. package/dist/pingcode/schemas.d.ts.map +1 -0
  178. package/dist/pingcode/schemas.js +450 -0
  179. package/dist/pingcode/schemas.js.map +1 -0
  180. package/dist/pingcode/token-provider.d.ts +20 -0
  181. package/dist/pingcode/token-provider.d.ts.map +1 -0
  182. package/dist/pingcode/token-provider.js +97 -0
  183. package/dist/pingcode/token-provider.js.map +1 -0
  184. package/dist/pingcode/write-response.d.ts +9 -0
  185. package/dist/pingcode/write-response.d.ts.map +1 -0
  186. package/dist/pingcode/write-response.js +39 -0
  187. package/dist/pingcode/write-response.js.map +1 -0
  188. package/dist/services.d.ts +22 -0
  189. package/dist/services.d.ts.map +1 -0
  190. package/dist/services.js +84 -0
  191. package/dist/services.js.map +1 -0
  192. package/dist/sources/metadata-source.d.ts +445 -0
  193. package/dist/sources/metadata-source.d.ts.map +1 -0
  194. package/dist/sources/metadata-source.js +167 -0
  195. package/dist/sources/metadata-source.js.map +1 -0
  196. package/dist/sources/project-context-source.d.ts +61 -0
  197. package/dist/sources/project-context-source.d.ts.map +1 -0
  198. package/dist/sources/project-context-source.js +224 -0
  199. package/dist/sources/project-context-source.js.map +1 -0
  200. package/dist/sources/relation-source.d.ts +83 -0
  201. package/dist/sources/relation-source.d.ts.map +1 -0
  202. package/dist/sources/relation-source.js +129 -0
  203. package/dist/sources/relation-source.js.map +1 -0
  204. package/dist/sources/requirement-source.d.ts +5 -0
  205. package/dist/sources/requirement-source.d.ts.map +1 -0
  206. package/dist/sources/requirement-source.js +2 -0
  207. package/dist/sources/requirement-source.js.map +1 -0
  208. package/dist/sources/ship-source.d.ts +67 -0
  209. package/dist/sources/ship-source.d.ts.map +1 -0
  210. package/dist/sources/ship-source.js +135 -0
  211. package/dist/sources/ship-source.js.map +1 -0
  212. package/dist/sources/test-case-source.d.ts +30 -0
  213. package/dist/sources/test-case-source.d.ts.map +1 -0
  214. package/dist/sources/test-case-source.js +206 -0
  215. package/dist/sources/test-case-source.js.map +1 -0
  216. package/dist/sources/wiki-source.d.ts +34 -0
  217. package/dist/sources/wiki-source.d.ts.map +1 -0
  218. package/dist/sources/wiki-source.js +136 -0
  219. package/dist/sources/wiki-source.js.map +1 -0
  220. package/dist/sources/work-item-source.d.ts +33 -0
  221. package/dist/sources/work-item-source.d.ts.map +1 -0
  222. package/dist/sources/work-item-source.js +159 -0
  223. package/dist/sources/work-item-source.js.map +1 -0
  224. package/dist/sources/write-source.d.ts +461 -0
  225. package/dist/sources/write-source.d.ts.map +1 -0
  226. package/dist/sources/write-source.js +174 -0
  227. package/dist/sources/write-source.js.map +1 -0
  228. package/dist/transports/bearer-auth.d.ts +20 -0
  229. package/dist/transports/bearer-auth.d.ts.map +1 -0
  230. package/dist/transports/bearer-auth.js +79 -0
  231. package/dist/transports/bearer-auth.js.map +1 -0
  232. package/dist/transports/http.d.ts +11 -0
  233. package/dist/transports/http.d.ts.map +1 -0
  234. package/dist/transports/http.js +203 -0
  235. package/dist/transports/http.js.map +1 -0
  236. package/dist/transports/metrics-auth.d.ts +3 -0
  237. package/dist/transports/metrics-auth.d.ts.map +1 -0
  238. package/dist/transports/metrics-auth.js +22 -0
  239. package/dist/transports/metrics-auth.js.map +1 -0
  240. package/dist/transports/stdio.d.ts +5 -0
  241. package/dist/transports/stdio.d.ts.map +1 -0
  242. package/dist/transports/stdio.js +11 -0
  243. package/dist/transports/stdio.js.map +1 -0
  244. package/dist/uat/run-label.d.ts +2 -0
  245. package/dist/uat/run-label.d.ts.map +1 -0
  246. package/dist/uat/run-label.js +12 -0
  247. package/dist/uat/run-label.js.map +1 -0
  248. package/dist/verify.d.ts +3 -0
  249. package/dist/verify.d.ts.map +1 -0
  250. package/dist/verify.js +59 -0
  251. package/dist/verify.js.map +1 -0
  252. package/dist/write/approval.d.ts +35 -0
  253. package/dist/write/approval.d.ts.map +1 -0
  254. package/dist/write/approval.js +66 -0
  255. package/dist/write/approval.js.map +1 -0
  256. package/dist/write/plan.d.ts +2 -0
  257. package/dist/write/plan.d.ts.map +1 -0
  258. package/dist/write/plan.js +17 -0
  259. package/dist/write/plan.js.map +1 -0
  260. package/dist/write/runtime.d.ts +90 -0
  261. package/dist/write/runtime.d.ts.map +1 -0
  262. package/dist/write/runtime.js +244 -0
  263. package/dist/write/runtime.js.map +1 -0
  264. package/dist/write/store.d.ts +101 -0
  265. package/dist/write/store.d.ts.map +1 -0
  266. package/dist/write/store.js +201 -0
  267. package/dist/write/store.js.map +1 -0
  268. package/package.json +58 -0
@@ -0,0 +1,451 @@
1
+ import * as z from "zod/v4";
2
+ import { PingCodeError } from "../../pingcode/errors.js";
3
+ import { contentHashSchema } from "../../domain/content-hash.js";
4
+ import { requestHash as calculateRequestHash } from "../../write/plan.js";
5
+ import { executeTool, requestIdForLog } from "../tool-runtime.js";
6
+ import { approvalTokenSchema, commitWithApproval, formatPreviewToolResult, formatWriteConfirmationMessage, formatWriteToolResult, requestClientWriteConfirmation, resolveCommitVerification, } from "../write-approval.js";
7
+ const identifier = z.string().trim().min(1).max(200);
8
+ const contentHash = contentHashSchema;
9
+ const approvalContextId = z.string().uuid();
10
+ const agentSessionId = z.string().trim().min(8).max(200).optional();
11
+ const resourceTypeSchema = z.enum(["project", "test_library"]);
12
+ const sourceReferenceSchema = z.object({
13
+ type: z.enum(["project", "test_library", "plan", "spec"]),
14
+ id: identifier,
15
+ content_hash: contentHash.optional(),
16
+ }).strict();
17
+ const roleFieldsBase = {
18
+ resource_type: resourceTypeSchema.describe("角色所属资源类型"),
19
+ resource_id: identifier.describe("项目或测试库内部 ID;项目来自 pingcode_project_list,测试库来自 pingcode_test_library_list"),
20
+ member_id: identifier.describe("成员用户/成员关系 ID;先通过对应项目或测试库成员目录读取并确认,不要猜测或手填"),
21
+ };
22
+ const roleFieldsSchema = z.union([
23
+ z.object({
24
+ ...roleFieldsBase,
25
+ role_id: identifier.describe("内部兼容字段;正常用户流程不要要求用户输入。Tool 会使用 PingCode 角色目录验证该 ID"),
26
+ role_name: z.never().optional(),
27
+ }).strict(),
28
+ z.object({
29
+ ...roleFieldsBase,
30
+ role_id: z.never().optional(),
31
+ role_name: identifier.describe("用户可提供的目标成员角色名称;Tool 会在 PingCode 角色目录中解析唯一对应 ID,正常流程不要求用户输入 ID(不要求用户手动输入 ID)"),
32
+ }).strict(),
33
+ ]);
34
+ const rolePlanSchema = z.object({
35
+ plan_id: identifier.describe("成员角色调整计划 ID;Preview 与 Commit 必须完全相同"),
36
+ operations: z.array(z.object({
37
+ operation_id: identifier,
38
+ action: z.literal("update"),
39
+ fields: roleFieldsSchema,
40
+ source_references: z.array(sourceReferenceSchema).min(1).max(20),
41
+ }).strict()).length(1),
42
+ }).strict();
43
+ const readInputSchema = z.object({
44
+ resource_type: resourceTypeSchema.optional().describe("角色所属资源类型;可选 project 或 test_library"),
45
+ resource_id: identifier.optional().describe("项目或测试库内部 ID;来自 pingcode_project_list 或 pingcode_test_library_list"),
46
+ member_id: identifier.optional().describe("成员用户/成员关系 ID;来自对应项目或测试库成员目录"),
47
+ }).strict();
48
+ const readOutput = {
49
+ resourceType: resourceTypeSchema,
50
+ resourceId: z.string(),
51
+ resourceName: z.string(),
52
+ resourceIdentifier: z.string(),
53
+ memberId: z.string(),
54
+ memberUserId: z.string().nullable(),
55
+ currentRoleId: z.string().nullable(),
56
+ currentRoleName: z.string().nullable(),
57
+ roleNameAvailable: z.boolean(),
58
+ roleAvailable: z.boolean(),
59
+ };
60
+ const previewAnnotations = {
61
+ readOnlyHint: true,
62
+ destructiveHint: false,
63
+ idempotentHint: false,
64
+ openWorldHint: true,
65
+ };
66
+ const commitAnnotations = {
67
+ readOnlyHint: false,
68
+ destructiveHint: true,
69
+ idempotentHint: true,
70
+ openWorldHint: true,
71
+ };
72
+ export function registerMemberRoleTools(server, services, logger, runtime, writeApprovalMode) {
73
+ server.registerTool("pingcode_member_role_get", {
74
+ title: "读取 PingCode 成员角色",
75
+ description: "读取项目或测试库内指定成员的当前角色。成员角色调整前应先调用此 Tool,确认资源、成员和当前角色;不写入 PingCode,不猜测 role_id。",
76
+ inputSchema: readInputSchema.shape,
77
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
78
+ }, async (input, extra) => executeTool(logger, "pingcode_member_role_get", requestIdForLog(extra.requestInfo?.headers["x-request-id"], extra.requestId), { resourceType: input.resource_type ?? "", resourceId: input.resource_id ?? "", memberId: input.member_id ?? "" }, async () => {
79
+ if (input.resource_type === undefined || input.resource_id === undefined || input.member_id === undefined) {
80
+ throw new PingCodeError("缺少 resource_type、resource_id 或 member_id;请先调用 pingcode_project_list/pingcode_test_library_list 选择资源,并从成员目录取得 member_id", "BAD_REQUEST");
81
+ }
82
+ const target = await readRoleTarget({
83
+ resource_type: input.resource_type,
84
+ resource_id: input.resource_id,
85
+ member_id: input.member_id,
86
+ }, services);
87
+ return {
88
+ resourceType: target.resourceType,
89
+ resourceId: target.resourceId,
90
+ resourceName: target.resourceName,
91
+ resourceIdentifier: target.resourceIdentifier,
92
+ memberId: target.memberId,
93
+ memberUserId: target.memberUserId,
94
+ currentRoleId: target.roleId,
95
+ currentRoleName: target.roleName,
96
+ roleNameAvailable: target.roleName !== null,
97
+ roleAvailable: target.roleId !== null,
98
+ };
99
+ }, { formatResult: formatRoleReadResult }));
100
+ server.registerTool("pingcode_member_role_update_preview", {
101
+ title: "预览调整 PingCode 成员角色",
102
+ description: "仅预览项目或测试库成员角色调整,不写入 PingCode。每个 operations 元素必须是 JSON 对象;fields 必须是 {resource_type, resource_id, member_id, role_name}(或 role_id)对象,不能把 fields 序列化成字符串;source_references 是 operation 内与 fields 同级的必填数组。必须先确认目标资源和成员。用户流程应传 role_name,role_id 仅是 Tool 之间复用的内部兼容字段;两者只能传一个。Tool 会自行读取 PingCode 角色目录,把名称解析为唯一 ID,名称不存在或不唯一时返回可选角色并拒绝 Preview,不要求用户手动输入 ID。Tool 同时读取目标资源成员当前角色。Preview 成功后才可调用对应 Commit,正常用户回复不展示内部 hash 或审批字段,不得在正常用户回复中展示内部验证字段。",
103
+ inputSchema: {
104
+ ...rolePlanSchema.shape,
105
+ plan_id: rolePlanSchema.shape.plan_id.optional().describe("业务上必填;省略仅用于返回缺参引导"),
106
+ operations: rolePlanSchema.shape.operations.optional().describe("业务上必填且一次只处理一个成员角色操作;省略仅用于返回缺参引导"),
107
+ agent_session_id: agentSessionId,
108
+ },
109
+ annotations: previewAnnotations,
110
+ }, async (input, extra) => executeTool(logger, "pingcode_member_role_update_preview", requestIdForLog(extra.requestInfo?.headers["x-request-id"], extra.requestId), { planId: input.plan_id ?? "" }, () => {
111
+ if (input.plan_id === undefined || input.operations === undefined) {
112
+ throw new PingCodeError("缺少 plan_id 或 operations;请补充成员角色调整计划后重试 Preview", "BAD_REQUEST");
113
+ }
114
+ return previewRolePlan({ plan_id: input.plan_id, operations: input.operations }, services, runtime, input.agent_session_id, extra.authInfo);
115
+ }, { formatResult: formatPreviewToolResult }));
116
+ server.registerTool("pingcode_member_role_update_commit", {
117
+ title: "提交 PingCode 成员角色调整",
118
+ description: "依已核准的 Preview 调整项目或测试库成员角色。Tool 会再次使用 PingCode 角色目录验证 Preview 中的 role_id,或把 role_name 解析为唯一 ID。Commit 必须原样复用 Preview 请求中的 plan_id 和 operations;是否要求当前 MCP Client 确认由 PINGCODE_WRITE_CONFIRMATION 决定。",
119
+ inputSchema: {
120
+ ...rolePlanSchema.shape,
121
+ agent_session_id: agentSessionId,
122
+ preview_id: approvalContextId.optional().describe("可选。省略时 Server 依相同 plan_id 与 operations 自动匹配刚才的 Preview,并据此恢复 request hash、evidence hash、session binding 和幂等边界;仅当客户端确实读到 Preview 的 approvalContextId 时才需要传入"),
123
+ approval_context_id: approvalContextId.optional().describe("已弃用,等同 preview_id;新调用只传 preview_id"),
124
+ approval_token: approvalTokenSchema(writeApprovalMode),
125
+ idempotency_key: identifier.min(16).max(200).optional(),
126
+ },
127
+ annotations: commitAnnotations,
128
+ }, async (input, extra) => executeTool(logger, "pingcode_member_role_update_commit", requestIdForLog(extra.requestInfo?.headers["x-request-id"], extra.requestId), { planId: input.plan_id }, async () => {
129
+ runtime.assertMcpWriteScope(extra.authInfo?.scopes);
130
+ const operation = input.operations[0];
131
+ if (!operation) {
132
+ throw new PingCodeError("成员角色调整计划不能为空", "BAD_REQUEST");
133
+ }
134
+ const verification = await resolveCommitVerification(runtime, {
135
+ previewId: input.preview_id,
136
+ approvalContextId: input.approval_context_id,
137
+ idempotencyKey: input.idempotency_key,
138
+ requestHash: calculateRequestHash({ plan_id: input.plan_id, operations: input.operations }),
139
+ agentSessionId: input.agent_session_id,
140
+ authInfo: extra.authInfo,
141
+ }, "member_role");
142
+ const resolvedInput = {
143
+ ...input,
144
+ request_hash: verification.requestHash,
145
+ approval_context_id: verification.approvalContextId,
146
+ session_binding: verification.sessionBinding,
147
+ evidence_hash: verification.evidenceHash,
148
+ idempotency_key: verification.idempotencyKey,
149
+ };
150
+ const target = await readRoleTarget(operation.fields, services);
151
+ const targetRole = await findRole(operation.fields, services);
152
+ await requestClientWriteConfirmation(server, logger, writeApprovalMode, input.approval_token, formatRoleConfirmation(target, targetRole), runtime.requiresConfirmation(["update"]));
153
+ return commitRolePlan(resolvedInput, services, runtime, writeApprovalMode, extra.authInfo);
154
+ }, { formatResult: formatWriteToolResult }));
155
+ }
156
+ async function previewRolePlan(input, services, runtime, agentSessionIdValue, authInfo) {
157
+ const operation = input.operations[0];
158
+ if (!operation) {
159
+ throw new PingCodeError("成员角色调整计划不能为空", "BAD_REQUEST");
160
+ }
161
+ const target = await readRoleTarget(operation.fields, services);
162
+ const targetRole = await findRole(operation.fields, services);
163
+ if (target.roleId === targetRole.id) {
164
+ throw new PingCodeError(`成员 ${target.memberUserId ?? target.memberId} 已经是角色 ${targetRole.name} (${targetRole.id}),无需重复写入`, "CONFLICT");
165
+ }
166
+ const operations = [roleDisplayOperation(operation, target, targetRole)];
167
+ const plan = { plan_id: input.plan_id, operations: input.operations };
168
+ const requestHash = calculateRequestHash(plan);
169
+ const evidenceHash = calculateRequestHash({ planId: input.plan_id, requestHash, operations });
170
+ const context = await runtime.createApprovalContext({
171
+ resourceType: "member_role",
172
+ requestHash,
173
+ evidenceHash,
174
+ ...(agentSessionIdValue === undefined ? {} : { agentSessionId: agentSessionIdValue }),
175
+ ...(authInfo === undefined ? {} : { authInfo }),
176
+ });
177
+ return {
178
+ planId: input.plan_id,
179
+ requestHash,
180
+ approvalContextId: context.approvalContextId,
181
+ sessionBinding: context.sessionBinding,
182
+ evidenceHash,
183
+ approvalExpiresAt: context.expiresAt,
184
+ counts: { creates: 0, updates: 1, relations: 0 },
185
+ warnings: target.roleId === null ? ["当前成员没有可识别的既有角色,Commit 将直接设置目标角色"] : [],
186
+ operations,
187
+ };
188
+ }
189
+ async function commitRolePlan(input, services, runtime, writeApprovalMode, authInfo) {
190
+ const plan = { plan_id: input.plan_id, operations: input.operations };
191
+ if (calculateRequestHash(plan) !== input.request_hash) {
192
+ throw new PingCodeError("Commit 内容与成员角色 Preview request hash 不一致", "CONFLICT");
193
+ }
194
+ const operation = input.operations[0];
195
+ if (!operation) {
196
+ throw new PingCodeError("成员角色调整计划不能为空", "BAD_REQUEST");
197
+ }
198
+ const target = await readRoleTarget(operation.fields, services);
199
+ const targetRole = await findRole(operation.fields, services);
200
+ if (target.roleId === targetRole.id) {
201
+ throw new PingCodeError("成员角色已经是目标角色,未执行重复写入", "CONFLICT");
202
+ }
203
+ const displayOperation = roleDisplayOperation(operation, target, targetRole);
204
+ const evidenceHash = calculateRequestHash({
205
+ planId: input.plan_id,
206
+ requestHash: input.request_hash,
207
+ operations: [displayOperation],
208
+ });
209
+ if (evidenceHash !== input.evidence_hash) {
210
+ throw new PingCodeError("Commit 内容与成员角色 Preview evidence hash 不一致", "CONFLICT");
211
+ }
212
+ const committed = await commitWithApproval(runtime, writeApprovalMode, {
213
+ resourceType: "member_role",
214
+ requestHash: input.request_hash,
215
+ evidenceHash: input.evidence_hash,
216
+ approvalContextId: input.approval_context_id,
217
+ sessionBinding: input.session_binding,
218
+ ...(input.agent_session_id === undefined ? {} : { agentSessionId: input.agent_session_id }),
219
+ approvalToken: input.approval_token,
220
+ idempotencyKey: input.idempotency_key,
221
+ ...(authInfo === undefined ? {} : { authInfo }),
222
+ actions: ["update"],
223
+ action: async () => {
224
+ if (operation.fields.resource_type === "project") {
225
+ await services.getWriteSource().updateProjectMemberRole(operation.fields.resource_id, target.memberId, targetRole.id);
226
+ }
227
+ else {
228
+ await services.getWriteSource().updateTestLibraryMemberRole(operation.fields.resource_id, target.memberId, targetRole.id);
229
+ }
230
+ const after = await readRoleTarget(operation.fields, services);
231
+ if (after.roleId !== targetRole.id) {
232
+ throw new PingCodeError(`${target.resourceName} 的成员角色写入已请求,但 MCP 回读未确认目标角色;禁止更换幂等键重试`, "WRITE_OUTCOME_UNKNOWN");
233
+ }
234
+ return {
235
+ planId: input.plan_id,
236
+ resources: [{
237
+ operationId: operation.operation_id,
238
+ action: "update",
239
+ id: target.resourceId,
240
+ identifier: target.resourceIdentifier,
241
+ name: target.resourceName,
242
+ memberId: target.memberId,
243
+ roleId: targetRole.id,
244
+ roleName: targetRole.name,
245
+ verified: true,
246
+ }],
247
+ };
248
+ },
249
+ });
250
+ return {
251
+ planId: committed.result.planId,
252
+ resources: committed.result.resources,
253
+ replayed: committed.replayed,
254
+ approvedBy: committed.approval.approvedBy,
255
+ auditId: committed.auditId,
256
+ };
257
+ }
258
+ async function readRoleTarget(fields, services) {
259
+ if (fields.resource_type === "project") {
260
+ const project = await services.getMetadataSource().getProject(fields.resource_id);
261
+ const members = await listProjectMembers(fields.resource_id, services);
262
+ const member = members.find((candidate) => {
263
+ const value = candidate;
264
+ const user = value.user;
265
+ return value.id === fields.member_id || user?.id === fields.member_id;
266
+ });
267
+ if (!member) {
268
+ throw new PingCodeError(`项目 ${project.name} 中不存在成员 ${fields.member_id}`, "NOT_FOUND");
269
+ }
270
+ const value = member;
271
+ const user = value.user;
272
+ return {
273
+ resourceType: "project",
274
+ resourceId: project.id,
275
+ resourceName: project.name,
276
+ resourceIdentifier: project.identifier,
277
+ memberId: typeof value.id === "string" ? value.id : fields.member_id,
278
+ memberUserId: typeof user?.id === "string" ? user.id : fields.member_id,
279
+ roleId: readRoleId(value),
280
+ roleName: readRoleName(value),
281
+ };
282
+ }
283
+ const library = await services.getMetadataSource().getTestLibrary(fields.resource_id);
284
+ const members = await listTestLibraryMembers(fields.resource_id, services);
285
+ const member = members.find((candidate) => {
286
+ const value = candidate;
287
+ const user = value.user;
288
+ return value.id === fields.member_id || user?.id === fields.member_id;
289
+ });
290
+ if (!member) {
291
+ throw new PingCodeError(`测试库 ${library.name} 中不存在成员 ${fields.member_id}`, "NOT_FOUND");
292
+ }
293
+ const listedValue = member;
294
+ const membershipId = typeof listedValue.id === "string" ? listedValue.id : fields.member_id;
295
+ const value = await services.getMetadataSource().getTestLibraryMember(fields.resource_id, membershipId);
296
+ const user = value.user;
297
+ return {
298
+ resourceType: "test_library",
299
+ resourceId: library.id,
300
+ resourceName: library.name,
301
+ resourceIdentifier: library.identifier,
302
+ memberId: typeof value.id === "string" ? value.id : membershipId,
303
+ memberUserId: typeof user?.id === "string" ? user.id : fields.member_id,
304
+ roleId: readRoleId(value),
305
+ roleName: readRoleName(value),
306
+ };
307
+ }
308
+ async function findRole(fields, services) {
309
+ const roles = await listAllRoles(services);
310
+ if (fields.role_id !== undefined) {
311
+ const role = roles.find((candidate) => candidate.id === fields.role_id);
312
+ if (role) {
313
+ return role;
314
+ }
315
+ throw new PingCodeError(`角色 ID ${fields.role_id} 不在 PingCode 角色目录中,请使用 pingcode_role_list 查看可选角色。${formatRoleCandidates(roles)}`, "NOT_FOUND");
316
+ }
317
+ const matches = roles.filter((candidate) => candidate.name === fields.role_name);
318
+ if (matches.length === 0) {
319
+ throw new PingCodeError(`角色名称 ${fields.role_name ?? ""} 不在 PingCode 角色目录中,请使用 pingcode_role_list 查看可选角色。${formatRoleCandidates(roles)}`, "NOT_FOUND");
320
+ }
321
+ if (matches.length > 1) {
322
+ throw new PingCodeError(`角色名称 ${fields.role_name ?? ""} 对应多个角色 ID:${matches.map((role) => `${role.name} (${role.id})`).join("、")};请选择具体 role_id`, "CONFLICT");
323
+ }
324
+ const role = matches[0];
325
+ if (!role) {
326
+ throw new PingCodeError("PingCode 角色目录返回了无法解析的结果", "INVALID_RESPONSE");
327
+ }
328
+ return { id: role.id, name: role.name };
329
+ }
330
+ async function listAllRoles(services) {
331
+ const roles = [];
332
+ let pageIndex = 0;
333
+ for (let pageCount = 0; pageCount < 100; pageCount += 1) {
334
+ const page = await services.getMetadataSource().listRoles({ pageIndex, pageSize: 100 });
335
+ roles.push(...page.values.map((role) => ({ id: role.id, name: role.name })));
336
+ if (roles.length >= page.total || page.values.length === 0) {
337
+ return roles;
338
+ }
339
+ pageIndex = page.page_index + 1;
340
+ }
341
+ throw new PingCodeError("PingCode 角色目录超过安全扫描上限,无法解析目标角色", "RESPONSE_TOO_LARGE");
342
+ }
343
+ function formatRoleCandidates(roles) {
344
+ if (roles.length === 0) {
345
+ return "当前角色目录为空,请检查 directory 读取权限";
346
+ }
347
+ const visible = roles.slice(0, 20).map((role) => `${role.name} (${role.id})`).join("、");
348
+ const suffix = roles.length > 20 ? `;另有 ${roles.length - 20} 个角色可通过 pingcode_role_list 分页查看` : "";
349
+ return `可选角色:${visible}${suffix}`;
350
+ }
351
+ async function listProjectMembers(projectId, services) {
352
+ const values = [];
353
+ let pageIndex = 0;
354
+ for (let pageCount = 0; pageCount < 100; pageCount += 1) {
355
+ const page = await services.getMetadataSource().listProjectMembers(projectId, {
356
+ pageIndex,
357
+ pageSize: 100,
358
+ });
359
+ values.push(...page.values);
360
+ if (values.length >= page.total || page.values.length === 0) {
361
+ return values;
362
+ }
363
+ pageIndex = page.page_index + 1;
364
+ }
365
+ throw new PingCodeError(`项目 ${projectId} 的成员数量超过安全扫描上限,无法读取成员角色`, "RESPONSE_TOO_LARGE");
366
+ }
367
+ async function listTestLibraryMembers(libraryId, services) {
368
+ const values = [];
369
+ let pageIndex = 0;
370
+ for (let pageCount = 0; pageCount < 100; pageCount += 1) {
371
+ const page = await services.getMetadataSource().listTestLibraryMembers(libraryId, {
372
+ pageIndex,
373
+ pageSize: 100,
374
+ });
375
+ values.push(...page.values);
376
+ if (values.length >= page.total || page.values.length === 0) {
377
+ return values;
378
+ }
379
+ pageIndex = page.page_index + 1;
380
+ }
381
+ throw new PingCodeError(`测试库 ${libraryId} 的成员数量超过安全扫描上限,无法读取成员角色`, "RESPONSE_TOO_LARGE");
382
+ }
383
+ function readRoleId(value) {
384
+ if (typeof value.role_id === "string") {
385
+ return value.role_id;
386
+ }
387
+ if (typeof value.roleId === "string") {
388
+ return value.roleId;
389
+ }
390
+ const role = value.role;
391
+ return role && typeof role === "object" && "id" in role && typeof role.id === "string"
392
+ ? role.id
393
+ : null;
394
+ }
395
+ export function readRoleName(value) {
396
+ for (const key of ["role_name", "roleName"]) {
397
+ if (typeof value[key] === "string" && value[key].trim().length > 0) {
398
+ return value[key].trim();
399
+ }
400
+ }
401
+ const role = value.role;
402
+ if (!role || typeof role !== "object") {
403
+ return null;
404
+ }
405
+ const roleValue = role;
406
+ for (const key of ["name", "display_name", "label", "title"]) {
407
+ if (typeof roleValue[key] === "string" && roleValue[key].trim().length > 0) {
408
+ return roleValue[key].trim();
409
+ }
410
+ }
411
+ return null;
412
+ }
413
+ function roleDisplayOperation(operation, target, targetRole) {
414
+ return {
415
+ operationId: operation.operation_id,
416
+ action: "update",
417
+ targetId: target.resourceId,
418
+ changes: {
419
+ resource: { before: `${target.resourceName} (${target.resourceIdentifier})`, after: `${target.resourceName} (${target.resourceIdentifier})` },
420
+ member: { before: target.memberUserId ?? target.memberId, after: target.memberUserId ?? target.memberId },
421
+ role_id: {
422
+ before: target.roleId,
423
+ after: targetRole ? `${targetRole.name} (${targetRole.id})` : operation.fields.role_id ?? operation.fields.role_name,
424
+ },
425
+ },
426
+ sourceReferences: operation.source_references,
427
+ };
428
+ }
429
+ function formatRoleReadResult(result) {
430
+ const currentRole = result.currentRoleName
431
+ ? `${result.currentRoleName}${result.currentRoleId ? ` (${result.currentRoleId})` : ""}`
432
+ : result.currentRoleId
433
+ ? `PingCode 未返回角色名称,仅返回 ID (${result.currentRoleId})`
434
+ : "PingCode 未返回角色 ID 或名称";
435
+ return [
436
+ `已读取${result.resourceType === "project" ? "项目" : "测试库"}成员角色`,
437
+ `- 资源:${result.resourceName} (${result.resourceIdentifier})`,
438
+ `- 成员 ID:${result.memberUserId ?? result.memberId}`,
439
+ `- 当前角色:${currentRole}`,
440
+ ].join("\n");
441
+ }
442
+ function formatRoleConfirmation(target, targetRole) {
443
+ return formatWriteConfirmationMessage("即将调整 PingCode 成员角色", [
444
+ `资源:${target.resourceName} (${target.resourceIdentifier})`,
445
+ `资源类型:${target.resourceType === "project" ? "项目" : "测试库"}`,
446
+ `成员:已确认成员`,
447
+ `当前角色:${target.roleName ?? "未返回角色名称"}${target.roleId ? ` (${target.roleId})` : ""}`,
448
+ `目标角色:${targetRole.name}`,
449
+ ]);
450
+ }
451
+ //# sourceMappingURL=member-role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"member-role.js","sourceRoot":"","sources":["../../../src/mcp/tools/member-role.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Logger } from "../../logger.js";
3
+ import type { Services } from "../../services.js";
4
+ export declare function registerMetadataTools(server: McpServer, services: Services, logger: Logger): void;
5
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA0ClD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAyVjG"}