@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.
Files changed (106) hide show
  1. package/README.md +231 -0
  2. package/dist/api-client.d.ts +27 -0
  3. package/dist/api-client.d.ts.map +1 -0
  4. package/dist/api-client.js +75 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/auth/check-permissions.d.ts +16 -0
  7. package/dist/auth/check-permissions.d.ts.map +1 -0
  8. package/dist/auth/check-permissions.js +43 -0
  9. package/dist/auth/check-permissions.js.map +1 -0
  10. package/dist/auth/get-user-workspaces.d.ts +3 -0
  11. package/dist/auth/get-user-workspaces.d.ts.map +1 -0
  12. package/dist/auth/get-user-workspaces.js +16 -0
  13. package/dist/auth/get-user-workspaces.js.map +1 -0
  14. package/dist/auth/mcp-token-verify.d.ts +10 -0
  15. package/dist/auth/mcp-token-verify.d.ts.map +1 -0
  16. package/dist/auth/mcp-token-verify.js +43 -0
  17. package/dist/auth/mcp-token-verify.js.map +1 -0
  18. package/dist/auth/verify-token.d.ts +4 -0
  19. package/dist/auth/verify-token.d.ts.map +1 -0
  20. package/dist/auth/verify-token.js +61 -0
  21. package/dist/auth/verify-token.js.map +1 -0
  22. package/dist/cli/config-manager.d.ts +29 -0
  23. package/dist/cli/config-manager.d.ts.map +1 -0
  24. package/dist/cli/config-manager.js +111 -0
  25. package/dist/cli/config-manager.js.map +1 -0
  26. package/dist/cli/credentials.d.ts +64 -0
  27. package/dist/cli/credentials.d.ts.map +1 -0
  28. package/dist/cli/credentials.js +117 -0
  29. package/dist/cli/credentials.js.map +1 -0
  30. package/dist/cli/profiles.d.ts +3 -0
  31. package/dist/cli/profiles.d.ts.map +1 -0
  32. package/dist/cli/profiles.js +35 -0
  33. package/dist/cli/profiles.js.map +1 -0
  34. package/dist/cli/revoke.d.ts +3 -0
  35. package/dist/cli/revoke.d.ts.map +1 -0
  36. package/dist/cli/revoke.js +60 -0
  37. package/dist/cli/revoke.js.map +1 -0
  38. package/dist/cli/setup.d.ts +11 -0
  39. package/dist/cli/setup.d.ts.map +1 -0
  40. package/dist/cli/setup.js +296 -0
  41. package/dist/cli/setup.js.map +1 -0
  42. package/dist/cli/status.d.ts +2 -0
  43. package/dist/cli/status.d.ts.map +1 -0
  44. package/dist/cli/status.js +45 -0
  45. package/dist/cli/status.js.map +1 -0
  46. package/dist/index.d.ts +3 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +124 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/queries/file-queries.d.ts +15 -0
  51. package/dist/queries/file-queries.d.ts.map +1 -0
  52. package/dist/queries/file-queries.js +75 -0
  53. package/dist/queries/file-queries.js.map +1 -0
  54. package/dist/queries/search-queries.d.ts +7 -0
  55. package/dist/queries/search-queries.d.ts.map +1 -0
  56. package/dist/queries/search-queries.js +93 -0
  57. package/dist/queries/search-queries.js.map +1 -0
  58. package/dist/queries/version-queries.d.ts +26 -0
  59. package/dist/queries/version-queries.d.ts.map +1 -0
  60. package/dist/queries/version-queries.js +46 -0
  61. package/dist/queries/version-queries.js.map +1 -0
  62. package/dist/queries/workspace-queries.d.ts +10 -0
  63. package/dist/queries/workspace-queries.d.ts.map +1 -0
  64. package/dist/queries/workspace-queries.js +108 -0
  65. package/dist/queries/workspace-queries.js.map +1 -0
  66. package/dist/server.d.ts +21 -0
  67. package/dist/server.d.ts.map +1 -0
  68. package/dist/server.js +81 -0
  69. package/dist/server.js.map +1 -0
  70. package/dist/tools/get-file-versions.d.ts +30 -0
  71. package/dist/tools/get-file-versions.d.ts.map +1 -0
  72. package/dist/tools/get-file-versions.js +42 -0
  73. package/dist/tools/get-file-versions.js.map +1 -0
  74. package/dist/tools/get-file.d.ts +26 -0
  75. package/dist/tools/get-file.d.ts.map +1 -0
  76. package/dist/tools/get-file.js +51 -0
  77. package/dist/tools/get-file.js.map +1 -0
  78. package/dist/tools/get-project-structure.d.ts +26 -0
  79. package/dist/tools/get-project-structure.d.ts.map +1 -0
  80. package/dist/tools/get-project-structure.js +37 -0
  81. package/dist/tools/get-project-structure.js.map +1 -0
  82. package/dist/tools/index.d.ts +8 -0
  83. package/dist/tools/index.d.ts.map +1 -0
  84. package/dist/tools/index.js +8 -0
  85. package/dist/tools/index.js.map +1 -0
  86. package/dist/tools/list-files.d.ts +35 -0
  87. package/dist/tools/list-files.d.ts.map +1 -0
  88. package/dist/tools/list-files.js +74 -0
  89. package/dist/tools/list-files.js.map +1 -0
  90. package/dist/tools/list-projects.d.ts +19 -0
  91. package/dist/tools/list-projects.d.ts.map +1 -0
  92. package/dist/tools/list-projects.js +74 -0
  93. package/dist/tools/list-projects.js.map +1 -0
  94. package/dist/tools/list-workspaces.d.ts +17 -0
  95. package/dist/tools/list-workspaces.d.ts.map +1 -0
  96. package/dist/tools/list-workspaces.js +45 -0
  97. package/dist/tools/list-workspaces.js.map +1 -0
  98. package/dist/tools/search-documentation.d.ts +38 -0
  99. package/dist/tools/search-documentation.d.ts.map +1 -0
  100. package/dist/tools/search-documentation.js +53 -0
  101. package/dist/tools/search-documentation.js.map +1 -0
  102. package/dist/types.d.ts +126 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +2 -0
  105. package/dist/types.js.map +1 -0
  106. 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,2 @@
1
+ export declare function statusCommand(profileName?: string): void;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}