tapd-mcp 1.0.0

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.
@@ -0,0 +1,479 @@
1
+ /**
2
+ * TAPD API Client - Handles all HTTP requests to TAPD Open API
3
+ */
4
+ const STATUS_MAP = {
5
+ 'planning': 'planning',
6
+ 'developing': 'developing',
7
+ 'testing': 'testing',
8
+ 'resolved': 'resolved',
9
+ 'closed': 'closed',
10
+ 'rejected': 'rejected',
11
+ };
12
+ const STORY_STATUS_MAP = {
13
+ '1': '草稿',
14
+ '2': '待评审',
15
+ '3': '评审通过',
16
+ '4': '开发中',
17
+ '5': '测试中',
18
+ '6': '已完成',
19
+ '7': '已关闭',
20
+ '8': '已拒绝',
21
+ 'planning': '待规划',
22
+ 'developing': '开发中',
23
+ 'testing': '测试中',
24
+ 'resolved': '已完成',
25
+ 'closed': '已关闭',
26
+ 'rejected': '已拒绝',
27
+ };
28
+ const TASK_STATUS_MAP = {
29
+ 'open': '未开始',
30
+ 'progressing': '进行中',
31
+ 'done': '已完成',
32
+ };
33
+ const BUG_STATUS_MAP = {
34
+ 'new': '新建',
35
+ 'in_progress': '接受/处理',
36
+ 'resolved': '已解决',
37
+ 'verified': '已验证',
38
+ 'closed': '已关闭',
39
+ 'rejected': '已拒绝',
40
+ 'reopened': '重新打开',
41
+ };
42
+ export class TapdClient {
43
+ apiToken;
44
+ baseUrl;
45
+ constructor(config) {
46
+ this.apiToken = config.apiToken;
47
+ this.baseUrl = config.baseUrl || 'https://api.tapd.cn';
48
+ }
49
+ async request(method, endpoint, params) {
50
+ const url = new URL(endpoint, this.baseUrl);
51
+ const filteredParams = {};
52
+ if (params) {
53
+ for (const [key, value] of Object.entries(params)) {
54
+ if (value !== undefined && value !== null && value !== '') {
55
+ filteredParams[key] = String(value);
56
+ }
57
+ }
58
+ }
59
+ const headers = {
60
+ 'Authorization': `Bearer ${this.apiToken}`,
61
+ 'Accept': 'application/json',
62
+ 'User-Agent': 'TAPD-MCP-Server/1.0',
63
+ };
64
+ let response;
65
+ if (method === 'GET') {
66
+ url.search = new URLSearchParams(filteredParams).toString();
67
+ response = await fetch(url.toString(), { method, headers });
68
+ }
69
+ else {
70
+ headers['Content-Type'] = 'application/x-www-form-urlencoded';
71
+ response = await fetch(url.toString(), {
72
+ method,
73
+ headers,
74
+ body: new URLSearchParams(filteredParams).toString(),
75
+ });
76
+ }
77
+ if (!response.ok) {
78
+ const text = await response.text();
79
+ throw new Error(`TAPD API error: ${response.status} ${response.statusText} - ${text}`);
80
+ }
81
+ const data = await response.json();
82
+ if (data.status !== 1) {
83
+ throw new Error(`TAPD API error: ${data.info || 'Unknown error'}`);
84
+ }
85
+ // Normalize response: POST returns {data: {Story: ...}}, GET returns {data: [{Story: ...}]}
86
+ // Convert single object to array format for consistency
87
+ if (data.data && !Array.isArray(data.data)) {
88
+ data.data = [data.data];
89
+ }
90
+ return data;
91
+ }
92
+ // ==================== Story APIs ====================
93
+ async getStory(workspaceId, storyId, fields) {
94
+ const response = await this.request('GET', '/stories', {
95
+ workspace_id: workspaceId,
96
+ id: storyId,
97
+ limit: 1,
98
+ fields,
99
+ });
100
+ if (response.data && response.data.length > 0) {
101
+ return response.data[0].Story;
102
+ }
103
+ return null;
104
+ }
105
+ async listStories(workspaceId, options) {
106
+ const response = await this.request('GET', '/stories', {
107
+ workspace_id: workspaceId,
108
+ iteration_id: options?.iterationId,
109
+ status: options?.status,
110
+ owner: options?.owner,
111
+ creator: options?.creator,
112
+ limit: options?.limit || 30,
113
+ page: options?.page || 1,
114
+ fields: options?.fields,
115
+ });
116
+ return response.data?.map(item => item.Story) || [];
117
+ }
118
+ async createStory(workspaceId, data) {
119
+ const response = await this.request('POST', '/stories', {
120
+ workspace_id: workspaceId,
121
+ name: data.name,
122
+ description: data.description,
123
+ owner: data.owner,
124
+ priority: data.priority,
125
+ iteration_id: data.iterationId,
126
+ parent_id: data.parentId,
127
+ begin: data.begin,
128
+ due: data.due,
129
+ category_id: data.categoryId,
130
+ release_id: data.releaseId,
131
+ });
132
+ if (!response.data || response.data.length === 0) {
133
+ throw new Error('Failed to create story: no data returned');
134
+ }
135
+ return response.data[0].Story;
136
+ }
137
+ async updateStory(workspaceId, storyId, data) {
138
+ const response = await this.request('POST', '/stories', {
139
+ workspace_id: workspaceId,
140
+ id: storyId,
141
+ name: data.name,
142
+ description: data.description,
143
+ owner: data.owner,
144
+ status: data.status,
145
+ priority: data.priority,
146
+ iteration_id: data.iterationId,
147
+ begin: data.begin,
148
+ due: data.due,
149
+ category_id: data.categoryId,
150
+ release_id: data.releaseId,
151
+ });
152
+ if (!response.data || response.data.length === 0) {
153
+ throw new Error('Failed to update story: no data returned');
154
+ }
155
+ return response.data[0].Story;
156
+ }
157
+ async getStoryChanges(workspaceId, storyId, options) {
158
+ const response = await this.request('GET', '/story_changes', {
159
+ workspace_id: workspaceId,
160
+ story_id: storyId,
161
+ limit: options?.limit || 20,
162
+ page: options?.page || 1,
163
+ });
164
+ return response.data?.map(item => item.WorkitemChange) || [];
165
+ }
166
+ // ==================== Task APIs ====================
167
+ async getTask(workspaceId, taskId) {
168
+ const response = await this.request('GET', '/tasks', {
169
+ workspace_id: workspaceId,
170
+ id: taskId,
171
+ limit: 1,
172
+ });
173
+ if (response.data && response.data.length > 0) {
174
+ return response.data[0].Task;
175
+ }
176
+ return null;
177
+ }
178
+ async listTasks(workspaceId, options) {
179
+ const response = await this.request('GET', '/tasks', {
180
+ workspace_id: workspaceId,
181
+ story_id: options?.storyId,
182
+ iteration_id: options?.iterationId,
183
+ status: options?.status,
184
+ owner: options?.owner,
185
+ creator: options?.creator,
186
+ limit: options?.limit || 30,
187
+ page: options?.page || 1,
188
+ fields: options?.fields,
189
+ });
190
+ return response.data?.map(item => item.Task) || [];
191
+ }
192
+ async createTask(workspaceId, data) {
193
+ const response = await this.request('POST', '/tasks', {
194
+ workspace_id: workspaceId,
195
+ name: data.name,
196
+ story_id: data.storyId,
197
+ description: data.description,
198
+ owner: data.owner,
199
+ priority: data.priority,
200
+ iteration_id: data.iterationId,
201
+ begin: data.begin,
202
+ due: data.due,
203
+ effort: data.effort,
204
+ });
205
+ if (!response.data || response.data.length === 0) {
206
+ throw new Error('Failed to create task: no data returned');
207
+ }
208
+ return response.data[0].Task;
209
+ }
210
+ async updateTask(workspaceId, taskId, data) {
211
+ const response = await this.request('POST', '/tasks', {
212
+ workspace_id: workspaceId,
213
+ id: taskId,
214
+ name: data.name,
215
+ description: data.description,
216
+ owner: data.owner,
217
+ status: data.status,
218
+ priority: data.priority,
219
+ begin: data.begin,
220
+ due: data.due,
221
+ effort: data.effort,
222
+ effort_completed: data.effortCompleted,
223
+ remain: data.remain,
224
+ exceed: data.exceed,
225
+ progress: data.progress,
226
+ iteration_id: data.iterationId,
227
+ });
228
+ if (!response.data || response.data.length === 0) {
229
+ throw new Error('Failed to update task: no data returned');
230
+ }
231
+ return response.data[0].Task;
232
+ }
233
+ // ==================== Bug APIs ====================
234
+ async getBug(workspaceId, bugId) {
235
+ const response = await this.request('GET', '/bugs', {
236
+ workspace_id: workspaceId,
237
+ id: bugId,
238
+ limit: 1,
239
+ });
240
+ if (response.data && response.data.length > 0) {
241
+ return response.data[0].Bug;
242
+ }
243
+ return null;
244
+ }
245
+ async listBugs(workspaceId, options) {
246
+ const response = await this.request('GET', '/bugs', {
247
+ workspace_id: workspaceId,
248
+ iteration_id: options?.iterationId,
249
+ status: options?.status,
250
+ severity: options?.severity,
251
+ current_owner: options?.currentOwner,
252
+ creator: options?.creator,
253
+ limit: options?.limit || 30,
254
+ page: options?.page || 1,
255
+ fields: options?.fields,
256
+ });
257
+ return response.data?.map(item => item.Bug) || [];
258
+ }
259
+ async createBug(workspaceId, data) {
260
+ const response = await this.request('POST', '/bugs', {
261
+ workspace_id: workspaceId,
262
+ title: data.title,
263
+ description: data.description,
264
+ current_owner: data.currentOwner,
265
+ severity: data.severity,
266
+ priority: data.priority,
267
+ iteration_id: data.iterationId,
268
+ module: data.module,
269
+ version_test: data.versionTest,
270
+ version_report: data.versionReport,
271
+ bugtype: data.bugtype,
272
+ });
273
+ if (!response.data || response.data.length === 0) {
274
+ throw new Error('Failed to create bug: no data returned');
275
+ }
276
+ return response.data[0].Bug;
277
+ }
278
+ async updateBug(workspaceId, bugId, data) {
279
+ const response = await this.request('POST', '/bugs', {
280
+ workspace_id: workspaceId,
281
+ id: bugId,
282
+ title: data.title,
283
+ description: data.description,
284
+ current_owner: data.currentOwner,
285
+ status: data.status,
286
+ severity: data.severity,
287
+ priority: data.priority,
288
+ iteration_id: data.iterationId,
289
+ module: data.module,
290
+ version_fix: data.versionFix,
291
+ });
292
+ if (!response.data || response.data.length === 0) {
293
+ throw new Error('Failed to update bug: no data returned');
294
+ }
295
+ return response.data[0].Bug;
296
+ }
297
+ // ==================== Iteration APIs ====================
298
+ async getIteration(workspaceId, iterationId) {
299
+ const response = await this.request('GET', '/iterations', {
300
+ workspace_id: workspaceId,
301
+ id: iterationId,
302
+ limit: 1,
303
+ });
304
+ if (response.data && response.data.length > 0) {
305
+ return response.data[0].Iteration;
306
+ }
307
+ return null;
308
+ }
309
+ async listIterations(workspaceId, options) {
310
+ const response = await this.request('GET', '/iterations', {
311
+ workspace_id: workspaceId,
312
+ status: options?.status,
313
+ limit: options?.limit || 30,
314
+ page: options?.page || 1,
315
+ });
316
+ return response.data?.map(item => item.Iteration) || [];
317
+ }
318
+ async createIteration(workspaceId, data) {
319
+ const response = await this.request('POST', '/iterations', {
320
+ workspace_id: workspaceId,
321
+ name: data.name,
322
+ description: data.description,
323
+ startdate: data.startdate,
324
+ enddate: data.enddate,
325
+ });
326
+ if (!response.data || response.data.length === 0) {
327
+ throw new Error('Failed to create iteration: no data returned');
328
+ }
329
+ return response.data[0].Iteration;
330
+ }
331
+ async updateIteration(workspaceId, iterationId, data) {
332
+ const response = await this.request('POST', '/iterations', {
333
+ workspace_id: workspaceId,
334
+ id: iterationId,
335
+ name: data.name,
336
+ description: data.description,
337
+ startdate: data.startdate,
338
+ enddate: data.enddate,
339
+ status: data.status,
340
+ });
341
+ if (!response.data || response.data.length === 0) {
342
+ throw new Error('Failed to update iteration: no data returned');
343
+ }
344
+ return response.data[0].Iteration;
345
+ }
346
+ // ==================== Comment APIs ====================
347
+ async listComments(workspaceId, entryType, entryId, options) {
348
+ const response = await this.request('GET', '/comments', {
349
+ workspace_id: workspaceId,
350
+ entry_type: entryType,
351
+ entry_id: entryId,
352
+ limit: options?.limit || 30,
353
+ page: options?.page || 1,
354
+ });
355
+ return response.data?.map(item => item.Comment) || [];
356
+ }
357
+ async addComment(workspaceId, entryType, entryId, description) {
358
+ const response = await this.request('POST', '/comments', {
359
+ workspace_id: workspaceId,
360
+ entry_type: entryType,
361
+ entry_id: entryId,
362
+ description: description,
363
+ });
364
+ if (!response.data || response.data.length === 0) {
365
+ throw new Error('Failed to add comment: no data returned');
366
+ }
367
+ return response.data[0].Comment;
368
+ }
369
+ // ==================== Release APIs ====================
370
+ async getRelease(workspaceId, releaseId) {
371
+ const response = await this.request('GET', '/releases', {
372
+ workspace_id: workspaceId,
373
+ id: releaseId,
374
+ limit: 1,
375
+ });
376
+ if (response.data && response.data.length > 0) {
377
+ return response.data[0].Release;
378
+ }
379
+ return null;
380
+ }
381
+ async listReleases(workspaceId, options) {
382
+ const response = await this.request('GET', '/releases', {
383
+ workspace_id: workspaceId,
384
+ status: options?.status,
385
+ limit: options?.limit || 30,
386
+ page: options?.page || 1,
387
+ });
388
+ return response.data?.map(item => item.Release) || [];
389
+ }
390
+ async createRelease(workspaceId, data) {
391
+ const response = await this.request('POST', '/releases', {
392
+ workspace_id: workspaceId,
393
+ name: data.name,
394
+ description: data.description,
395
+ startdate: data.startdate,
396
+ enddate: data.enddate,
397
+ });
398
+ if (!response.data || response.data.length === 0) {
399
+ throw new Error('Failed to create release: no data returned');
400
+ }
401
+ return response.data[0].Release;
402
+ }
403
+ async updateRelease(workspaceId, releaseId, data) {
404
+ const response = await this.request('POST', '/releases', {
405
+ workspace_id: workspaceId,
406
+ id: releaseId,
407
+ name: data.name,
408
+ description: data.description,
409
+ startdate: data.startdate,
410
+ enddate: data.enddate,
411
+ status: data.status,
412
+ });
413
+ if (!response.data || response.data.length === 0) {
414
+ throw new Error('Failed to update release: no data returned');
415
+ }
416
+ return response.data[0].Release;
417
+ }
418
+ // ==================== Story-Code Relation APIs ====================
419
+ async getStoryCodeCommits(workspaceId, storyId, options) {
420
+ try {
421
+ const response = await this.request('GET', '/story_code_commits', {
422
+ workspace_id: workspaceId,
423
+ story_id: storyId,
424
+ limit: options?.limit || 30,
425
+ page: options?.page || 1,
426
+ });
427
+ return response.data?.map(item => item.StoryCodeCommit) || [];
428
+ }
429
+ catch {
430
+ return [];
431
+ }
432
+ }
433
+ // ==================== User APIs ====================
434
+ async getWorkspaceUsers(workspaceId) {
435
+ const response = await this.request('GET', '/users/get_users_by_workspace_id', { workspace_id: workspaceId });
436
+ return (response.data || []).map((item) => {
437
+ const u = item.UserWorkspace || item.User || item;
438
+ return u;
439
+ });
440
+ }
441
+ // ==================== Utility Methods ====================
442
+ translateStoryStatus(status) {
443
+ return STORY_STATUS_MAP[status] || status;
444
+ }
445
+ translateTaskStatus(status) {
446
+ return TASK_STATUS_MAP[status] || status;
447
+ }
448
+ translateBugStatus(status) {
449
+ return BUG_STATUS_MAP[status] || status;
450
+ }
451
+ parseUrl(url) {
452
+ const patterns = [
453
+ /tapd\.cn\/tapd_fe\/(\d+)\/(\w+)\/detail\/(\d+)/i,
454
+ /tapd\.cn\/tapd_fe\/(\d+)\/(\w+)\/view\/(\d+)/i,
455
+ /tapd\.cn\/(\d+)\/prong\/(\w+)\/view\/(\d+)/i,
456
+ ];
457
+ for (const pattern of patterns) {
458
+ const match = url.match(pattern);
459
+ if (match) {
460
+ let resourceType = match[2].toLowerCase();
461
+ if (resourceType === 'stories')
462
+ resourceType = 'story';
463
+ if (resourceType === 'requirements')
464
+ resourceType = 'requirement';
465
+ if (resourceType === 'bugs')
466
+ resourceType = 'bug';
467
+ if (resourceType === 'tasks')
468
+ resourceType = 'task';
469
+ return {
470
+ workspaceId: match[1],
471
+ resourceType,
472
+ resourceId: match[3],
473
+ };
474
+ }
475
+ }
476
+ return null;
477
+ }
478
+ }
479
+ //# sourceMappingURL=tapd-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tapd-client.js","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "tapd-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for TAPD (Tencent Agile Product Development) - manage stories, tasks, bugs, iterations, and more via AI assistants",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "tapd-mcp": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "start": "node dist/index.js",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "mcp",
18
+ "model-context-protocol",
19
+ "tapd",
20
+ "tencent",
21
+ "agile",
22
+ "project-management",
23
+ "ai-tools",
24
+ "claude",
25
+ "cursor",
26
+ "windsurf",
27
+ "cline"
28
+ ],
29
+ "author": "",
30
+ "license": "MIT",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+ssh://git@github.com/openpeng/tapd-mcp.git"
34
+ },
35
+ "homepage": "https://github.com/openpeng/tapd-mcp#readme",
36
+ "bugs": {
37
+ "url": "https://github.com/openpeng/tapd-mcp/issues"
38
+ },
39
+ "files": [
40
+ "dist",
41
+ "README.md",
42
+ "LICENSE"
43
+ ],
44
+ "dependencies": {
45
+ "@modelcontextprotocol/sdk": "^1.0.0"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^20.10.0",
49
+ "typescript": "^5.3.0"
50
+ },
51
+ "engines": {
52
+ "node": ">=18.0.0"
53
+ }
54
+ }