@zt-playground/mcp-server 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.
Files changed (90) hide show
  1. package/README.md +190 -0
  2. package/dist/auth.d.ts +6 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +44 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/context-store.d.ts +42 -0
  7. package/dist/context-store.d.ts.map +1 -0
  8. package/dist/context-store.js +119 -0
  9. package/dist/context-store.js.map +1 -0
  10. package/dist/http-client.d.ts +17 -0
  11. package/dist/http-client.d.ts.map +1 -0
  12. package/dist/http-client.js +113 -0
  13. package/dist/http-client.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +59 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/resources/issue.d.ts +3 -0
  19. package/dist/resources/issue.d.ts.map +1 -0
  20. package/dist/resources/issue.js +59 -0
  21. package/dist/resources/issue.js.map +1 -0
  22. package/dist/resources/project.d.ts +3 -0
  23. package/dist/resources/project.d.ts.map +1 -0
  24. package/dist/resources/project.js +51 -0
  25. package/dist/resources/project.js.map +1 -0
  26. package/dist/tools/analytics.d.ts +3 -0
  27. package/dist/tools/analytics.d.ts.map +1 -0
  28. package/dist/tools/analytics.js +53 -0
  29. package/dist/tools/analytics.js.map +1 -0
  30. package/dist/tools/attachments.d.ts +3 -0
  31. package/dist/tools/attachments.d.ts.map +1 -0
  32. package/dist/tools/attachments.js +30 -0
  33. package/dist/tools/attachments.js.map +1 -0
  34. package/dist/tools/auth.d.ts +3 -0
  35. package/dist/tools/auth.d.ts.map +1 -0
  36. package/dist/tools/auth.js +68 -0
  37. package/dist/tools/auth.js.map +1 -0
  38. package/dist/tools/bugs.d.ts +3 -0
  39. package/dist/tools/bugs.d.ts.map +1 -0
  40. package/dist/tools/bugs.js +78 -0
  41. package/dist/tools/bugs.js.map +1 -0
  42. package/dist/tools/comments.d.ts +3 -0
  43. package/dist/tools/comments.d.ts.map +1 -0
  44. package/dist/tools/comments.js +28 -0
  45. package/dist/tools/comments.js.map +1 -0
  46. package/dist/tools/context.d.ts +3 -0
  47. package/dist/tools/context.d.ts.map +1 -0
  48. package/dist/tools/context.js +106 -0
  49. package/dist/tools/context.js.map +1 -0
  50. package/dist/tools/database.d.ts +3 -0
  51. package/dist/tools/database.d.ts.map +1 -0
  52. package/dist/tools/database.js +154 -0
  53. package/dist/tools/database.js.map +1 -0
  54. package/dist/tools/epics.d.ts +3 -0
  55. package/dist/tools/epics.d.ts.map +1 -0
  56. package/dist/tools/epics.js +78 -0
  57. package/dist/tools/epics.js.map +1 -0
  58. package/dist/tools/issues.d.ts +3 -0
  59. package/dist/tools/issues.d.ts.map +1 -0
  60. package/dist/tools/issues.js +137 -0
  61. package/dist/tools/issues.js.map +1 -0
  62. package/dist/tools/labels.d.ts +3 -0
  63. package/dist/tools/labels.d.ts.map +1 -0
  64. package/dist/tools/labels.js +39 -0
  65. package/dist/tools/labels.js.map +1 -0
  66. package/dist/tools/monitor.d.ts +3 -0
  67. package/dist/tools/monitor.d.ts.map +1 -0
  68. package/dist/tools/monitor.js +115 -0
  69. package/dist/tools/monitor.js.map +1 -0
  70. package/dist/tools/projects.d.ts +3 -0
  71. package/dist/tools/projects.d.ts.map +1 -0
  72. package/dist/tools/projects.js +39 -0
  73. package/dist/tools/projects.js.map +1 -0
  74. package/dist/tools/relations.d.ts +3 -0
  75. package/dist/tools/relations.d.ts.map +1 -0
  76. package/dist/tools/relations.js +51 -0
  77. package/dist/tools/relations.js.map +1 -0
  78. package/dist/tools/repository.d.ts +3 -0
  79. package/dist/tools/repository.d.ts.map +1 -0
  80. package/dist/tools/repository.js +176 -0
  81. package/dist/tools/repository.js.map +1 -0
  82. package/dist/tools/ssh.d.ts +3 -0
  83. package/dist/tools/ssh.d.ts.map +1 -0
  84. package/dist/tools/ssh.js +141 -0
  85. package/dist/tools/ssh.js.map +1 -0
  86. package/dist/utils.d.ts +15 -0
  87. package/dist/utils.d.ts.map +1 -0
  88. package/dist/utils.js +31 -0
  89. package/dist/utils.js.map +1 -0
  90. package/package.json +30 -0
@@ -0,0 +1,59 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { api } from '../http-client.js';
3
+ export function registerIssueResources(server) {
4
+ server.resource('issue', new ResourceTemplate('issue://{issueId}', { list: undefined }), async (uri, variables) => {
5
+ const issueId = variables.issueId;
6
+ try {
7
+ const issue = await api.get(`/tasks/${issueId}`);
8
+ if (!issue) {
9
+ return { contents: [{ uri: uri.href, text: 'Issue not found', mimeType: 'text/plain' }] };
10
+ }
11
+ return {
12
+ contents: [
13
+ {
14
+ uri: uri.href,
15
+ mimeType: 'application/json',
16
+ text: JSON.stringify({
17
+ id: issue.id,
18
+ title: issue.title,
19
+ description: issue.description,
20
+ type: issue.type,
21
+ status: issue.status,
22
+ priority: issue.priority,
23
+ platform: issue.platform,
24
+ repository: issue.repository,
25
+ affectedArea: issue.affectedArea,
26
+ source: issue.source,
27
+ project: issue.project,
28
+ reporter: issue.reporter,
29
+ assignee: issue.assignee,
30
+ parent: issue.parent,
31
+ labels: issue.labels?.map((l) => ({ name: l.name, color: l.color })) || [],
32
+ comments: issue.comments?.map((c) => ({
33
+ id: c.id,
34
+ content: c.content,
35
+ author: c.author,
36
+ source: c.source,
37
+ createdAt: c.createdAt,
38
+ })) || [],
39
+ attachments: issue.attachments?.map((a) => ({
40
+ id: a.id,
41
+ fileName: a.fileName,
42
+ mimeType: a.mimeType,
43
+ size: a.size,
44
+ })) || [],
45
+ subIssues: issue.subIssues || [],
46
+ createdAt: issue.createdAt,
47
+ updatedAt: issue.updatedAt,
48
+ dueDate: issue.dueDate,
49
+ }, null, 2),
50
+ },
51
+ ],
52
+ };
53
+ }
54
+ catch {
55
+ return { contents: [{ uri: uri.href, text: 'Issue not found', mimeType: 'text/plain' }] };
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/resources/issue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerProjectResources(server: McpServer): void;
3
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/resources/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAGtF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,QAyDzD"}
@@ -0,0 +1,51 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { api } from '../http-client.js';
3
+ export function registerProjectResources(server) {
4
+ server.resource('project', new ResourceTemplate('project://{projectId}', {
5
+ list: async () => {
6
+ const projects = await api.get('/project');
7
+ return {
8
+ resources: projects.map((p) => ({
9
+ uri: `project://${p.id}`,
10
+ name: p.name,
11
+ description: p.description,
12
+ mimeType: 'application/json',
13
+ })),
14
+ };
15
+ },
16
+ }), async (uri, variables) => {
17
+ const projectId = variables.projectId;
18
+ try {
19
+ const project = await api.get(`/project/${projectId}`);
20
+ if (!project) {
21
+ return { contents: [{ uri: uri.href, text: 'Project not found', mimeType: 'text/plain' }] };
22
+ }
23
+ return {
24
+ contents: [
25
+ {
26
+ uri: uri.href,
27
+ mimeType: 'application/json',
28
+ text: JSON.stringify({
29
+ id: project.id,
30
+ name: project.name,
31
+ description: project.description,
32
+ platforms: project.platforms?.map((p) => ({
33
+ name: p.name,
34
+ repository: p.repository,
35
+ description: p.description,
36
+ })) || [],
37
+ stats: {
38
+ totalIssues: project._count?.tasks ?? 0,
39
+ },
40
+ createdAt: project.createdAt,
41
+ }, null, 2),
42
+ },
43
+ ],
44
+ };
45
+ }
46
+ catch {
47
+ return { contents: [{ uri: uri.href, text: 'Project not found', mimeType: 'text/plain' }] };
48
+ }
49
+ });
50
+ }
51
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/resources/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAExC,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,QAAQ,CACb,SAAS,EACT,IAAI,gBAAgB,CAAC,uBAAuB,EAAE;QAC5C,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAQ,UAAU,CAAC,CAAC;YAClD,OAAO;gBACL,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;oBACnC,GAAG,EAAE,aAAa,CAAC,CAAC,EAAE,EAAE;oBACxB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,QAAQ,EAAE,kBAAkB;iBAC7B,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;KACF,CAAC,EACF,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACvB,MAAM,SAAS,GAAG,SAAS,CAAC,SAAmB,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,CAAM,YAAY,SAAS,EAAE,CAAC,CAAC;YAE5D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;YAC9F,CAAC;YAED,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,EAAE,EAAE,OAAO,CAAC,EAAE;4BACd,IAAI,EAAE,OAAO,CAAC,IAAI;4BAClB,WAAW,EAAE,OAAO,CAAC,WAAW;4BAChC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gCAC7C,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,UAAU,EAAE,CAAC,CAAC,UAAU;gCACxB,WAAW,EAAE,CAAC,CAAC,WAAW;6BAC3B,CAAC,CAAC,IAAI,EAAE;4BACT,KAAK,EAAE;gCACL,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC;6BACxC;4BACD,SAAS,EAAE,OAAO,CAAC,SAAS;yBAC7B,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAnalyticsTools(server: McpServer): void;
3
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QA8DvD"}
@@ -0,0 +1,53 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../http-client.js';
3
+ import { jsonResult, errorResult, resolveProjectId } from '../utils.js';
4
+ export function registerAnalyticsTools(server) {
5
+ server.tool('get_project_health', 'Returns project health analytics - bugs, trends, problematic areas, health score', {
6
+ projectId: z.string().describe('Project ID or name'),
7
+ days: z.number().default(30).describe('Analysis period in days'),
8
+ }, async ({ projectId: pid, days }) => {
9
+ try {
10
+ const projectId = await resolveProjectId(pid);
11
+ const health = await api.get(`/issue-analytics/projects/${projectId}/health`, { days });
12
+ return jsonResult(health);
13
+ }
14
+ catch (err) {
15
+ return errorResult(`Failed to get project health: ${err.message}`);
16
+ }
17
+ });
18
+ server.tool('get_area_analysis', 'Detailed analysis of a specific area/module', {
19
+ projectId: z.string().describe('Project ID or name'),
20
+ affectedArea: z.string().describe('Area to analyze (e.g. "auth/login")'),
21
+ days: z.number().default(30).describe('Analysis period'),
22
+ }, async ({ projectId: pid, affectedArea, days }) => {
23
+ try {
24
+ const projectId = await resolveProjectId(pid);
25
+ const analysis = await api.get(`/issue-analytics/projects/${projectId}/by-area`, {
26
+ days,
27
+ affectedArea,
28
+ });
29
+ return jsonResult(analysis);
30
+ }
31
+ catch (err) {
32
+ return errorResult(`Failed to get area analysis: ${err.message}`);
33
+ }
34
+ });
35
+ server.tool('get_repository_report', 'Report of issues grouped by repository', {
36
+ projectId: z.string().describe('Project ID or name'),
37
+ repository: z.string().optional().describe('Filter by specific repository'),
38
+ days: z.number().default(30).describe('Analysis period'),
39
+ }, async ({ projectId: pid, repository, days }) => {
40
+ try {
41
+ const projectId = await resolveProjectId(pid);
42
+ const report = await api.get(`/issue-analytics/projects/${projectId}/by-repository`, {
43
+ days,
44
+ repository,
45
+ });
46
+ return jsonResult(report);
47
+ }
48
+ catch (err) {
49
+ return errorResult(`Failed to get repository report: ${err.message}`);
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAttachmentTools(server: McpServer): void;
3
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../src/tools/attachments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QA8BxD"}
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../http-client.js';
3
+ import { jsonResult, errorResult } from '../utils.js';
4
+ export function registerAttachmentTools(server) {
5
+ server.tool('add_attachment', 'Attaches a file/image to an issue (base64 encoded)', {
6
+ issueId: z.string().describe('Issue ID'),
7
+ fileName: z.string().describe('File name'),
8
+ content: z.string().describe('Base64 encoded file content'),
9
+ mimeType: z.string().describe('MIME type (e.g. "image/png")'),
10
+ }, async ({ issueId, fileName, content, mimeType }) => {
11
+ try {
12
+ const attachment = await api.post(`/tasks/${issueId}/attachments/base64`, {
13
+ fileName,
14
+ content,
15
+ mimeType,
16
+ });
17
+ return jsonResult({
18
+ id: attachment.id,
19
+ fileName: attachment.fileName,
20
+ mimeType: attachment.mimeType,
21
+ size: attachment.size,
22
+ createdAt: attachment.createdAt,
23
+ });
24
+ }
25
+ catch (err) {
26
+ return errorResult(`Failed to add attachment: ${err.message}`);
27
+ }
28
+ });
29
+ }
30
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/tools/attachments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,oDAAoD,EACpD;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC3D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KAC9D,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,CAAM,UAAU,OAAO,qBAAqB,EAAE;gBAC7E,QAAQ;gBACR,OAAO;gBACP,QAAQ;aACT,CAAC,CAAC;YAEH,OAAO,UAAU,CAAC;gBAChB,EAAE,EAAE,UAAU,CAAC,EAAE;gBACjB,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,SAAS,EAAE,UAAU,CAAC,SAAS;aAChC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,WAAW,CAAC,6BAA6B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAuthTools(server: McpServer): void;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QAwElD"}
@@ -0,0 +1,68 @@
1
+ import { z } from 'zod';
2
+ import { api, saveAuth, loadAuth } from '../http-client.js';
3
+ import { setCachedUser } from '../auth.js';
4
+ import { jsonResult, errorResult } from '../utils.js';
5
+ export function registerAuthTools(server) {
6
+ server.tool('auth_setup', 'Configures API key for ZT Playground authentication. Run this once to authenticate.', {
7
+ apiKey: z.string().describe('Your ZT Playground API key'),
8
+ apiUrl: z.string().optional().describe('API URL (default: https://zt-playground-api.vercel.app)'),
9
+ }, async ({ apiKey, apiUrl }) => {
10
+ // Temporarily set env so the HTTP client can use it for validation
11
+ const prevKey = process.env.ZT_API_KEY;
12
+ const prevUrl = process.env.ZT_API_URL;
13
+ process.env.ZT_API_KEY = apiKey;
14
+ if (apiUrl)
15
+ process.env.ZT_API_URL = apiUrl;
16
+ try {
17
+ const user = await api.get('/auth/me');
18
+ // Save to file for persistence
19
+ saveAuth(apiKey, apiUrl, user.id, user.name);
20
+ setCachedUser(user.id, user.name);
21
+ // Clear env overrides (file will be used going forward)
22
+ delete process.env.ZT_API_KEY;
23
+ delete process.env.ZT_API_URL;
24
+ return jsonResult({
25
+ status: 'authenticated',
26
+ user: { id: user.id, name: user.name, email: user.email },
27
+ message: `Successfully authenticated as ${user.name}. API key saved for future sessions.`,
28
+ });
29
+ }
30
+ catch (err) {
31
+ // Restore previous env
32
+ if (prevKey)
33
+ process.env.ZT_API_KEY = prevKey;
34
+ else
35
+ delete process.env.ZT_API_KEY;
36
+ if (prevUrl)
37
+ process.env.ZT_API_URL = prevUrl;
38
+ else
39
+ delete process.env.ZT_API_URL;
40
+ return errorResult(`Authentication failed: ${err.message}`);
41
+ }
42
+ });
43
+ server.tool('auth_status', 'Shows current authentication status', {}, async () => {
44
+ const auth = loadAuth();
45
+ if (!auth) {
46
+ return jsonResult({
47
+ authenticated: false,
48
+ message: 'Not authenticated. Use auth_setup to configure your API key.',
49
+ });
50
+ }
51
+ try {
52
+ const user = await api.get('/auth/me');
53
+ return jsonResult({
54
+ authenticated: true,
55
+ user: { id: user.id, name: user.name, email: user.email },
56
+ apiUrl: auth.apiUrl,
57
+ });
58
+ }
59
+ catch {
60
+ return jsonResult({
61
+ authenticated: false,
62
+ message: 'API key is configured but validation failed. Use auth_setup to reconfigure.',
63
+ apiUrl: auth.apiUrl,
64
+ });
65
+ }
66
+ });
67
+ }
68
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerBugTools(server: McpServer): void;
3
+ //# sourceMappingURL=bugs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bugs.d.ts","sourceRoot":"","sources":["../../src/tools/bugs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QAoFjD"}
@@ -0,0 +1,78 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../http-client.js';
3
+ import { jsonResult, errorResult, resolveProjectId } from '../utils.js';
4
+ import { getUserId } from '../auth.js';
5
+ export function registerBugTools(server) {
6
+ server.tool('report_bug', 'Reports a bug with enriched context (steps to reproduce, expected/actual behavior)', {
7
+ projectId: z.string().describe('Project ID or name'),
8
+ title: z.string().describe('Bug title'),
9
+ description: z.string().describe('Bug description including steps to reproduce'),
10
+ stepsToReproduce: z.array(z.string()).optional().describe('Steps to reproduce'),
11
+ expectedBehavior: z.string().optional().describe('Expected behavior'),
12
+ actualBehavior: z.string().optional().describe('Actual behavior'),
13
+ platform: z.string().describe('Platform where the bug occurs'),
14
+ repository: z.string().optional().describe('Affected repository'),
15
+ affectedArea: z.string().describe('Affected area/flow'),
16
+ priority: z
17
+ .enum(['MUITO_ALTA', 'ALTA', 'MEDIA', 'BAIXA'])
18
+ .default('ALTA')
19
+ .describe('Priority'),
20
+ environment: z.string().optional().describe('Environment (production, staging, etc)'),
21
+ labels: z.array(z.string()).optional().describe('Labels'),
22
+ }, async (args) => {
23
+ try {
24
+ const projectId = await resolveProjectId(args.projectId);
25
+ const userId = getUserId();
26
+ // Build enriched description
27
+ let fullDescription = args.description;
28
+ if (args.stepsToReproduce && args.stepsToReproduce.length > 0) {
29
+ fullDescription += '\n\n## Steps to Reproduce\n';
30
+ args.stepsToReproduce.forEach((step, i) => {
31
+ fullDescription += `${i + 1}. ${step}\n`;
32
+ });
33
+ }
34
+ if (args.expectedBehavior) {
35
+ fullDescription += `\n## Expected Behavior\n${args.expectedBehavior}\n`;
36
+ }
37
+ if (args.actualBehavior) {
38
+ fullDescription += `\n## Actual Behavior\n${args.actualBehavior}\n`;
39
+ }
40
+ if (args.environment) {
41
+ fullDescription += `\n## Environment\n${args.environment}\n`;
42
+ }
43
+ const allLabels = [...(args.labels || []), 'bug'];
44
+ const uniqueLabels = [...new Set(allLabels)];
45
+ const issue = await api.post('/tasks', {
46
+ projectId,
47
+ reporterId: userId,
48
+ type: 'BUG',
49
+ status: 'TO_DO',
50
+ priority: args.priority,
51
+ title: args.title,
52
+ description: fullDescription,
53
+ platform: args.platform,
54
+ repository: args.repository,
55
+ affectedArea: args.affectedArea,
56
+ source: 'MCP_AGENT',
57
+ labels: uniqueLabels,
58
+ });
59
+ return jsonResult({
60
+ id: issue.id,
61
+ title: issue.title,
62
+ type: issue.type,
63
+ status: issue.status,
64
+ priority: issue.priority,
65
+ platform: issue.platform,
66
+ repository: issue.repository,
67
+ affectedArea: issue.affectedArea,
68
+ source: issue.source,
69
+ labels: issue.labels?.map((l) => l.name) || [],
70
+ createdAt: issue.createdAt,
71
+ });
72
+ }
73
+ catch (err) {
74
+ return errorResult(`Failed to report bug: ${err.message}`);
75
+ }
76
+ });
77
+ }
78
+ //# sourceMappingURL=bugs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bugs.js","sourceRoot":"","sources":["../../src/tools/bugs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerCommentTools(server: McpServer): void;
3
+ //# sourceMappingURL=comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QA4BrD"}
@@ -0,0 +1,28 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../http-client.js';
3
+ import { jsonResult, errorResult } from '../utils.js';
4
+ export function registerCommentTools(server) {
5
+ server.tool('add_comment', 'Adds a comment to an issue', {
6
+ issueId: z.string().describe('Issue ID'),
7
+ content: z.string().describe('Comment content in markdown'),
8
+ }, async ({ issueId, content }) => {
9
+ try {
10
+ const comment = await api.post(`/tasks/${issueId}/comments`, {
11
+ content,
12
+ source: 'MCP_AGENT',
13
+ });
14
+ return jsonResult({
15
+ id: comment.id,
16
+ issueId: comment.issueId,
17
+ content: comment.content,
18
+ author: comment.author,
19
+ source: comment.source,
20
+ createdAt: comment.createdAt,
21
+ });
22
+ }
23
+ catch (err) {
24
+ return errorResult(`Failed to add comment: ${err.message}`);
25
+ }
26
+ });
27
+ }
28
+ //# sourceMappingURL=comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,4BAA4B,EAC5B;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAC5D,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAM,UAAU,OAAO,WAAW,EAAE;gBAChE,OAAO;gBACP,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;YAEH,OAAO,UAAU,CAAC;gBAChB,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,WAAW,CAAC,0BAA0B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerContextTools(server: McpServer): void;
3
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAapE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QAkIrD"}
@@ -0,0 +1,106 @@
1
+ import { z } from 'zod';
2
+ import { jsonResult, errorResult } from '../utils.js';
3
+ import { saveContext, listContexts, removeContext, setActiveContext, getActiveContext, } from '../context-store.js';
4
+ export function registerContextTools(server) {
5
+ server.tool('context_setup', 'Creates or updates a project context configuration (repos, databases, SSH servers). Automatically sets it as active.', {
6
+ projectId: z.string().describe('Project ID in ZT Playground'),
7
+ projectName: z.string().describe('Project name (used as config file name)'),
8
+ repos: z
9
+ .array(z.object({
10
+ name: z.string().describe('Short name for the repo (e.g. "frontend", "api")'),
11
+ path: z.string().describe('Absolute path to the repo on disk'),
12
+ description: z.string().optional().describe('What this repo contains'),
13
+ }))
14
+ .default([])
15
+ .describe('Local repositories'),
16
+ databases: z
17
+ .array(z.object({
18
+ name: z.string().describe('Short name (e.g. "production", "staging")'),
19
+ connectionString: z.string().describe('PostgreSQL connection string'),
20
+ readOnly: z.boolean().default(true).describe('If true, only SELECT queries allowed'),
21
+ }))
22
+ .default([])
23
+ .describe('Database connections'),
24
+ ssh: z
25
+ .array(z.object({
26
+ name: z.string().describe('Short name (e.g. "prod", "staging")'),
27
+ host: z.string().describe('Hostname or IP'),
28
+ user: z.string().describe('SSH username'),
29
+ keyPath: z.string().optional().describe('Path to private key (e.g. ~/.ssh/id_rsa)'),
30
+ password: z.string().optional().describe('Password (prefer keyPath)'),
31
+ port: z.number().default(22).describe('SSH port'),
32
+ }))
33
+ .default([])
34
+ .describe('SSH server connections'),
35
+ }, async (args) => {
36
+ try {
37
+ const ctx = {
38
+ projectId: args.projectId,
39
+ projectName: args.projectName,
40
+ repos: args.repos,
41
+ databases: args.databases,
42
+ ssh: args.ssh,
43
+ };
44
+ saveContext(ctx);
45
+ setActiveContext(ctx.projectName);
46
+ return jsonResult({
47
+ status: 'saved',
48
+ projectName: ctx.projectName,
49
+ repos: ctx.repos.length,
50
+ databases: ctx.databases.length,
51
+ ssh: ctx.ssh.length,
52
+ active: true,
53
+ });
54
+ }
55
+ catch (err) {
56
+ return errorResult(err.message);
57
+ }
58
+ });
59
+ server.tool('context_get', 'Returns the currently active project context with all configured repos, databases, and SSH servers', {}, async () => {
60
+ const ctx = getActiveContext();
61
+ if (!ctx)
62
+ return errorResult('No active context. Use context_set_active or context_setup first.');
63
+ return jsonResult(ctx);
64
+ });
65
+ server.tool('context_list', 'Lists all saved project contexts from ~/.zt-playground/contexts/', {}, async () => {
66
+ try {
67
+ const contexts = listContexts();
68
+ if (contexts.length === 0)
69
+ return jsonResult({ message: 'No contexts configured yet. Use context_setup to create one.' });
70
+ const active = getActiveContext();
71
+ return jsonResult({
72
+ active: active?.projectName ?? null,
73
+ contexts,
74
+ });
75
+ }
76
+ catch (err) {
77
+ return errorResult(err.message);
78
+ }
79
+ });
80
+ server.tool('context_set_active', 'Sets which project context is active for repo/database/SSH tools', {
81
+ name: z.string().describe('Project name to activate'),
82
+ }, async ({ name }) => {
83
+ try {
84
+ const ctx = setActiveContext(name);
85
+ return jsonResult({
86
+ status: 'active',
87
+ projectName: ctx.projectName,
88
+ repos: ctx.repos.map((r) => r.name),
89
+ databases: ctx.databases.map((d) => d.name),
90
+ ssh: ctx.ssh.map((s) => s.name),
91
+ });
92
+ }
93
+ catch (err) {
94
+ return errorResult(err.message);
95
+ }
96
+ });
97
+ server.tool('context_remove', 'Removes a saved project context configuration', {
98
+ name: z.string().describe('Project name to remove'),
99
+ }, async ({ name }) => {
100
+ const removed = removeContext(name);
101
+ if (!removed)
102
+ return errorResult(`Context "${name}" not found.`);
103
+ return jsonResult({ status: 'removed', name });
104
+ });
105
+ }
106
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerDatabaseTools(server: McpServer): void;
3
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/tools/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqDpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAwJtD"}