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.
- package/LICENSE +21 -0
- package/README.md +193 -0
- package/dist/api/index.d.ts +27 -0
- package/dist/api/index.js +213 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/middleware/security.d.ts +6 -0
- package/dist/api/middleware/security.js +28 -0
- package/dist/api/middleware/security.js.map +1 -0
- package/dist/api/routes/chat.d.ts +2 -0
- package/dist/api/routes/chat.js +78 -0
- package/dist/api/routes/chat.js.map +1 -0
- package/dist/api/routes/config.d.ts +2 -0
- package/dist/api/routes/config.js +81 -0
- package/dist/api/routes/config.js.map +1 -0
- package/dist/api/routes/providers.d.ts +2 -0
- package/dist/api/routes/providers.js +225 -0
- package/dist/api/routes/providers.js.map +1 -0
- package/dist/api/standalone-server.d.ts +12 -0
- package/dist/api/standalone-server.js +117 -0
- package/dist/api/standalone-server.js.map +1 -0
- package/dist/config/defaults.d.ts +17 -0
- package/dist/config/defaults.js +30 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/encryption.d.ts +12 -0
- package/dist/config/encryption.js +85 -0
- package/dist/config/encryption.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +62 -0
- package/dist/config/manager.js +210 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/prompts.d.ts +10 -0
- package/dist/config/prompts.js +168 -0
- package/dist/config/prompts.js.map +1 -0
- package/dist/config/schema.d.ts +141 -0
- package/dist/config/schema.js +54 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +260 -0
- package/dist/index.js.map +1 -0
- package/dist/installer/detector.d.ts +48 -0
- package/dist/installer/detector.js +164 -0
- package/dist/installer/detector.js.map +1 -0
- package/dist/installer/index.d.ts +7 -0
- package/dist/installer/index.js +10 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/installer.d.ts +16 -0
- package/dist/installer/installer.js +262 -0
- package/dist/installer/installer.js.map +1 -0
- package/dist/installer/tools.d.ts +16 -0
- package/dist/installer/tools.js +327 -0
- package/dist/installer/tools.js.map +1 -0
- package/dist/installer/types.d.ts +68 -0
- package/dist/installer/types.js +5 -0
- package/dist/installer/types.js.map +1 -0
- package/dist/providers/base.d.ts +44 -0
- package/dist/providers/base.js +84 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/deepseek.d.ts +30 -0
- package/dist/providers/deepseek.js +148 -0
- package/dist/providers/deepseek.js.map +1 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +30 -0
- package/dist/providers/openai.js +123 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +37 -0
- package/dist/providers/registry.js +65 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +71 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/server/conversation.d.ts +105 -0
- package/dist/server/conversation.js +279 -0
- package/dist/server/conversation.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/tools/consult.d.ts +15 -0
- package/dist/server/tools/consult.js +164 -0
- package/dist/server/tools/consult.js.map +1 -0
- package/dist/server/tools/index.d.ts +1 -0
- package/dist/server/tools/index.js +2 -0
- package/dist/server/tools/index.js.map +1 -0
- package/dist/types/config.d.ts +20 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/messages.d.ts +48 -0
- package/dist/types/messages.js +2 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/models.d.ts +39 -0
- package/dist/types/models.js +66 -0
- package/dist/types/models.js.map +1 -0
- package/dist/ui/index.html +1244 -0
- package/dist/utils/errors.d.ts +32 -0
- package/dist/utils/errors.js +53 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.js +73 -0
- package/dist/utils/logger.js.map +1 -0
- 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":"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"}
|
|
@@ -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;
|