ai-consultation-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +193 -0
  3. package/dist/api/index.d.ts +27 -0
  4. package/dist/api/index.js +213 -0
  5. package/dist/api/index.js.map +1 -0
  6. package/dist/api/middleware/security.d.ts +6 -0
  7. package/dist/api/middleware/security.js +28 -0
  8. package/dist/api/middleware/security.js.map +1 -0
  9. package/dist/api/routes/chat.d.ts +2 -0
  10. package/dist/api/routes/chat.js +78 -0
  11. package/dist/api/routes/chat.js.map +1 -0
  12. package/dist/api/routes/config.d.ts +2 -0
  13. package/dist/api/routes/config.js +81 -0
  14. package/dist/api/routes/config.js.map +1 -0
  15. package/dist/api/routes/providers.d.ts +2 -0
  16. package/dist/api/routes/providers.js +225 -0
  17. package/dist/api/routes/providers.js.map +1 -0
  18. package/dist/api/standalone-server.d.ts +12 -0
  19. package/dist/api/standalone-server.js +117 -0
  20. package/dist/api/standalone-server.js.map +1 -0
  21. package/dist/config/defaults.d.ts +17 -0
  22. package/dist/config/defaults.js +30 -0
  23. package/dist/config/defaults.js.map +1 -0
  24. package/dist/config/encryption.d.ts +12 -0
  25. package/dist/config/encryption.js +85 -0
  26. package/dist/config/encryption.js.map +1 -0
  27. package/dist/config/index.d.ts +5 -0
  28. package/dist/config/index.js +6 -0
  29. package/dist/config/index.js.map +1 -0
  30. package/dist/config/manager.d.ts +62 -0
  31. package/dist/config/manager.js +210 -0
  32. package/dist/config/manager.js.map +1 -0
  33. package/dist/config/prompts.d.ts +10 -0
  34. package/dist/config/prompts.js +168 -0
  35. package/dist/config/prompts.js.map +1 -0
  36. package/dist/config/schema.d.ts +141 -0
  37. package/dist/config/schema.js +54 -0
  38. package/dist/config/schema.js.map +1 -0
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.js +260 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/installer/detector.d.ts +48 -0
  43. package/dist/installer/detector.js +164 -0
  44. package/dist/installer/detector.js.map +1 -0
  45. package/dist/installer/index.d.ts +7 -0
  46. package/dist/installer/index.js +10 -0
  47. package/dist/installer/index.js.map +1 -0
  48. package/dist/installer/installer.d.ts +16 -0
  49. package/dist/installer/installer.js +262 -0
  50. package/dist/installer/installer.js.map +1 -0
  51. package/dist/installer/tools.d.ts +16 -0
  52. package/dist/installer/tools.js +327 -0
  53. package/dist/installer/tools.js.map +1 -0
  54. package/dist/installer/types.d.ts +68 -0
  55. package/dist/installer/types.js +5 -0
  56. package/dist/installer/types.js.map +1 -0
  57. package/dist/providers/base.d.ts +44 -0
  58. package/dist/providers/base.js +84 -0
  59. package/dist/providers/base.js.map +1 -0
  60. package/dist/providers/deepseek.d.ts +30 -0
  61. package/dist/providers/deepseek.js +148 -0
  62. package/dist/providers/deepseek.js.map +1 -0
  63. package/dist/providers/index.d.ts +5 -0
  64. package/dist/providers/index.js +8 -0
  65. package/dist/providers/index.js.map +1 -0
  66. package/dist/providers/openai.d.ts +30 -0
  67. package/dist/providers/openai.js +123 -0
  68. package/dist/providers/openai.js.map +1 -0
  69. package/dist/providers/registry.d.ts +37 -0
  70. package/dist/providers/registry.js +65 -0
  71. package/dist/providers/registry.js.map +1 -0
  72. package/dist/providers/types.d.ts +71 -0
  73. package/dist/providers/types.js +2 -0
  74. package/dist/providers/types.js.map +1 -0
  75. package/dist/server/conversation.d.ts +105 -0
  76. package/dist/server/conversation.js +279 -0
  77. package/dist/server/conversation.js.map +1 -0
  78. package/dist/server/index.d.ts +2 -0
  79. package/dist/server/index.js +3 -0
  80. package/dist/server/index.js.map +1 -0
  81. package/dist/server/tools/consult.d.ts +15 -0
  82. package/dist/server/tools/consult.js +164 -0
  83. package/dist/server/tools/consult.js.map +1 -0
  84. package/dist/server/tools/index.d.ts +1 -0
  85. package/dist/server/tools/index.js +2 -0
  86. package/dist/server/tools/index.js.map +1 -0
  87. package/dist/types/config.d.ts +20 -0
  88. package/dist/types/config.js +2 -0
  89. package/dist/types/config.js.map +1 -0
  90. package/dist/types/index.d.ts +3 -0
  91. package/dist/types/index.js +4 -0
  92. package/dist/types/index.js.map +1 -0
  93. package/dist/types/messages.d.ts +48 -0
  94. package/dist/types/messages.js +2 -0
  95. package/dist/types/messages.js.map +1 -0
  96. package/dist/types/models.d.ts +39 -0
  97. package/dist/types/models.js +66 -0
  98. package/dist/types/models.js.map +1 -0
  99. package/dist/ui/index.html +1244 -0
  100. package/dist/utils/errors.d.ts +32 -0
  101. package/dist/utils/errors.js +53 -0
  102. package/dist/utils/errors.js.map +1 -0
  103. package/dist/utils/index.d.ts +2 -0
  104. package/dist/utils/index.js +3 -0
  105. package/dist/utils/index.js.map +1 -0
  106. package/dist/utils/logger.d.ts +13 -0
  107. package/dist/utils/logger.js +73 -0
  108. package/dist/utils/logger.js.map +1 -0
  109. package/package.json +65 -0
package/dist/index.js ADDED
@@ -0,0 +1,260 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { z } from 'zod';
5
+ import { getConfigManager, CONSULTATION_MODES } from './config/index.js';
6
+ import { logger } from './utils/index.js';
7
+ import { consultAgent, continueConversation, endConversation, } from './server/index.js';
8
+ import { initializeProviders } from './providers/index.js';
9
+ import { startConfigUI, openWebUI } from './api/index.js';
10
+ import { installToAllTools, printInstallSummary, SUPPORTED_TOOLS } from './installer/index.js';
11
+ /**
12
+ * Parse CLI arguments
13
+ */
14
+ function parseArgs() {
15
+ const args = process.argv.slice(2);
16
+ // Check for install mode
17
+ if (args.includes('--install') || args.includes('install') || args.includes('-i')) {
18
+ return { mode: 'install' };
19
+ }
20
+ // Check for config mode
21
+ if (args.includes('--config') || args.includes('config') || args.includes('-c')) {
22
+ // Parse port if provided
23
+ const portIndex = args.findIndex((a) => a === '--port' || a === '-p');
24
+ let port;
25
+ if (portIndex !== -1 && args[portIndex + 1]) {
26
+ port = parseInt(args[portIndex + 1], 10);
27
+ if (isNaN(port) || port < 1 || port > 65535) {
28
+ console.error('Invalid port number. Using default.');
29
+ port = undefined;
30
+ }
31
+ }
32
+ return { mode: 'config', port };
33
+ }
34
+ // Check for help
35
+ if (args.includes('--help') || args.includes('-h')) {
36
+ const toolNames = SUPPORTED_TOOLS.map((t) => t.name).join(', ');
37
+ console.log(`
38
+ Agent Consultation MCP - Get second opinions from DeepSeek Reasoner
39
+
40
+ Usage:
41
+ npx agent-consultation-mcp Start MCP server (stdio transport)
42
+ npx agent-consultation-mcp --install Auto-detect & install to all AI tools
43
+ npx agent-consultation-mcp --config Open configuration UI in browser
44
+ npx agent-consultation-mcp --help Show this help message
45
+
46
+ Options:
47
+ --install, -i Auto-detect installed AI tools and add MCP to each
48
+ --config, -c Open configuration UI to manage API keys
49
+ --port <number>, -p Set port for config UI (default: 3456)
50
+ --help, -h Show this help message
51
+
52
+ Supported AI Tools:
53
+ ${toolNames}
54
+
55
+ Quick Start:
56
+ 1. npx agent-consultation-mcp --install (auto-detects all tools)
57
+ 2. Restart your AI tools to load the MCP
58
+ 3. npx agent-consultation-mcp --config (configure API key)
59
+ 4. Start using in any configured tool!
60
+
61
+ Supported Models:
62
+ - deepseek-reasoner (default) - Deep reasoning for complex tasks
63
+ - deepseek-chat - Fast responses for simple queries
64
+ - gpt-5.2, gpt-5.2-pro - OpenAI models (requires API key)
65
+
66
+ Consultation Modes:
67
+ - debug - Systematic error analysis and debugging
68
+ - analyzeCode - Code review for bugs, security, performance
69
+ - reviewArchitecture - System design and architecture decisions
70
+ - validatePlan - Implementation plan review and validation
71
+ - explainConcept - Learn concepts with examples and analogies
72
+ - general - General second opinion (default)
73
+ `);
74
+ process.exit(0);
75
+ }
76
+ return { mode: 'mcp' };
77
+ }
78
+ /**
79
+ * Initialize and start the MCP server
80
+ */
81
+ async function main() {
82
+ const { mode, port } = parseArgs();
83
+ // Install mode - auto-detect and install to all tools
84
+ if (mode === 'install') {
85
+ console.log('🔧 Agent Consultation MCP - Multi-Tool Installer\n');
86
+ console.log('Scanning for installed AI tools...\n');
87
+ const summary = installToAllTools();
88
+ printInstallSummary(summary);
89
+ // If any tools were installed, offer to open config UI
90
+ if (summary.installed.length > 0 || summary.skipped.length > 0) {
91
+ console.log('Opening configuration UI...\n');
92
+ try {
93
+ await startConfigUI({ openBrowser: true });
94
+ }
95
+ catch {
96
+ console.log('💡 Run "npx agent-consultation-mcp --config" to configure API keys.\n');
97
+ process.exit(0);
98
+ }
99
+ }
100
+ else {
101
+ process.exit(0);
102
+ }
103
+ return;
104
+ }
105
+ // Config UI mode
106
+ if (mode === 'config') {
107
+ try {
108
+ await startConfigUI({ port, openBrowser: true });
109
+ }
110
+ catch (error) {
111
+ console.error('Failed to start config UI:', error instanceof Error ? error.message : error);
112
+ process.exit(1);
113
+ }
114
+ return;
115
+ }
116
+ // MCP server mode (default)
117
+ // Initialize configuration
118
+ const configManager = getConfigManager();
119
+ await configManager.init();
120
+ // Initialize providers
121
+ await initializeProviders();
122
+ logger.info('Starting Agent Consultation MCP Server');
123
+ // Create MCP server
124
+ const server = new McpServer({
125
+ name: 'agent-consultation',
126
+ version: '2.0.0',
127
+ });
128
+ // Register consult_agent tool
129
+ server.tool('consult_agent', 'Get a second opinion from another AI model to enrich your perspective. Use this when you want critical feedback, alternative approaches, or to challenge your assumptions. The consulted model will act as a critical reviewer, not a yes-man.', {
130
+ question: z.string().describe('The problem, approach, or decision you want a second opinion on'),
131
+ mode: z
132
+ .enum(CONSULTATION_MODES)
133
+ .optional()
134
+ .describe('Consultation focus: debug (error analysis), analyzeCode (code review), reviewArchitecture (design decisions), validatePlan (plan critique), explainConcept (learning), or general (open discussion)'),
135
+ context: z
136
+ .string()
137
+ .optional()
138
+ .describe('Supporting context: code snippets, error messages, your current approach, or relevant background'),
139
+ }, async (args) => {
140
+ // Open Web UI in browser when tool is triggered
141
+ openWebUI().catch(() => { });
142
+ try {
143
+ const result = await consultAgent(args);
144
+ return {
145
+ content: [
146
+ {
147
+ type: 'text',
148
+ text: JSON.stringify(result, null, 2),
149
+ },
150
+ ],
151
+ };
152
+ }
153
+ catch (error) {
154
+ logger.error('consult_agent failed', {
155
+ error: error instanceof Error ? error.message : 'Unknown error',
156
+ });
157
+ return {
158
+ content: [
159
+ {
160
+ type: 'text',
161
+ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
162
+ },
163
+ ],
164
+ isError: true,
165
+ };
166
+ }
167
+ });
168
+ // Register continue_conversation tool
169
+ server.tool('continue_conversation', 'Continue a multi-turn consultation to dig deeper, ask follow-up questions, or explore alternative perspectives further', {
170
+ conversationId: z
171
+ .string()
172
+ .uuid()
173
+ .describe('The conversation ID from a previous consult_agent call'),
174
+ message: z.string().describe('Your follow-up question, clarification request, or response to their feedback'),
175
+ }, async (args) => {
176
+ // Open Web UI in browser when tool is triggered
177
+ openWebUI().catch(() => { });
178
+ try {
179
+ const result = await continueConversation(args);
180
+ return {
181
+ content: [
182
+ {
183
+ type: 'text',
184
+ text: JSON.stringify(result, null, 2),
185
+ },
186
+ ],
187
+ };
188
+ }
189
+ catch (error) {
190
+ logger.error('continue_conversation failed', {
191
+ error: error instanceof Error ? error.message : 'Unknown error',
192
+ });
193
+ return {
194
+ content: [
195
+ {
196
+ type: 'text',
197
+ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
198
+ },
199
+ ],
200
+ isError: true,
201
+ };
202
+ }
203
+ });
204
+ // Register end_conversation tool
205
+ server.tool('end_conversation', 'End a consultation session and archive it for future reference', {
206
+ conversationId: z
207
+ .string()
208
+ .uuid()
209
+ .describe('The conversation ID to end and archive'),
210
+ }, async (args) => {
211
+ // Open Web UI in browser when tool is triggered
212
+ openWebUI().catch(() => { });
213
+ try {
214
+ const result = await endConversation(args);
215
+ return {
216
+ content: [
217
+ {
218
+ type: 'text',
219
+ text: JSON.stringify(result, null, 2),
220
+ },
221
+ ],
222
+ };
223
+ }
224
+ catch (error) {
225
+ logger.error('end_conversation failed', {
226
+ error: error instanceof Error ? error.message : 'Unknown error',
227
+ });
228
+ return {
229
+ content: [
230
+ {
231
+ type: 'text',
232
+ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
233
+ },
234
+ ],
235
+ isError: true,
236
+ };
237
+ }
238
+ });
239
+ // Connect using stdio transport
240
+ const transport = new StdioServerTransport();
241
+ await server.connect(transport);
242
+ logger.info('MCP Server connected and ready');
243
+ }
244
+ // Handle process signals
245
+ process.on('SIGINT', () => {
246
+ logger.info('Received SIGINT, shutting down');
247
+ process.exit(0);
248
+ });
249
+ process.on('SIGTERM', () => {
250
+ logger.info('Received SIGTERM, shutting down');
251
+ process.exit(0);
252
+ });
253
+ // Start the server
254
+ main().catch((error) => {
255
+ logger.error('Failed to start MCP server', {
256
+ error: error instanceof Error ? error.message : 'Unknown error',
257
+ });
258
+ process.exit(1);
259
+ });
260
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE/F;;GAEG;AACH,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,yBAAyB;IACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAClF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC;IAED,wBAAwB;IACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChF,yBAAyB;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QACtE,IAAI,IAAwB,CAAC;QAC7B,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5C,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACrD,IAAI,GAAG,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,iBAAiB;IACjB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;IAgBZ,SAAS;;;;;;;;;;;;;;;;;;;;CAoBZ,CAAC,CAAC;QACC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC;IAEnC,sDAAsD;IACtD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAE7B,uDAAuD;QACvD,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;gBACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,4BAA4B;IAC5B,2BAA2B;IAC3B,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAE3B,uBAAuB;IACvB,MAAM,mBAAmB,EAAE,CAAC;IAE5B,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAEtD,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,8BAA8B;IAC9B,MAAM,CAAC,IAAI,CACT,eAAe,EACf,gPAAgP,EAChP;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;QAChG,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,kBAAkB,CAAC;aACxB,QAAQ,EAAE;aACV,QAAQ,CAAC,qMAAqM,CAAC;QAClN,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,kGAAkG,CAAC;KAChH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,gDAAgD;QAChD,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBACtC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;gBACnC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;qBAC3E;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,sCAAsC;IACtC,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,wHAAwH,EACxH;QACE,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,IAAI,EAAE;aACN,QAAQ,CAAC,wDAAwD,CAAC;QACrE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+EAA+E,CAAC;KAC9G,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,gDAAgD;QAChD,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBACtC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;gBAC3C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;qBAC3E;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,iCAAiC;IACjC,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,gEAAgE,EAChE;QACE,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,IAAI,EAAE;aACN,QAAQ,CAAC,wCAAwC,CAAC;KACtD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,gDAAgD;QAChD,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBACtC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;gBACtC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;qBAC3E;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,gCAAgC;IAChC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;AAChD,CAAC;AAED,yBAAyB;AACzB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE;QACzC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;KAChE,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Tool detection utilities for multi-tool installer
3
+ */
4
+ import { ToolDefinition, DetectedTool, Platform } from './types.js';
5
+ /**
6
+ * Get current platform
7
+ */
8
+ export declare function getPlatform(): Platform;
9
+ /**
10
+ * Get full config path for a tool
11
+ */
12
+ export declare function getConfigPath(tool: ToolDefinition): string | null;
13
+ /**
14
+ * Check if a binary exists in PATH using execFileSync (safe from injection)
15
+ */
16
+ export declare function binaryExists(binaryName: string): boolean;
17
+ /**
18
+ * Check if a directory exists
19
+ */
20
+ export declare function directoryExists(dirPath: string, relativePath?: boolean): boolean;
21
+ /**
22
+ * Check if a file exists
23
+ */
24
+ export declare function fileExists(filePath: string): boolean;
25
+ /**
26
+ * Check if MCP is already installed in config
27
+ */
28
+ export declare function isMcpInstalled(configPath: string, mcpKey: string, serverName: string): boolean;
29
+ /**
30
+ * Detect if a specific tool is installed
31
+ */
32
+ export declare function detectTool(tool: ToolDefinition): DetectedTool;
33
+ /**
34
+ * Detect all installed tools
35
+ */
36
+ export declare function detectAllTools(): DetectedTool[];
37
+ /**
38
+ * Get only installed tools
39
+ */
40
+ export declare function getInstalledTools(): DetectedTool[];
41
+ /**
42
+ * Get tools that need MCP installation
43
+ */
44
+ export declare function getToolsNeedingInstallation(): DetectedTool[];
45
+ /**
46
+ * Get tools where MCP is already installed
47
+ */
48
+ export declare function getToolsWithMcpInstalled(): DetectedTool[];
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Tool detection utilities for multi-tool installer
3
+ */
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ import * as os from 'os';
7
+ import { execFileSync } from 'child_process';
8
+ import { SUPPORTED_TOOLS } from './tools.js';
9
+ /**
10
+ * Get current platform
11
+ */
12
+ export function getPlatform() {
13
+ const platform = process.platform;
14
+ if (platform === 'darwin' || platform === 'win32' || platform === 'linux') {
15
+ return platform;
16
+ }
17
+ // Default to linux for other Unix-like systems
18
+ return 'linux';
19
+ }
20
+ /**
21
+ * Get full config path for a tool
22
+ */
23
+ export function getConfigPath(tool) {
24
+ const platform = getPlatform();
25
+ const configPath = tool.configPaths[platform];
26
+ if (!configPath) {
27
+ return null;
28
+ }
29
+ if (configPath.relative) {
30
+ return path.join(os.homedir(), configPath.path);
31
+ }
32
+ return configPath.path;
33
+ }
34
+ /**
35
+ * Check if a binary exists in PATH using execFileSync (safe from injection)
36
+ */
37
+ export function binaryExists(binaryName) {
38
+ try {
39
+ const command = process.platform === 'win32' ? 'where' : 'which';
40
+ // Using execFileSync is safe - binaryName is passed as argument, not shell-interpolated
41
+ execFileSync(command, [binaryName], { stdio: 'ignore' });
42
+ return true;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ /**
49
+ * Check if a directory exists
50
+ */
51
+ export function directoryExists(dirPath, relativePath = true) {
52
+ const fullPath = relativePath ? path.join(os.homedir(), dirPath) : dirPath;
53
+ try {
54
+ return fs.existsSync(fullPath) && fs.statSync(fullPath).isDirectory();
55
+ }
56
+ catch {
57
+ return false;
58
+ }
59
+ }
60
+ /**
61
+ * Check if a file exists
62
+ */
63
+ export function fileExists(filePath) {
64
+ try {
65
+ return fs.existsSync(filePath) && fs.statSync(filePath).isFile();
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ }
71
+ /**
72
+ * Get nested value from object using dot notation
73
+ */
74
+ function getNestedValue(obj, keyPath) {
75
+ const keys = keyPath.split('.');
76
+ let current = obj;
77
+ for (const key of keys) {
78
+ if (current === null || typeof current !== 'object') {
79
+ return undefined;
80
+ }
81
+ current = current[key];
82
+ }
83
+ return current;
84
+ }
85
+ /**
86
+ * Check if MCP is already installed in config
87
+ */
88
+ export function isMcpInstalled(configPath, mcpKey, serverName) {
89
+ try {
90
+ if (!fileExists(configPath)) {
91
+ return false;
92
+ }
93
+ const content = fs.readFileSync(configPath, 'utf-8');
94
+ const config = JSON.parse(content);
95
+ const mcpServers = getNestedValue(config, mcpKey);
96
+ if (!mcpServers || typeof mcpServers !== 'object') {
97
+ return false;
98
+ }
99
+ return serverName in mcpServers;
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ }
105
+ /**
106
+ * Detect if a specific tool is installed
107
+ */
108
+ export function detectTool(tool) {
109
+ const platform = getPlatform();
110
+ const configPathObj = tool.configPaths[platform];
111
+ const configPath = getConfigPath(tool);
112
+ // Check if tool is installed
113
+ let installed = false;
114
+ // Check binary
115
+ if (tool.detection.binary) {
116
+ installed = installed || binaryExists(tool.detection.binary);
117
+ }
118
+ // Check directory
119
+ if (tool.detection.directory) {
120
+ installed = installed || directoryExists(tool.detection.directory);
121
+ }
122
+ // Check config file (for extensions without binary)
123
+ if (tool.detection.configFile && configPath) {
124
+ installed = installed || fileExists(configPath);
125
+ }
126
+ // Check config existence
127
+ const configExists = configPath ? fileExists(configPath) : false;
128
+ // Check if MCP already installed
129
+ const mcpAlreadyInstalled = configPath && configPathObj
130
+ ? isMcpInstalled(configPath, configPathObj.mcpKey, tool.mcpConfig.serverName)
131
+ : false;
132
+ return {
133
+ tool,
134
+ installed,
135
+ configExists,
136
+ mcpAlreadyInstalled,
137
+ configPath: configPath || '',
138
+ };
139
+ }
140
+ /**
141
+ * Detect all installed tools
142
+ */
143
+ export function detectAllTools() {
144
+ return SUPPORTED_TOOLS.map(detectTool);
145
+ }
146
+ /**
147
+ * Get only installed tools
148
+ */
149
+ export function getInstalledTools() {
150
+ return detectAllTools().filter((t) => t.installed);
151
+ }
152
+ /**
153
+ * Get tools that need MCP installation
154
+ */
155
+ export function getToolsNeedingInstallation() {
156
+ return detectAllTools().filter((t) => t.installed && !t.mcpAlreadyInstalled);
157
+ }
158
+ /**
159
+ * Get tools where MCP is already installed
160
+ */
161
+ export function getToolsWithMcpInstalled() {
162
+ return detectAllTools().filter((t) => t.installed && t.mcpAlreadyInstalled);
163
+ }
164
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/installer/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Multi-tool MCP installer module
3
+ */
4
+ export type { Platform, ToolConfigPath, ToolDefinition, DetectedTool, InstallResult, InstallSummary, } from './types.js';
5
+ export { SUPPORTED_TOOLS, getToolById, getToolIds } from './tools.js';
6
+ export { getPlatform, getConfigPath, binaryExists, directoryExists, fileExists, isMcpInstalled, detectTool, detectAllTools, getInstalledTools, getToolsNeedingInstallation, getToolsWithMcpInstalled, } from './detector.js';
7
+ export { installToTool, installToAllTools, printInstallSummary } from './installer.js';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Multi-tool MCP installer module
3
+ */
4
+ // Tool definitions
5
+ export { SUPPORTED_TOOLS, getToolById, getToolIds } from './tools.js';
6
+ // Detection utilities
7
+ export { getPlatform, getConfigPath, binaryExists, directoryExists, fileExists, isMcpInstalled, detectTool, detectAllTools, getInstalledTools, getToolsNeedingInstallation, getToolsWithMcpInstalled, } from './detector.js';
8
+ // Installation functions
9
+ export { installToTool, installToAllTools, printInstallSummary } from './installer.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtE,sBAAsB;AACtB,OAAO,EACL,WAAW,EACX,aAAa,EACb,YAAY,EACZ,eAAe,EACf,UAAU,EACV,cAAc,EACd,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAEvB,yBAAyB;AACzB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Multi-tool MCP installer
3
+ */
4
+ import { DetectedTool, InstallResult, InstallSummary } from './types.js';
5
+ /**
6
+ * Install MCP to a specific tool
7
+ */
8
+ export declare function installToTool(detected: DetectedTool): InstallResult;
9
+ /**
10
+ * Install MCP to all detected tools
11
+ */
12
+ export declare function installToAllTools(): InstallSummary;
13
+ /**
14
+ * Print installation summary to console
15
+ */
16
+ export declare function printInstallSummary(summary: InstallSummary): void;