@zt-playground/mcp-server 1.0.0 → 1.1.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/dist/index.js +29 -25
- package/dist/index.js.map +1 -1
- package/dist/setup.d.ts +3 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +158 -0
- package/dist/setup.js.map +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,25 +1,32 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
2
|
+
// If --setup flag, run setup wizard instead of MCP server
|
|
3
|
+
if (process.argv.includes('--setup')) {
|
|
4
|
+
import('./setup.js');
|
|
5
|
+
}
|
|
6
|
+
else {
|
|
7
|
+
startServer();
|
|
8
|
+
}
|
|
9
|
+
async function startServer() {
|
|
10
|
+
const { McpServer } = await import('@modelcontextprotocol/sdk/server/mcp.js');
|
|
11
|
+
const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');
|
|
12
|
+
const { validateAuth } = await import('./auth.js');
|
|
13
|
+
const { registerAuthTools } = await import('./tools/auth.js');
|
|
14
|
+
const { registerProjectTools } = await import('./tools/projects.js');
|
|
15
|
+
const { registerIssueTools } = await import('./tools/issues.js');
|
|
16
|
+
const { registerEpicTools } = await import('./tools/epics.js');
|
|
17
|
+
const { registerBugTools } = await import('./tools/bugs.js');
|
|
18
|
+
const { registerCommentTools } = await import('./tools/comments.js');
|
|
19
|
+
const { registerAttachmentTools } = await import('./tools/attachments.js');
|
|
20
|
+
const { registerLabelTools } = await import('./tools/labels.js');
|
|
21
|
+
const { registerAnalyticsTools } = await import('./tools/analytics.js');
|
|
22
|
+
const { registerMonitorTools } = await import('./tools/monitor.js');
|
|
23
|
+
const { registerRelationTools } = await import('./tools/relations.js');
|
|
24
|
+
const { registerContextTools } = await import('./tools/context.js');
|
|
25
|
+
const { registerRepositoryTools } = await import('./tools/repository.js');
|
|
26
|
+
const { registerDatabaseTools } = await import('./tools/database.js');
|
|
27
|
+
const { registerSshTools } = await import('./tools/ssh.js');
|
|
28
|
+
const { registerProjectResources } = await import('./resources/project.js');
|
|
29
|
+
const { registerIssueResources } = await import('./resources/issue.js');
|
|
23
30
|
// Validate auth (non-blocking — won't abort if no key)
|
|
24
31
|
await validateAuth();
|
|
25
32
|
const server = new McpServer({
|
|
@@ -52,8 +59,5 @@ async function main() {
|
|
|
52
59
|
await server.connect(transport);
|
|
53
60
|
console.error('ZT Playground MCP Server running on stdio');
|
|
54
61
|
}
|
|
55
|
-
|
|
56
|
-
console.error('Fatal error:', err);
|
|
57
|
-
process.exit(1);
|
|
58
|
-
});
|
|
62
|
+
export {};
|
|
59
63
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,0DAA0D;AAC1D,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;IACrC,MAAM,CAAC,YAAY,CAAC,CAAC;AACvB,CAAC;KAAM,CAAC;IACN,WAAW,EAAE,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;IAC9E,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;IAC3F,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC9D,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACrE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACjE,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC/D,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC7D,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACrE,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAC3E,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACjE,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACxE,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACpE,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACvE,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACpE,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAC1E,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACtE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC5D,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAC5E,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAExE,uDAAuD;IACvD,MAAM,YAAY,EAAE,CAAC;IAErB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,qCAAqC;IACrC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,wBAAwB;IACxB,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,uCAAuC;IACvC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,qBAAqB;IACrB,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE/B,oBAAoB;IACpB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAC7D,CAAC"}
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":""}
|
package/dist/setup.js
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { homedir, platform } from 'os';
|
|
5
|
+
import { api, saveAuth } from './http-client.js';
|
|
6
|
+
const MCP_ENTRY = {
|
|
7
|
+
command: 'npx',
|
|
8
|
+
args: ['@zt-playground/mcp-server'],
|
|
9
|
+
};
|
|
10
|
+
function getClients() {
|
|
11
|
+
const home = homedir();
|
|
12
|
+
const os = platform();
|
|
13
|
+
const clients = [];
|
|
14
|
+
// Claude Desktop
|
|
15
|
+
let claudeDesktopPath;
|
|
16
|
+
if (os === 'darwin') {
|
|
17
|
+
claudeDesktopPath = join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
|
|
18
|
+
}
|
|
19
|
+
else if (os === 'win32') {
|
|
20
|
+
claudeDesktopPath = join(process.env.APPDATA || join(home, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json');
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
claudeDesktopPath = join(home, '.config', 'Claude', 'claude_desktop_config.json');
|
|
24
|
+
}
|
|
25
|
+
clients.push({ name: 'Claude Desktop', configPath: claudeDesktopPath, wrapperKey: 'mcpServers', format: 'standard' });
|
|
26
|
+
// Cursor (global)
|
|
27
|
+
clients.push({ name: 'Cursor', configPath: join(home, '.cursor', 'mcp.json'), wrapperKey: 'mcpServers', format: 'standard' });
|
|
28
|
+
// VS Code (user-level)
|
|
29
|
+
let vscodePath;
|
|
30
|
+
if (os === 'darwin') {
|
|
31
|
+
vscodePath = join(home, 'Library', 'Application Support', 'Code', 'User', 'mcp.json');
|
|
32
|
+
}
|
|
33
|
+
else if (os === 'win32') {
|
|
34
|
+
vscodePath = join(process.env.APPDATA || join(home, 'AppData', 'Roaming'), 'Code', 'User', 'mcp.json');
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
vscodePath = join(home, '.config', 'Code', 'User', 'mcp.json');
|
|
38
|
+
}
|
|
39
|
+
clients.push({ name: 'VS Code', configPath: vscodePath, wrapperKey: 'servers', format: 'vscode' });
|
|
40
|
+
// Windsurf (global) - same structure as Cursor
|
|
41
|
+
clients.push({ name: 'Windsurf', configPath: join(home, '.windsurf', 'mcp.json'), wrapperKey: 'mcpServers', format: 'standard' });
|
|
42
|
+
return clients;
|
|
43
|
+
}
|
|
44
|
+
function detectInstalledClients() {
|
|
45
|
+
const clients = getClients();
|
|
46
|
+
const installed = [];
|
|
47
|
+
for (const client of clients) {
|
|
48
|
+
const configDir = join(client.configPath, '..');
|
|
49
|
+
// Consider "installed" if the config directory exists OR the config file exists
|
|
50
|
+
if (existsSync(configDir) || existsSync(client.configPath)) {
|
|
51
|
+
installed.push(client);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return installed;
|
|
55
|
+
}
|
|
56
|
+
function addMcpToConfig(client) {
|
|
57
|
+
let config = {};
|
|
58
|
+
if (existsSync(client.configPath)) {
|
|
59
|
+
try {
|
|
60
|
+
config = JSON.parse(readFileSync(client.configPath, 'utf-8'));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
config = {};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const key = client.wrapperKey;
|
|
67
|
+
if (!config[key]) {
|
|
68
|
+
config[key] = {};
|
|
69
|
+
}
|
|
70
|
+
if (config[key]['zt-playground']) {
|
|
71
|
+
return { added: false, reason: 'already configured' };
|
|
72
|
+
}
|
|
73
|
+
if (client.format === 'vscode') {
|
|
74
|
+
config[key]['zt-playground'] = {
|
|
75
|
+
type: 'stdio',
|
|
76
|
+
...MCP_ENTRY,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
config[key]['zt-playground'] = MCP_ENTRY;
|
|
81
|
+
}
|
|
82
|
+
// Ensure directory exists
|
|
83
|
+
const dir = join(client.configPath, '..');
|
|
84
|
+
if (!existsSync(dir)) {
|
|
85
|
+
mkdirSync(dir, { recursive: true });
|
|
86
|
+
}
|
|
87
|
+
writeFileSync(client.configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
88
|
+
return { added: true, reason: 'configured' };
|
|
89
|
+
}
|
|
90
|
+
async function validateAndSaveKey(apiKey) {
|
|
91
|
+
// Temporarily set for validation
|
|
92
|
+
process.env.ZT_API_KEY = apiKey;
|
|
93
|
+
try {
|
|
94
|
+
const user = await api.get('/auth/me');
|
|
95
|
+
saveAuth(apiKey, undefined, user.id, user.name);
|
|
96
|
+
delete process.env.ZT_API_KEY;
|
|
97
|
+
return { success: true, message: `Authenticated as ${user.name} (${user.email})` };
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
delete process.env.ZT_API_KEY;
|
|
101
|
+
return { success: false, message: `Invalid API key: ${err.message}` };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function main() {
|
|
105
|
+
console.log('\n ZT Playground MCP Server - Setup\n');
|
|
106
|
+
// Parse args
|
|
107
|
+
const args = process.argv.slice(2);
|
|
108
|
+
const keyIdx = args.indexOf('--key');
|
|
109
|
+
const apiKey = keyIdx !== -1 ? args[keyIdx + 1] : null;
|
|
110
|
+
const clientFilter = args.find(a => a.startsWith('--client='))?.split('=')[1];
|
|
111
|
+
// Step 1: Detect clients
|
|
112
|
+
console.log(' Detecting MCP clients...\n');
|
|
113
|
+
let clients = detectInstalledClients();
|
|
114
|
+
if (clientFilter) {
|
|
115
|
+
clients = clients.filter(c => c.name.toLowerCase().includes(clientFilter.toLowerCase()));
|
|
116
|
+
}
|
|
117
|
+
if (clients.length === 0) {
|
|
118
|
+
console.log(' No MCP clients detected. Supported clients:');
|
|
119
|
+
console.log(' - Claude Desktop');
|
|
120
|
+
console.log(' - Cursor');
|
|
121
|
+
console.log(' - VS Code');
|
|
122
|
+
console.log(' - Windsurf\n');
|
|
123
|
+
console.log(' Install one of the above clients, then run this setup again.\n');
|
|
124
|
+
// Still allow key setup even without clients
|
|
125
|
+
if (apiKey) {
|
|
126
|
+
console.log(' Setting up API key anyway...');
|
|
127
|
+
const result = await validateAndSaveKey(apiKey);
|
|
128
|
+
console.log(` ${result.success ? '✓' : '✗'} ${result.message}\n`);
|
|
129
|
+
}
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Step 2: Configure each client
|
|
133
|
+
for (const client of clients) {
|
|
134
|
+
const result = addMcpToConfig(client);
|
|
135
|
+
const icon = result.added ? '✓' : '•';
|
|
136
|
+
console.log(` ${icon} ${client.name}: ${result.reason}`);
|
|
137
|
+
if (result.added) {
|
|
138
|
+
console.log(` → ${client.configPath}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Step 3: API key setup
|
|
142
|
+
console.log('');
|
|
143
|
+
if (apiKey) {
|
|
144
|
+
console.log(' Validating API key...');
|
|
145
|
+
const result = await validateAndSaveKey(apiKey);
|
|
146
|
+
console.log(` ${result.success ? '✓' : '✗'} ${result.message}`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.log(' Tip: Add --key <your-api-key> to also configure authentication.');
|
|
150
|
+
console.log(' Or authenticate later in a conversation using the auth_setup tool.');
|
|
151
|
+
}
|
|
152
|
+
console.log('\n Setup complete! Restart your MCP client to start using ZT Playground.\n');
|
|
153
|
+
}
|
|
154
|
+
main().catch((err) => {
|
|
155
|
+
console.error('Setup failed:', err.message);
|
|
156
|
+
process.exit(1);
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|