@doxhub/mcp-server 0.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/README.md +231 -0
- package/dist/api-client.d.ts +27 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +75 -0
- package/dist/api-client.js.map +1 -0
- package/dist/auth/check-permissions.d.ts +16 -0
- package/dist/auth/check-permissions.d.ts.map +1 -0
- package/dist/auth/check-permissions.js +43 -0
- package/dist/auth/check-permissions.js.map +1 -0
- package/dist/auth/get-user-workspaces.d.ts +3 -0
- package/dist/auth/get-user-workspaces.d.ts.map +1 -0
- package/dist/auth/get-user-workspaces.js +16 -0
- package/dist/auth/get-user-workspaces.js.map +1 -0
- package/dist/auth/mcp-token-verify.d.ts +10 -0
- package/dist/auth/mcp-token-verify.d.ts.map +1 -0
- package/dist/auth/mcp-token-verify.js +43 -0
- package/dist/auth/mcp-token-verify.js.map +1 -0
- package/dist/auth/verify-token.d.ts +4 -0
- package/dist/auth/verify-token.d.ts.map +1 -0
- package/dist/auth/verify-token.js +61 -0
- package/dist/auth/verify-token.js.map +1 -0
- package/dist/cli/config-manager.d.ts +29 -0
- package/dist/cli/config-manager.d.ts.map +1 -0
- package/dist/cli/config-manager.js +111 -0
- package/dist/cli/config-manager.js.map +1 -0
- package/dist/cli/credentials.d.ts +64 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +117 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/profiles.d.ts +3 -0
- package/dist/cli/profiles.d.ts.map +1 -0
- package/dist/cli/profiles.js +35 -0
- package/dist/cli/profiles.js.map +1 -0
- package/dist/cli/revoke.d.ts +3 -0
- package/dist/cli/revoke.d.ts.map +1 -0
- package/dist/cli/revoke.js +60 -0
- package/dist/cli/revoke.js.map +1 -0
- package/dist/cli/setup.d.ts +11 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +296 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/status.d.ts +2 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +45 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +124 -0
- package/dist/index.js.map +1 -0
- package/dist/queries/file-queries.d.ts +15 -0
- package/dist/queries/file-queries.d.ts.map +1 -0
- package/dist/queries/file-queries.js +75 -0
- package/dist/queries/file-queries.js.map +1 -0
- package/dist/queries/search-queries.d.ts +7 -0
- package/dist/queries/search-queries.d.ts.map +1 -0
- package/dist/queries/search-queries.js +93 -0
- package/dist/queries/search-queries.js.map +1 -0
- package/dist/queries/version-queries.d.ts +26 -0
- package/dist/queries/version-queries.d.ts.map +1 -0
- package/dist/queries/version-queries.js +46 -0
- package/dist/queries/version-queries.js.map +1 -0
- package/dist/queries/workspace-queries.d.ts +10 -0
- package/dist/queries/workspace-queries.d.ts.map +1 -0
- package/dist/queries/workspace-queries.js +108 -0
- package/dist/queries/workspace-queries.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +81 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/get-file-versions.d.ts +30 -0
- package/dist/tools/get-file-versions.d.ts.map +1 -0
- package/dist/tools/get-file-versions.js +42 -0
- package/dist/tools/get-file-versions.js.map +1 -0
- package/dist/tools/get-file.d.ts +26 -0
- package/dist/tools/get-file.d.ts.map +1 -0
- package/dist/tools/get-file.js +51 -0
- package/dist/tools/get-file.js.map +1 -0
- package/dist/tools/get-project-structure.d.ts +26 -0
- package/dist/tools/get-project-structure.d.ts.map +1 -0
- package/dist/tools/get-project-structure.js +37 -0
- package/dist/tools/get-project-structure.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-files.d.ts +35 -0
- package/dist/tools/list-files.d.ts.map +1 -0
- package/dist/tools/list-files.js +74 -0
- package/dist/tools/list-files.js.map +1 -0
- package/dist/tools/list-projects.d.ts +19 -0
- package/dist/tools/list-projects.d.ts.map +1 -0
- package/dist/tools/list-projects.js +74 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/list-workspaces.d.ts +17 -0
- package/dist/tools/list-workspaces.d.ts.map +1 -0
- package/dist/tools/list-workspaces.js +45 -0
- package/dist/tools/list-workspaces.js.map +1 -0
- package/dist/tools/search-documentation.d.ts +38 -0
- package/dist/tools/search-documentation.d.ts.map +1 -0
- package/dist/tools/search-documentation.js +53 -0
- package/dist/tools/search-documentation.js.map +1 -0
- package/dist/types.d.ts +126 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import http from 'http';
|
|
2
|
+
import open from 'open';
|
|
3
|
+
import readline from 'readline';
|
|
4
|
+
import { saveProfile } from './credentials.js';
|
|
5
|
+
import { updateClaudeConfigForDoxHub, claudeConfigExists } from './config-manager.js';
|
|
6
|
+
const DEFAULT_API_URL = 'https://api.doxhub.com/api/v1';
|
|
7
|
+
const AUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
8
|
+
const PORT_RANGE_START = 8000;
|
|
9
|
+
const PORT_RANGE_END = 9000;
|
|
10
|
+
/**
|
|
11
|
+
* Find an available port in the range
|
|
12
|
+
*/
|
|
13
|
+
async function findAvailablePort() {
|
|
14
|
+
for (let port = PORT_RANGE_START; port <= PORT_RANGE_END; port++) {
|
|
15
|
+
if (await isPortAvailable(port)) {
|
|
16
|
+
return port;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
throw new Error(`No available ports in range ${PORT_RANGE_START}-${PORT_RANGE_END}`);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if a port is available
|
|
23
|
+
*/
|
|
24
|
+
function isPortAvailable(port) {
|
|
25
|
+
return new Promise((resolve) => {
|
|
26
|
+
const server = http.createServer();
|
|
27
|
+
server.once('error', () => resolve(false));
|
|
28
|
+
server.once('listening', () => {
|
|
29
|
+
server.close();
|
|
30
|
+
resolve(true);
|
|
31
|
+
});
|
|
32
|
+
server.listen(port);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Ask user a yes/no question
|
|
37
|
+
*/
|
|
38
|
+
async function askYesNo(question) {
|
|
39
|
+
const rl = readline.createInterface({
|
|
40
|
+
input: process.stdin,
|
|
41
|
+
output: process.stdout,
|
|
42
|
+
});
|
|
43
|
+
return new Promise((resolve) => {
|
|
44
|
+
rl.question(`${question} (y/n): `, (answer) => {
|
|
45
|
+
rl.close();
|
|
46
|
+
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Main setup command
|
|
52
|
+
*/
|
|
53
|
+
export async function setupCommand(options = {}) {
|
|
54
|
+
const profileName = options.profile || 'default';
|
|
55
|
+
const apiUrl = options.apiUrl || DEFAULT_API_URL;
|
|
56
|
+
console.log('\n🚀 DoxHub MCP Setup\n');
|
|
57
|
+
console.log('This will authorize your MCP server to access DoxHub.\n');
|
|
58
|
+
try {
|
|
59
|
+
// Step 1: Find available port
|
|
60
|
+
const callbackPort = await findAvailablePort();
|
|
61
|
+
console.log(`✓ Found available port: ${callbackPort}`);
|
|
62
|
+
// Step 2: Start local HTTP server
|
|
63
|
+
const tokenPromise = startCallbackServer(callbackPort);
|
|
64
|
+
// Step 3: Construct authorization URL
|
|
65
|
+
// Convert API URL to web app URL (api.doxhub.io -> app.doxhub.io)
|
|
66
|
+
const webAppUrl = apiUrl
|
|
67
|
+
.replace('/api/v1', '')
|
|
68
|
+
.replace('api.doxhub.io', 'app.doxhub.io')
|
|
69
|
+
.replace('api.doxhub.com', 'app.doxhub.com');
|
|
70
|
+
const authUrl = `${webAppUrl}/mcp/authorize?port=${callbackPort}`;
|
|
71
|
+
console.log('\n📝 Opening browser for authorization...\n');
|
|
72
|
+
// Step 4: Open browser
|
|
73
|
+
if (!options.skipBrowser) {
|
|
74
|
+
try {
|
|
75
|
+
await open(authUrl);
|
|
76
|
+
console.log('✓ Browser opened');
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error('⚠️ Could not open browser automatically');
|
|
80
|
+
console.log('\nPlease open this URL manually:');
|
|
81
|
+
console.log(authUrl);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
console.log('Please open this URL in your browser:');
|
|
86
|
+
console.log(authUrl);
|
|
87
|
+
}
|
|
88
|
+
console.log('\n⏳ Waiting for authorization...\n');
|
|
89
|
+
// Step 6: Wait for callback
|
|
90
|
+
const result = await tokenPromise;
|
|
91
|
+
console.log('✓ Authorization successful!');
|
|
92
|
+
// Step 7: Save credentials
|
|
93
|
+
saveProfile(profileName, {
|
|
94
|
+
apiUrl,
|
|
95
|
+
accessToken: result.token,
|
|
96
|
+
workspaceId: result.workspaceId || null,
|
|
97
|
+
createdAt: new Date().toISOString(),
|
|
98
|
+
expiresAt: result.expiresAt,
|
|
99
|
+
}, true);
|
|
100
|
+
console.log(`✓ Credentials saved to profile: ${profileName}`);
|
|
101
|
+
// Step 8: Ask about Claude config
|
|
102
|
+
if (claudeConfigExists()) {
|
|
103
|
+
console.log('\n🔧 Claude Desktop detected');
|
|
104
|
+
const shouldUpdate = await askYesNo('Would you like to update Claude Desktop config?');
|
|
105
|
+
if (shouldUpdate) {
|
|
106
|
+
updateClaudeConfigForDoxHub(profileName);
|
|
107
|
+
console.log('✓ Claude Desktop config updated');
|
|
108
|
+
console.log('\n⚠️ Please restart Claude Desktop for changes to take effect');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log('\n⚠️ Claude Desktop config not found');
|
|
113
|
+
console.log('You can manually add this to your Claude config:');
|
|
114
|
+
console.log(JSON.stringify({
|
|
115
|
+
mcpServers: {
|
|
116
|
+
doxhub: {
|
|
117
|
+
command: 'npx',
|
|
118
|
+
args: ['@doxhub/mcp-server'],
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
}, null, 2));
|
|
122
|
+
}
|
|
123
|
+
console.log('\n✅ Setup complete!');
|
|
124
|
+
console.log('\nYou can now use DoxHub MCP tools in Claude.\n');
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
console.error('\n❌ Setup failed:', error instanceof Error ? error.message : error);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Start local HTTP server to receive callback
|
|
133
|
+
*/
|
|
134
|
+
function startCallbackServer(port) {
|
|
135
|
+
return new Promise((resolve, reject) => {
|
|
136
|
+
const timeout = setTimeout(() => {
|
|
137
|
+
server.close();
|
|
138
|
+
reject(new Error('Authorization timeout - please try again'));
|
|
139
|
+
}, AUTH_TIMEOUT_MS);
|
|
140
|
+
const server = http.createServer(async (req, res) => {
|
|
141
|
+
const url = new URL(req.url || '', `http://localhost:${port}`);
|
|
142
|
+
if (url.pathname === '/callback') {
|
|
143
|
+
const token = url.searchParams.get('token');
|
|
144
|
+
const workspaceId = url.searchParams.get('workspaceId');
|
|
145
|
+
const expiresAt = url.searchParams.get('expiresAt');
|
|
146
|
+
const error = url.searchParams.get('error');
|
|
147
|
+
if (error) {
|
|
148
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
149
|
+
res.end(`
|
|
150
|
+
<html>
|
|
151
|
+
<body style="font-family: sans-serif; padding: 40px; text-align: center;">
|
|
152
|
+
<h1>❌ Authorization Failed</h1>
|
|
153
|
+
<p>${error}</p>
|
|
154
|
+
<p>You can close this window and try again.</p>
|
|
155
|
+
</body>
|
|
156
|
+
</html>
|
|
157
|
+
`);
|
|
158
|
+
clearTimeout(timeout);
|
|
159
|
+
server.close();
|
|
160
|
+
reject(new Error(error));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (!token || !expiresAt) {
|
|
164
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
165
|
+
res.end(`
|
|
166
|
+
<html>
|
|
167
|
+
<body style="font-family: sans-serif; padding: 40px; text-align: center;">
|
|
168
|
+
<h1>❌ Missing Data</h1>
|
|
169
|
+
<p>Token or expiry date missing. Please try again.</p>
|
|
170
|
+
</body>
|
|
171
|
+
</html>
|
|
172
|
+
`);
|
|
173
|
+
clearTimeout(timeout);
|
|
174
|
+
server.close();
|
|
175
|
+
reject(new Error('Missing token or expiry data'));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
// Success!
|
|
179
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
180
|
+
res.end(`
|
|
181
|
+
<!DOCTYPE html>
|
|
182
|
+
<html lang="en">
|
|
183
|
+
<head>
|
|
184
|
+
<meta charset="UTF-8">
|
|
185
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
186
|
+
<title>DoxHub - Setup Complete</title>
|
|
187
|
+
<style>
|
|
188
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
189
|
+
body {
|
|
190
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
191
|
+
background: #0a0a0b;
|
|
192
|
+
color: #e5e5e7;
|
|
193
|
+
display: flex;
|
|
194
|
+
align-items: center;
|
|
195
|
+
justify-content: center;
|
|
196
|
+
min-height: 100vh;
|
|
197
|
+
padding: 20px;
|
|
198
|
+
}
|
|
199
|
+
.container {
|
|
200
|
+
text-align: center;
|
|
201
|
+
max-width: 500px;
|
|
202
|
+
}
|
|
203
|
+
.icon {
|
|
204
|
+
width: 80px;
|
|
205
|
+
height: 80px;
|
|
206
|
+
margin: 0 auto 32px;
|
|
207
|
+
background: rgba(34, 197, 94, 0.1);
|
|
208
|
+
border-radius: 50%;
|
|
209
|
+
display: flex;
|
|
210
|
+
align-items: center;
|
|
211
|
+
justify-content: center;
|
|
212
|
+
position: relative;
|
|
213
|
+
}
|
|
214
|
+
.icon::before {
|
|
215
|
+
content: '';
|
|
216
|
+
position: absolute;
|
|
217
|
+
inset: 0;
|
|
218
|
+
background: rgba(34, 197, 94, 0.2);
|
|
219
|
+
border-radius: 50%;
|
|
220
|
+
filter: blur(40px);
|
|
221
|
+
}
|
|
222
|
+
.icon svg {
|
|
223
|
+
width: 40px;
|
|
224
|
+
height: 40px;
|
|
225
|
+
position: relative;
|
|
226
|
+
z-index: 1;
|
|
227
|
+
}
|
|
228
|
+
h1 {
|
|
229
|
+
font-size: 32px;
|
|
230
|
+
font-weight: 700;
|
|
231
|
+
margin-bottom: 16px;
|
|
232
|
+
color: #fff;
|
|
233
|
+
}
|
|
234
|
+
p {
|
|
235
|
+
font-size: 16px;
|
|
236
|
+
color: #a1a1aa;
|
|
237
|
+
line-height: 1.6;
|
|
238
|
+
}
|
|
239
|
+
.badge {
|
|
240
|
+
display: inline-flex;
|
|
241
|
+
align-items: center;
|
|
242
|
+
gap: 8px;
|
|
243
|
+
margin-top: 32px;
|
|
244
|
+
padding: 12px 24px;
|
|
245
|
+
background: rgba(34, 197, 94, 0.1);
|
|
246
|
+
border: 1px solid rgba(34, 197, 94, 0.2);
|
|
247
|
+
border-radius: 12px;
|
|
248
|
+
color: #22c55e;
|
|
249
|
+
font-size: 14px;
|
|
250
|
+
font-weight: 500;
|
|
251
|
+
}
|
|
252
|
+
</style>
|
|
253
|
+
</head>
|
|
254
|
+
<body>
|
|
255
|
+
<div class="container">
|
|
256
|
+
<div class="icon">
|
|
257
|
+
<svg fill="none" stroke="#22c55e" stroke-width="3" viewBox="0 0 24 24">
|
|
258
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />
|
|
259
|
+
</svg>
|
|
260
|
+
</div>
|
|
261
|
+
<h1>Setup Complete!</h1>
|
|
262
|
+
<p>Your MCP server is now connected to DoxHub.<br>Return to your terminal to continue.</p>
|
|
263
|
+
<div class="badge">
|
|
264
|
+
<svg width="16" height="16" fill="currentColor" viewBox="0 0 24 24">
|
|
265
|
+
<path d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"/>
|
|
266
|
+
</svg>
|
|
267
|
+
Credentials Saved
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
<script>setTimeout(() => window.close(), 5000);</script>
|
|
271
|
+
</body>
|
|
272
|
+
</html>
|
|
273
|
+
`);
|
|
274
|
+
clearTimeout(timeout);
|
|
275
|
+
server.close();
|
|
276
|
+
resolve({
|
|
277
|
+
token,
|
|
278
|
+
workspaceId: workspaceId || null,
|
|
279
|
+
expiresAt,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
res.writeHead(404);
|
|
284
|
+
res.end('Not Found');
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
server.on('error', (err) => {
|
|
288
|
+
clearTimeout(timeout);
|
|
289
|
+
reject(err);
|
|
290
|
+
});
|
|
291
|
+
server.listen(port, '127.0.0.1', () => {
|
|
292
|
+
console.log(`✓ Callback server listening on http://localhost:${port}`);
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAGA,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CA+CxD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { getCurrentProfile, credentialsExist } from './credentials.js';
|
|
2
|
+
import { isDoxHubConfigured } from './config-manager.js';
|
|
3
|
+
export function statusCommand(profileName) {
|
|
4
|
+
console.log('\n📊 DoxHub MCP Status\n');
|
|
5
|
+
// Check if credentials exist
|
|
6
|
+
if (!credentialsExist()) {
|
|
7
|
+
console.log('❌ No credentials found');
|
|
8
|
+
console.log('\nRun "npx @doxhub/mcp-server setup" to get started.\n');
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
// Get profile
|
|
12
|
+
const profile = getCurrentProfile();
|
|
13
|
+
if (!profile) {
|
|
14
|
+
console.log('❌ No active profile found\n');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
// Display profile info
|
|
18
|
+
console.log('✓ Credentials configured');
|
|
19
|
+
console.log(`\nProfile: ${profileName || 'default'}`);
|
|
20
|
+
console.log(`API URL: ${profile.apiUrl}`);
|
|
21
|
+
console.log(`Workspace: ${profile.workspaceId || 'All workspaces'}`);
|
|
22
|
+
console.log(`Token: ${profile.accessToken.substring(0, 8)}...`);
|
|
23
|
+
console.log(`Created: ${new Date(profile.createdAt).toLocaleDateString()}`);
|
|
24
|
+
console.log(`Expires: ${new Date(profile.expiresAt).toLocaleDateString()}`);
|
|
25
|
+
// Check expiry
|
|
26
|
+
const daysUntilExpiry = Math.floor((new Date(profile.expiresAt).getTime() - Date.now()) / (1000 * 60 * 60 * 24));
|
|
27
|
+
if (daysUntilExpiry <= 0) {
|
|
28
|
+
console.log('\n⚠️ Token has expired - run setup again\n');
|
|
29
|
+
}
|
|
30
|
+
else if (daysUntilExpiry <= 30) {
|
|
31
|
+
console.log(`\n⚠️ Token expires in ${daysUntilExpiry} days\n`);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
console.log(`\n✓ Token expires in ${daysUntilExpiry} days\n`);
|
|
35
|
+
}
|
|
36
|
+
// Check Claude Desktop config
|
|
37
|
+
const isConfigured = isDoxHubConfigured(profileName);
|
|
38
|
+
if (isConfigured) {
|
|
39
|
+
console.log('✓ Claude Desktop configured\n');
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.log('⚠️ Not configured in Claude Desktop\n');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,UAAU,aAAa,CAAC,WAAoB;IAChD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExC,6BAA6B;IAC7B,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,cAAc;IACd,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IAEpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,uBAAuB;IACvB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,IAAI,SAAS,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,WAAW,IAAI,gBAAgB,EAAE,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAE5E,eAAe;IACf,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAC7E,CAAC;IAEF,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,eAAe,IAAI,EAAE,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,0BAA0B,eAAe,SAAS,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,eAAe,SAAS,CAAC,CAAC;IAChE,CAAC;IAED,8BAA8B;IAC9B,MAAM,YAAY,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACrD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { createServer } from './server.js';
|
|
4
|
+
import { setupCommand } from './cli/setup.js';
|
|
5
|
+
import { statusCommand } from './cli/status.js';
|
|
6
|
+
import { profilesCommand, switchProfile } from './cli/profiles.js';
|
|
7
|
+
import { revokeCommand, logoutCommand } from './cli/revoke.js';
|
|
8
|
+
async function main() {
|
|
9
|
+
const args = process.argv.slice(2);
|
|
10
|
+
// Check if running in CLI mode
|
|
11
|
+
if (args.length > 0) {
|
|
12
|
+
const command = args[0];
|
|
13
|
+
switch (command) {
|
|
14
|
+
case 'setup': {
|
|
15
|
+
// Parse options
|
|
16
|
+
const options = {};
|
|
17
|
+
for (let i = 1; i < args.length; i++) {
|
|
18
|
+
if (args[i] === '--profile' && args[i + 1]) {
|
|
19
|
+
options.profile = args[++i];
|
|
20
|
+
}
|
|
21
|
+
else if (args[i] === '--api-url' && args[i + 1]) {
|
|
22
|
+
options.apiUrl = args[++i];
|
|
23
|
+
}
|
|
24
|
+
else if (args[i] === '--skip-browser') {
|
|
25
|
+
options.skipBrowser = true;
|
|
26
|
+
}
|
|
27
|
+
else if (args[i] === '--help' || args[i] === '-h') {
|
|
28
|
+
console.log(`
|
|
29
|
+
Usage: npx @doxhub/mcp-server setup [options]
|
|
30
|
+
|
|
31
|
+
Options:
|
|
32
|
+
--profile <name> Profile name (default: "default")
|
|
33
|
+
--api-url <url> API URL (default: "https://api.doxhub.com/api/v1")
|
|
34
|
+
--skip-browser Don't open browser automatically
|
|
35
|
+
-h, --help Show this help message
|
|
36
|
+
`);
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
await setupCommand(options);
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
case 'status': {
|
|
44
|
+
const profile = args.find((_arg, i) => args[i - 1] === '--profile');
|
|
45
|
+
statusCommand(profile);
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
case 'profiles': {
|
|
49
|
+
profilesCommand();
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
case 'switch': {
|
|
53
|
+
const profile = args.find((_arg, i) => args[i - 1] === '--profile') || args[1];
|
|
54
|
+
if (!profile) {
|
|
55
|
+
console.error('Error: Profile name required');
|
|
56
|
+
console.error('Usage: npx @doxhub/mcp-server switch <profile-name>');
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
switchProfile(profile);
|
|
60
|
+
process.exit(0);
|
|
61
|
+
}
|
|
62
|
+
case 'revoke': {
|
|
63
|
+
const profile = args.find((_arg, i) => args[i - 1] === '--profile');
|
|
64
|
+
await revokeCommand(profile);
|
|
65
|
+
process.exit(0);
|
|
66
|
+
}
|
|
67
|
+
case 'logout': {
|
|
68
|
+
await logoutCommand();
|
|
69
|
+
process.exit(0);
|
|
70
|
+
}
|
|
71
|
+
case 'help':
|
|
72
|
+
case '--help':
|
|
73
|
+
case '-h': {
|
|
74
|
+
console.log(`
|
|
75
|
+
DoxHub MCP Server
|
|
76
|
+
|
|
77
|
+
Usage:
|
|
78
|
+
npx @doxhub/mcp-server [command] [options]
|
|
79
|
+
|
|
80
|
+
Commands:
|
|
81
|
+
setup Set up MCP server authorization
|
|
82
|
+
status Show current token status
|
|
83
|
+
profiles List all profiles
|
|
84
|
+
switch <profile> Switch to a different profile
|
|
85
|
+
revoke Revoke current token
|
|
86
|
+
logout Logout (revoke and remove credentials)
|
|
87
|
+
help Show this help message
|
|
88
|
+
|
|
89
|
+
MCP Server Mode:
|
|
90
|
+
When run without commands, starts the MCP server for Claude integration.
|
|
91
|
+
This mode is used by Claude Desktop/Code automatically.
|
|
92
|
+
|
|
93
|
+
Examples:
|
|
94
|
+
npx @doxhub/mcp-server setup # Set up with default profile
|
|
95
|
+
npx @doxhub/mcp-server setup --profile work # Set up work profile
|
|
96
|
+
npx @doxhub/mcp-server status # Check token status
|
|
97
|
+
npx @doxhub/mcp-server profiles # List all profiles
|
|
98
|
+
npx @doxhub/mcp-server switch work # Switch to work profile
|
|
99
|
+
npx @doxhub/mcp-server revoke # Revoke current token
|
|
100
|
+
npx @doxhub/mcp-server # Run MCP server
|
|
101
|
+
`);
|
|
102
|
+
process.exit(0);
|
|
103
|
+
}
|
|
104
|
+
default: {
|
|
105
|
+
console.error(`Unknown command: ${command}`);
|
|
106
|
+
console.error('Run "npx @doxhub/mcp-server help" for usage information');
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// No command provided - run MCP server
|
|
112
|
+
try {
|
|
113
|
+
const server = createServer();
|
|
114
|
+
const transport = new StdioServerTransport();
|
|
115
|
+
await server.connect(transport);
|
|
116
|
+
console.error('DoxHub MCP Server: Running on stdio transport');
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error('DoxHub MCP Server: Fatal error in main():', error);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
main();
|
|
124
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AuthContext, FileWithMetadata, FileListItem } from '../types.js';
|
|
2
|
+
export declare function getFileById(_auth: AuthContext, fileId: string): Promise<FileWithMetadata>;
|
|
3
|
+
export declare function listFiles(_auth: AuthContext, options: {
|
|
4
|
+
projectId?: string;
|
|
5
|
+
folderId?: string | null;
|
|
6
|
+
workspaceId?: string;
|
|
7
|
+
status?: 'active' | 'archived';
|
|
8
|
+
limit?: number;
|
|
9
|
+
offset?: number;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
files: FileListItem[];
|
|
12
|
+
total: number;
|
|
13
|
+
hasMore: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=file-queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-queries.d.ts","sourceRoot":"","sources":["../../src/queries/file-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG/E,wBAAsB,WAAW,CAC/B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,CAAC,CAyB3B;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAsDrE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { getApiClient } from '../api-client.js';
|
|
2
|
+
export async function getFileById(_auth, fileId) {
|
|
3
|
+
const apiClient = getApiClient();
|
|
4
|
+
try {
|
|
5
|
+
const file = await apiClient.getFile(fileId);
|
|
6
|
+
return {
|
|
7
|
+
id: file.id,
|
|
8
|
+
title: file.title,
|
|
9
|
+
path: file.path,
|
|
10
|
+
content: file.content,
|
|
11
|
+
currentVersion: file.currentVersion,
|
|
12
|
+
status: file.status,
|
|
13
|
+
projectId: file.projectId,
|
|
14
|
+
projectName: file.projectName || '',
|
|
15
|
+
workspaceId: file.workspaceId || '',
|
|
16
|
+
workspaceName: file.workspaceName || '',
|
|
17
|
+
createdAt: file.createdAt,
|
|
18
|
+
updatedAt: file.updatedAt,
|
|
19
|
+
createdBy: file.createdBy,
|
|
20
|
+
updatedBy: file.updatedBy,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
throw new Error(`Failed to get file: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function listFiles(_auth, options) {
|
|
28
|
+
const apiClient = getApiClient();
|
|
29
|
+
const limit = Math.min(options.limit || 20, 100);
|
|
30
|
+
try {
|
|
31
|
+
if (!options.projectId) {
|
|
32
|
+
throw new Error('projectId is required');
|
|
33
|
+
}
|
|
34
|
+
const allFiles = await apiClient.getFiles(options.projectId);
|
|
35
|
+
// Filter by status if specified
|
|
36
|
+
let filteredFiles = allFiles;
|
|
37
|
+
if (options.status) {
|
|
38
|
+
filteredFiles = filteredFiles.filter((f) => f.status === options.status);
|
|
39
|
+
}
|
|
40
|
+
// Filter by folder if specified
|
|
41
|
+
if (options.folderId !== undefined) {
|
|
42
|
+
if (options.folderId === null) {
|
|
43
|
+
filteredFiles = filteredFiles.filter((f) => !f.folderId);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
filteredFiles = filteredFiles.filter((f) => f.folderId === options.folderId);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Sort by updatedAt descending
|
|
50
|
+
filteredFiles.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
51
|
+
// Apply pagination
|
|
52
|
+
const offset = options.offset || 0;
|
|
53
|
+
const paginatedFiles = filteredFiles.slice(offset, offset + limit);
|
|
54
|
+
const hasMore = filteredFiles.length > offset + limit;
|
|
55
|
+
return {
|
|
56
|
+
files: paginatedFiles.map((file) => ({
|
|
57
|
+
id: file.id,
|
|
58
|
+
title: file.title,
|
|
59
|
+
path: file.path,
|
|
60
|
+
currentVersion: file.currentVersion,
|
|
61
|
+
status: file.status,
|
|
62
|
+
projectId: file.projectId,
|
|
63
|
+
projectName: file.projectName || '',
|
|
64
|
+
updatedAt: file.updatedAt,
|
|
65
|
+
preview: file.content?.substring(0, 200) + (file.content?.length > 200 ? '...' : '') || '',
|
|
66
|
+
})),
|
|
67
|
+
total: paginatedFiles.length,
|
|
68
|
+
hasMore,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
throw new Error(`Failed to list files: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=file-queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-queries.js","sourceRoot":"","sources":["../../src/queries/file-queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AuthContext, SearchOptions, SearchResult } from '../types.js';
|
|
2
|
+
export declare function searchDocumentation(auth: AuthContext, options: SearchOptions): Promise<{
|
|
3
|
+
results: SearchResult[];
|
|
4
|
+
total: number;
|
|
5
|
+
hasMore: boolean;
|
|
6
|
+
}>;
|
|
7
|
+
//# sourceMappingURL=search-queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-queries.d.ts","sourceRoot":"","sources":["../../src/queries/search-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI5E,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAmFvE"}
|