@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.
- package/README.md +190 -0
- package/dist/auth.d.ts +6 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +44 -0
- package/dist/auth.js.map +1 -0
- package/dist/context-store.d.ts +42 -0
- package/dist/context-store.d.ts.map +1 -0
- package/dist/context-store.js +119 -0
- package/dist/context-store.js.map +1 -0
- package/dist/http-client.d.ts +17 -0
- package/dist/http-client.d.ts.map +1 -0
- package/dist/http-client.js +113 -0
- package/dist/http-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/issue.d.ts +3 -0
- package/dist/resources/issue.d.ts.map +1 -0
- package/dist/resources/issue.js +59 -0
- package/dist/resources/issue.js.map +1 -0
- package/dist/resources/project.d.ts +3 -0
- package/dist/resources/project.d.ts.map +1 -0
- package/dist/resources/project.js +51 -0
- package/dist/resources/project.js.map +1 -0
- package/dist/tools/analytics.d.ts +3 -0
- package/dist/tools/analytics.d.ts.map +1 -0
- package/dist/tools/analytics.js +53 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/attachments.d.ts +3 -0
- package/dist/tools/attachments.d.ts.map +1 -0
- package/dist/tools/attachments.js +30 -0
- package/dist/tools/attachments.js.map +1 -0
- package/dist/tools/auth.d.ts +3 -0
- package/dist/tools/auth.d.ts.map +1 -0
- package/dist/tools/auth.js +68 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/bugs.d.ts +3 -0
- package/dist/tools/bugs.d.ts.map +1 -0
- package/dist/tools/bugs.js +78 -0
- package/dist/tools/bugs.js.map +1 -0
- package/dist/tools/comments.d.ts +3 -0
- package/dist/tools/comments.d.ts.map +1 -0
- package/dist/tools/comments.js +28 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/context.d.ts +3 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +106 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/database.d.ts +3 -0
- package/dist/tools/database.d.ts.map +1 -0
- package/dist/tools/database.js +154 -0
- package/dist/tools/database.js.map +1 -0
- package/dist/tools/epics.d.ts +3 -0
- package/dist/tools/epics.d.ts.map +1 -0
- package/dist/tools/epics.js +78 -0
- package/dist/tools/epics.js.map +1 -0
- package/dist/tools/issues.d.ts +3 -0
- package/dist/tools/issues.d.ts.map +1 -0
- package/dist/tools/issues.js +137 -0
- package/dist/tools/issues.js.map +1 -0
- package/dist/tools/labels.d.ts +3 -0
- package/dist/tools/labels.d.ts.map +1 -0
- package/dist/tools/labels.js +39 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/monitor.d.ts +3 -0
- package/dist/tools/monitor.d.ts.map +1 -0
- package/dist/tools/monitor.js +115 -0
- package/dist/tools/monitor.js.map +1 -0
- package/dist/tools/projects.d.ts +3 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +39 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/relations.d.ts +3 -0
- package/dist/tools/relations.d.ts.map +1 -0
- package/dist/tools/relations.js +51 -0
- package/dist/tools/relations.js.map +1 -0
- package/dist/tools/repository.d.ts +3 -0
- package/dist/tools/repository.d.ts.map +1 -0
- package/dist/tools/repository.js +176 -0
- package/dist/tools/repository.js.map +1 -0
- package/dist/tools/ssh.d.ts +3 -0
- package/dist/tools/ssh.d.ts.map +1 -0
- package/dist/tools/ssh.js +141 -0
- package/dist/tools/ssh.js.map +1 -0
- package/dist/utils.d.ts +15 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +31 -0
- package/dist/utils.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import pg from 'pg';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { jsonResult, errorResult } from '../utils.js';
|
|
5
|
+
import { resolveDatabase } from '../context-store.js';
|
|
6
|
+
const { Pool } = pg;
|
|
7
|
+
// --- Pool cache ---
|
|
8
|
+
const pools = new Map();
|
|
9
|
+
function getPool(connectionString) {
|
|
10
|
+
let pool = pools.get(connectionString);
|
|
11
|
+
if (!pool) {
|
|
12
|
+
pool = new Pool({ connectionString, max: 3, idleTimeoutMillis: 60_000 });
|
|
13
|
+
pools.set(connectionString, pool);
|
|
14
|
+
}
|
|
15
|
+
return pool;
|
|
16
|
+
}
|
|
17
|
+
const pendingPlans = new Map();
|
|
18
|
+
const PLAN_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
19
|
+
function cleanExpiredPlans() {
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
for (const [id, plan] of pendingPlans) {
|
|
22
|
+
if (now - plan.createdAt > PLAN_TTL_MS)
|
|
23
|
+
pendingPlans.delete(id);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// --- Helpers ---
|
|
27
|
+
const READ_PATTERN = /^\s*(SELECT|WITH|EXPLAIN|SHOW|DESCRIBE)\b/i;
|
|
28
|
+
const WRITE_PATTERN = /^\s*(INSERT|UPDATE|DELETE|ALTER|DROP|CREATE|TRUNCATE|GRANT|REVOKE)\b/i;
|
|
29
|
+
const DEFAULT_LIMIT = 1000;
|
|
30
|
+
function ensureLimit(query) {
|
|
31
|
+
if (/\bLIMIT\b/i.test(query))
|
|
32
|
+
return query;
|
|
33
|
+
return `${query.replace(/;\s*$/, '')} LIMIT ${DEFAULT_LIMIT}`;
|
|
34
|
+
}
|
|
35
|
+
export function registerDatabaseTools(server) {
|
|
36
|
+
server.tool('db_query', 'Executes a read-only SQL query (SELECT, WITH, EXPLAIN). Auto-applies LIMIT if missing.', {
|
|
37
|
+
dbName: z.string().optional().describe('Database name from context (auto-selected if only one)'),
|
|
38
|
+
query: z.string().describe('SQL query (SELECT, WITH, EXPLAIN only)'),
|
|
39
|
+
}, async ({ dbName, query }) => {
|
|
40
|
+
try {
|
|
41
|
+
if (!READ_PATTERN.test(query)) {
|
|
42
|
+
return errorResult('Only SELECT, WITH, EXPLAIN, SHOW queries allowed. Use db_execute for writes.');
|
|
43
|
+
}
|
|
44
|
+
const db = resolveDatabase(dbName);
|
|
45
|
+
const pool = getPool(db.connectionString);
|
|
46
|
+
const limited = ensureLimit(query);
|
|
47
|
+
const result = await pool.query(limited);
|
|
48
|
+
return jsonResult({
|
|
49
|
+
database: db.name,
|
|
50
|
+
query: limited,
|
|
51
|
+
rowCount: result.rowCount,
|
|
52
|
+
fields: result.fields.map((f) => f.name),
|
|
53
|
+
rows: result.rows,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
return errorResult(`Query error: ${err.message}`);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
server.tool('db_execute', 'Prepares a write query (INSERT/UPDATE/DELETE) for confirmation. Returns a planId — use db_execute_confirm to execute. Blocked if database is readOnly.', {
|
|
61
|
+
dbName: z.string().optional().describe('Database name from context'),
|
|
62
|
+
query: z.string().describe('SQL write query'),
|
|
63
|
+
}, async ({ dbName, query }) => {
|
|
64
|
+
try {
|
|
65
|
+
if (!WRITE_PATTERN.test(query)) {
|
|
66
|
+
return errorResult('Use db_query for read operations.');
|
|
67
|
+
}
|
|
68
|
+
const db = resolveDatabase(dbName);
|
|
69
|
+
if (db.readOnly) {
|
|
70
|
+
return errorResult(`Database "${db.name}" is configured as read-only. Write operations are not allowed.`);
|
|
71
|
+
}
|
|
72
|
+
cleanExpiredPlans();
|
|
73
|
+
const planId = randomUUID();
|
|
74
|
+
pendingPlans.set(planId, {
|
|
75
|
+
id: planId,
|
|
76
|
+
query,
|
|
77
|
+
dbName: db.name,
|
|
78
|
+
connectionString: db.connectionString,
|
|
79
|
+
createdAt: Date.now(),
|
|
80
|
+
});
|
|
81
|
+
return jsonResult({
|
|
82
|
+
status: 'pending_confirmation',
|
|
83
|
+
planId,
|
|
84
|
+
database: db.name,
|
|
85
|
+
query,
|
|
86
|
+
message: 'Review the query above. Call db_execute_confirm with this planId to execute. Plan expires in 5 minutes.',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
return errorResult(err.message);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
server.tool('db_execute_confirm', 'Confirms and executes a previously prepared write query by planId', {
|
|
94
|
+
planId: z.string().describe('Plan ID from db_execute'),
|
|
95
|
+
}, async ({ planId }) => {
|
|
96
|
+
try {
|
|
97
|
+
cleanExpiredPlans();
|
|
98
|
+
const plan = pendingPlans.get(planId);
|
|
99
|
+
if (!plan) {
|
|
100
|
+
return errorResult('Plan not found or expired. Create a new plan with db_execute.');
|
|
101
|
+
}
|
|
102
|
+
pendingPlans.delete(planId);
|
|
103
|
+
const pool = getPool(plan.connectionString);
|
|
104
|
+
const result = await pool.query(plan.query);
|
|
105
|
+
return jsonResult({
|
|
106
|
+
status: 'executed',
|
|
107
|
+
database: plan.dbName,
|
|
108
|
+
query: plan.query,
|
|
109
|
+
rowCount: result.rowCount,
|
|
110
|
+
command: result.command,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
return errorResult(`Execution error: ${err.message}`);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
server.tool('db_schema', 'Lists database tables or describes columns of a specific table using information_schema', {
|
|
118
|
+
dbName: z.string().optional().describe('Database name from context'),
|
|
119
|
+
table: z.string().optional().describe('Table name to describe (omit to list all tables)'),
|
|
120
|
+
schema: z.string().default('public').describe('Schema name'),
|
|
121
|
+
}, async ({ dbName, table, schema }) => {
|
|
122
|
+
try {
|
|
123
|
+
const db = resolveDatabase(dbName);
|
|
124
|
+
const pool = getPool(db.connectionString);
|
|
125
|
+
if (!table) {
|
|
126
|
+
const result = await pool.query(`SELECT table_name, table_type
|
|
127
|
+
FROM information_schema.tables
|
|
128
|
+
WHERE table_schema = $1
|
|
129
|
+
ORDER BY table_name`, [schema]);
|
|
130
|
+
return jsonResult({
|
|
131
|
+
database: db.name,
|
|
132
|
+
schema,
|
|
133
|
+
tables: result.rows,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const result = await pool.query(`SELECT column_name, data_type, is_nullable, column_default, character_maximum_length
|
|
137
|
+
FROM information_schema.columns
|
|
138
|
+
WHERE table_schema = $1 AND table_name = $2
|
|
139
|
+
ORDER BY ordinal_position`, [schema, table]);
|
|
140
|
+
if (result.rowCount === 0) {
|
|
141
|
+
return errorResult(`Table "${schema}.${table}" not found.`);
|
|
142
|
+
}
|
|
143
|
+
return jsonResult({
|
|
144
|
+
database: db.name,
|
|
145
|
+
table: `${schema}.${table}`,
|
|
146
|
+
columns: result.rows,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
return errorResult(`Schema error: ${err.message}`);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/tools/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epics.d.ts","sourceRoot":"","sources":["../../src/tools/epics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QAqFlD"}
|
|
@@ -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 registerEpicTools(server) {
|
|
6
|
+
server.tool('create_epic', 'Creates an epic with automatically generated sub-tasks', {
|
|
7
|
+
projectId: z.string().describe('Project ID or name'),
|
|
8
|
+
title: z.string().describe('Epic title'),
|
|
9
|
+
description: z.string().describe('Epic description'),
|
|
10
|
+
tasks: z
|
|
11
|
+
.array(z.object({
|
|
12
|
+
title: z.string(),
|
|
13
|
+
description: z.string().optional(),
|
|
14
|
+
type: z.enum(['TASK', 'BUG', 'STORY']).default('TASK'),
|
|
15
|
+
priority: z.enum(['MUITO_ALTA', 'ALTA', 'MEDIA', 'BAIXA']).default('MEDIA'),
|
|
16
|
+
platform: z.string().optional(),
|
|
17
|
+
affectedArea: z.string().optional(),
|
|
18
|
+
}))
|
|
19
|
+
.describe('Sub-tasks to create under the epic'),
|
|
20
|
+
platform: z.string().optional().describe('Default platform for all tasks'),
|
|
21
|
+
repository: z.string().optional().describe('Repository'),
|
|
22
|
+
labels: z.array(z.string()).optional().describe('Labels for epic and sub-tasks'),
|
|
23
|
+
}, async (args) => {
|
|
24
|
+
try {
|
|
25
|
+
const projectId = await resolveProjectId(args.projectId);
|
|
26
|
+
const userId = getUserId();
|
|
27
|
+
// Create epic
|
|
28
|
+
const epic = await api.post('/tasks', {
|
|
29
|
+
projectId,
|
|
30
|
+
reporterId: userId,
|
|
31
|
+
type: 'EPIC',
|
|
32
|
+
status: 'TO_DO',
|
|
33
|
+
priority: 'ALTA',
|
|
34
|
+
title: args.title,
|
|
35
|
+
description: args.description,
|
|
36
|
+
platform: args.platform,
|
|
37
|
+
repository: args.repository,
|
|
38
|
+
source: 'MCP_AGENT',
|
|
39
|
+
labels: args.labels,
|
|
40
|
+
});
|
|
41
|
+
// Create sub-tasks in parallel
|
|
42
|
+
const subTasks = await Promise.all(args.tasks.map((task) => api.post('/tasks', {
|
|
43
|
+
projectId,
|
|
44
|
+
reporterId: userId,
|
|
45
|
+
parentId: epic.id,
|
|
46
|
+
type: task.type,
|
|
47
|
+
status: 'TO_DO',
|
|
48
|
+
priority: task.priority,
|
|
49
|
+
title: task.title,
|
|
50
|
+
description: task.description,
|
|
51
|
+
platform: task.platform || args.platform,
|
|
52
|
+
repository: args.repository,
|
|
53
|
+
affectedArea: task.affectedArea,
|
|
54
|
+
source: 'MCP_AGENT',
|
|
55
|
+
labels: args.labels,
|
|
56
|
+
})));
|
|
57
|
+
return jsonResult({
|
|
58
|
+
epic: {
|
|
59
|
+
id: epic.id,
|
|
60
|
+
title: epic.title,
|
|
61
|
+
labels: epic.labels?.map((l) => l.name) || [],
|
|
62
|
+
},
|
|
63
|
+
subTasks: subTasks.map((t) => ({
|
|
64
|
+
id: t.id,
|
|
65
|
+
title: t.title,
|
|
66
|
+
type: t.type,
|
|
67
|
+
priority: t.priority,
|
|
68
|
+
platform: t.platform,
|
|
69
|
+
affectedArea: t.affectedArea,
|
|
70
|
+
})),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
return errorResult(`Failed to create epic: ${err.message}`);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=epics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epics.js","sourceRoot":"","sources":["../../src/tools/epics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/tools/issues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,QA0JnD"}
|
|
@@ -0,0 +1,137 @@
|
|
|
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 registerIssueTools(server) {
|
|
6
|
+
server.tool('create_issue', 'Creates a new issue (task, bug, story) in a project', {
|
|
7
|
+
projectId: z.string().describe('Project ID or name'),
|
|
8
|
+
title: z.string().describe('Issue title'),
|
|
9
|
+
description: z.string().optional().describe('Detailed description in markdown'),
|
|
10
|
+
type: z.enum(['TASK', 'BUG', 'STORY']).default('TASK').describe('Issue type'),
|
|
11
|
+
priority: z
|
|
12
|
+
.enum(['MUITO_ALTA', 'ALTA', 'MEDIA', 'BAIXA'])
|
|
13
|
+
.default('MEDIA')
|
|
14
|
+
.describe('Priority level'),
|
|
15
|
+
platform: z.string().optional().describe('Affected platform (e.g. "frontend-web")'),
|
|
16
|
+
repository: z.string().optional().describe('Affected repository'),
|
|
17
|
+
affectedArea: z.string().optional().describe('Affected module/flow (e.g. "auth/login")'),
|
|
18
|
+
assigneeId: z.string().optional().describe('Assignee user ID'),
|
|
19
|
+
parentId: z.string().optional().describe('Parent epic ID'),
|
|
20
|
+
labels: z.array(z.string()).optional().describe('Labels to add'),
|
|
21
|
+
dueDate: z.string().optional().describe('Due date in ISO format'),
|
|
22
|
+
}, async (args) => {
|
|
23
|
+
try {
|
|
24
|
+
const projectId = await resolveProjectId(args.projectId);
|
|
25
|
+
const userId = getUserId();
|
|
26
|
+
const issue = await api.post('/tasks', {
|
|
27
|
+
projectId,
|
|
28
|
+
reporterId: userId,
|
|
29
|
+
assigneeId: args.assigneeId,
|
|
30
|
+
parentId: args.parentId,
|
|
31
|
+
type: args.type,
|
|
32
|
+
status: 'TO_DO',
|
|
33
|
+
priority: args.priority,
|
|
34
|
+
title: args.title,
|
|
35
|
+
description: args.description,
|
|
36
|
+
platform: args.platform,
|
|
37
|
+
repository: args.repository,
|
|
38
|
+
affectedArea: args.affectedArea,
|
|
39
|
+
source: 'MCP_AGENT',
|
|
40
|
+
dueDate: args.dueDate,
|
|
41
|
+
labels: args.labels,
|
|
42
|
+
});
|
|
43
|
+
return jsonResult({
|
|
44
|
+
id: issue.id,
|
|
45
|
+
title: issue.title,
|
|
46
|
+
type: issue.type,
|
|
47
|
+
status: issue.status,
|
|
48
|
+
priority: issue.priority,
|
|
49
|
+
platform: issue.platform,
|
|
50
|
+
repository: issue.repository,
|
|
51
|
+
affectedArea: issue.affectedArea,
|
|
52
|
+
source: issue.source,
|
|
53
|
+
labels: issue.labels?.map((l) => l.name) || [],
|
|
54
|
+
createdAt: issue.createdAt,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
return errorResult(`Failed to create issue: ${err.message}`);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
server.tool('update_issue', 'Updates an existing issue', {
|
|
62
|
+
issueId: z.string().describe('Issue ID'),
|
|
63
|
+
status: z.enum(['TO_DO', 'IN_PROGRESS', 'IN_REVIEW', 'DONE', 'CANCELLED']).optional(),
|
|
64
|
+
priority: z.enum(['MUITO_ALTA', 'ALTA', 'MEDIA', 'BAIXA']).optional(),
|
|
65
|
+
title: z.string().optional(),
|
|
66
|
+
description: z.string().optional(),
|
|
67
|
+
assigneeId: z.string().optional(),
|
|
68
|
+
platform: z.string().optional(),
|
|
69
|
+
affectedArea: z.string().optional(),
|
|
70
|
+
labels: z.array(z.string()).optional().describe('Replaces existing labels'),
|
|
71
|
+
}, async (args) => {
|
|
72
|
+
try {
|
|
73
|
+
const { issueId, ...data } = args;
|
|
74
|
+
const issue = await api.patch(`/tasks/${issueId}`, data);
|
|
75
|
+
return jsonResult({
|
|
76
|
+
id: issue.id,
|
|
77
|
+
title: issue.title,
|
|
78
|
+
type: issue.type,
|
|
79
|
+
status: issue.status,
|
|
80
|
+
priority: issue.priority,
|
|
81
|
+
platform: issue.platform,
|
|
82
|
+
affectedArea: issue.affectedArea,
|
|
83
|
+
labels: issue.labels?.map((l) => l.name) || [],
|
|
84
|
+
updatedAt: issue.updatedAt,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
return errorResult(`Failed to update issue: ${err.message}`);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
server.tool('search_issues', 'Searches existing issues to find duplicates or related issues', {
|
|
92
|
+
projectId: z.string().optional().describe('Filter by project ID or name'),
|
|
93
|
+
query: z.string().optional().describe('Search in title/description'),
|
|
94
|
+
type: z.enum(['TASK', 'BUG', 'STORY', 'EPIC']).optional(),
|
|
95
|
+
status: z.enum(['TO_DO', 'IN_PROGRESS', 'IN_REVIEW', 'DONE', 'CANCELLED']).optional(),
|
|
96
|
+
platform: z.string().optional(),
|
|
97
|
+
affectedArea: z.string().optional(),
|
|
98
|
+
repository: z.string().optional(),
|
|
99
|
+
limit: z.number().default(10).describe('Max results'),
|
|
100
|
+
}, async (args) => {
|
|
101
|
+
try {
|
|
102
|
+
let projectId;
|
|
103
|
+
if (args.projectId) {
|
|
104
|
+
projectId = await resolveProjectId(args.projectId);
|
|
105
|
+
}
|
|
106
|
+
const params = {
|
|
107
|
+
projectId,
|
|
108
|
+
search: args.query,
|
|
109
|
+
type: args.type,
|
|
110
|
+
status: args.status,
|
|
111
|
+
platform: args.platform,
|
|
112
|
+
affectedArea: args.affectedArea,
|
|
113
|
+
repository: args.repository,
|
|
114
|
+
limit: args.limit,
|
|
115
|
+
};
|
|
116
|
+
const result = await api.get('/tasks', params);
|
|
117
|
+
const issues = result.issues || result;
|
|
118
|
+
return jsonResult((Array.isArray(issues) ? issues : []).map((i) => ({
|
|
119
|
+
id: i.id,
|
|
120
|
+
title: i.title,
|
|
121
|
+
type: i.type,
|
|
122
|
+
status: i.status,
|
|
123
|
+
priority: i.priority,
|
|
124
|
+
platform: i.platform,
|
|
125
|
+
repository: i.repository,
|
|
126
|
+
affectedArea: i.affectedArea,
|
|
127
|
+
source: i.source,
|
|
128
|
+
labels: i.labels?.map((l) => l.name) || [],
|
|
129
|
+
createdAt: i.createdAt,
|
|
130
|
+
})));
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
return errorResult(`Failed to search issues: ${err.message}`);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=issues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/tools/issues.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/tools/labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,QAyCnD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { api } from '../http-client.js';
|
|
3
|
+
import { jsonResult, errorResult } from '../utils.js';
|
|
4
|
+
export function registerLabelTools(server) {
|
|
5
|
+
server.tool('manage_labels', 'Adds or removes labels on an issue', {
|
|
6
|
+
issueId: z.string().describe('Issue ID'),
|
|
7
|
+
add: z.array(z.string()).optional().describe('Labels to add'),
|
|
8
|
+
remove: z.array(z.string()).optional().describe('Labels to remove'),
|
|
9
|
+
}, async ({ issueId, add, remove }) => {
|
|
10
|
+
try {
|
|
11
|
+
// Remove labels
|
|
12
|
+
if (remove && remove.length > 0) {
|
|
13
|
+
const currentLabels = await api.get(`/tasks/${issueId}/labels`);
|
|
14
|
+
for (const name of remove) {
|
|
15
|
+
const label = currentLabels.find((l) => l.name === name);
|
|
16
|
+
if (label) {
|
|
17
|
+
await api.delete(`/tasks/${issueId}/labels/${label.id}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Add labels
|
|
22
|
+
if (add && add.length > 0) {
|
|
23
|
+
for (const name of add) {
|
|
24
|
+
await api.post(`/tasks/${issueId}/labels`, { name });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Get final state
|
|
28
|
+
const labels = await api.get(`/tasks/${issueId}/labels`);
|
|
29
|
+
return jsonResult({
|
|
30
|
+
issueId,
|
|
31
|
+
labels: labels.map((l) => ({ name: l.name, color: l.color })),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
return errorResult(`Failed to manage labels: ${err.message}`);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.js","sourceRoot":"","sources":["../../src/tools/labels.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,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,oCAAoC,EACpC;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QACxC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KACpE,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,gBAAgB;YAChB,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,GAAG,CAAQ,UAAU,OAAO,SAAS,CAAC,CAAC;gBACvE,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;oBAC1B,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;oBAC9D,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,OAAO,WAAW,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC3D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,aAAa;YACb,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;oBACvB,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,OAAO,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;YAED,kBAAkB;YAClB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAQ,UAAU,OAAO,SAAS,CAAC,CAAC;YAEhE,OAAO,UAAU,CAAC;gBAChB,OAAO;gBACP,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;aACnE,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,WAAW,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/tools/monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QA2IrD"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { api } from '../http-client.js';
|
|
3
|
+
import { jsonResult, errorResult, resolveProjectId } from '../utils.js';
|
|
4
|
+
export function registerMonitorTools(server) {
|
|
5
|
+
// 1. Monitor Overview
|
|
6
|
+
server.tool('monitor_overview', 'Monitor overview for a project - total errors, unresolved, top errors, 7-day trend', {
|
|
7
|
+
projectId: z.string().describe('Project ID or name'),
|
|
8
|
+
}, async ({ projectId: pid }) => {
|
|
9
|
+
try {
|
|
10
|
+
const projectId = await resolveProjectId(pid);
|
|
11
|
+
const overview = await api.get(`/monitor/projects/${projectId}/overview`);
|
|
12
|
+
return jsonResult(overview);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
return errorResult(`Failed to get monitor overview: ${err.message}`);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
// 2. List Error Groups
|
|
19
|
+
server.tool('monitor_list_errors', 'List error groups from the monitor with filters (status, search, sort)', {
|
|
20
|
+
projectId: z.string().describe('Project ID or name'),
|
|
21
|
+
status: z
|
|
22
|
+
.enum(['UNRESOLVED', 'RESOLVED', 'IGNORED', 'REGRESSED'])
|
|
23
|
+
.optional()
|
|
24
|
+
.describe('Filter by status'),
|
|
25
|
+
search: z.string().optional().describe('Search in error title/value'),
|
|
26
|
+
sort: z
|
|
27
|
+
.enum(['lastSeen', 'firstSeen', 'eventCount'])
|
|
28
|
+
.default('lastSeen')
|
|
29
|
+
.describe('Sort field'),
|
|
30
|
+
limit: z.number().default(10).describe('Max results'),
|
|
31
|
+
}, async ({ projectId: pid, status, search, sort, limit }) => {
|
|
32
|
+
try {
|
|
33
|
+
const projectId = await resolveProjectId(pid);
|
|
34
|
+
const errors = await api.get(`/monitor/projects/${projectId}/errors`, {
|
|
35
|
+
status,
|
|
36
|
+
search,
|
|
37
|
+
sort,
|
|
38
|
+
limit,
|
|
39
|
+
});
|
|
40
|
+
return jsonResult(errors);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
return errorResult(`Failed to list errors: ${err.message}`);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
// 3. Get Error Details
|
|
47
|
+
server.tool('monitor_get_error', 'Get full details of an error group including the latest event with stack trace, breadcrumbs, tags', {
|
|
48
|
+
projectId: z.string().describe('Project ID or name'),
|
|
49
|
+
groupId: z.string().describe('Error group ID'),
|
|
50
|
+
}, async ({ projectId: pid, groupId }) => {
|
|
51
|
+
try {
|
|
52
|
+
const projectId = await resolveProjectId(pid);
|
|
53
|
+
const errorGroup = await api.get(`/monitor/projects/${projectId}/errors/${groupId}`);
|
|
54
|
+
return jsonResult(errorGroup);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
return errorResult(`Failed to get error details: ${err.message}`);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
// 4. List Error Events
|
|
61
|
+
server.tool('monitor_get_error_events', 'List events of an error group with message, stack trace, environment, tags', {
|
|
62
|
+
projectId: z.string().describe('Project ID or name'),
|
|
63
|
+
groupId: z.string().describe('Error group ID'),
|
|
64
|
+
limit: z.number().default(10).describe('Max results'),
|
|
65
|
+
}, async ({ projectId: pid, groupId, limit }) => {
|
|
66
|
+
try {
|
|
67
|
+
const projectId = await resolveProjectId(pid);
|
|
68
|
+
const events = await api.get(`/monitor/projects/${projectId}/errors/${groupId}/events`, {
|
|
69
|
+
limit,
|
|
70
|
+
});
|
|
71
|
+
return jsonResult(events);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
return errorResult(`Failed to get error events: ${err.message}`);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// 5. Update Error Status
|
|
78
|
+
server.tool('monitor_update_error', 'Update an error group status (resolve, ignore, reopen) and optionally assign', {
|
|
79
|
+
projectId: z.string().describe('Project ID or name'),
|
|
80
|
+
groupId: z.string().describe('Error group ID'),
|
|
81
|
+
status: z
|
|
82
|
+
.enum(['UNRESOLVED', 'RESOLVED', 'IGNORED'])
|
|
83
|
+
.describe('New status'),
|
|
84
|
+
assigneeId: z.string().optional().describe('Assignee user ID'),
|
|
85
|
+
}, async ({ projectId: pid, groupId, status, assigneeId }) => {
|
|
86
|
+
try {
|
|
87
|
+
const projectId = await resolveProjectId(pid);
|
|
88
|
+
const data = { status };
|
|
89
|
+
if (assigneeId !== undefined)
|
|
90
|
+
data.assigneeId = assigneeId;
|
|
91
|
+
const updated = await api.patch(`/monitor/projects/${projectId}/errors/${groupId}`, data);
|
|
92
|
+
return jsonResult(updated);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return errorResult(`Failed to update error: ${err.message}`);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
// 6. Performance Overview
|
|
99
|
+
server.tool('monitor_performance', 'Performance overview - avg/p50/p75/p95 durations and web vitals from performance transactions', {
|
|
100
|
+
projectId: z.string().describe('Project ID or name'),
|
|
101
|
+
days: z.number().default(7).describe('Analysis period in days'),
|
|
102
|
+
}, async ({ projectId: pid, days }) => {
|
|
103
|
+
try {
|
|
104
|
+
const projectId = await resolveProjectId(pid);
|
|
105
|
+
const performance = await api.get(`/monitor/projects/${projectId}/performance/overview`, {
|
|
106
|
+
days,
|
|
107
|
+
});
|
|
108
|
+
return jsonResult(performance);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
return errorResult(`Failed to get performance data: ${err.message}`);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/tools/monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QAgDrD"}
|