agentdog 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +244 -0
- package/dist/adapters/adapter-factory.d.ts +21 -0
- package/dist/adapters/adapter-factory.d.ts.map +1 -0
- package/dist/adapters/adapter-factory.js +157 -0
- package/dist/adapters/adapter-factory.js.map +1 -0
- package/dist/adapters/http-sse-adapter.d.ts +49 -0
- package/dist/adapters/http-sse-adapter.d.ts.map +1 -0
- package/dist/adapters/http-sse-adapter.js +485 -0
- package/dist/adapters/http-sse-adapter.js.map +1 -0
- package/dist/adapters/stdio-adapter.d.ts +69 -0
- package/dist/adapters/stdio-adapter.d.ts.map +1 -0
- package/dist/adapters/stdio-adapter.js +664 -0
- package/dist/adapters/stdio-adapter.js.map +1 -0
- package/dist/adapters/streamable-http-adapter.d.ts +38 -0
- package/dist/adapters/streamable-http-adapter.d.ts.map +1 -0
- package/dist/adapters/streamable-http-adapter.js +321 -0
- package/dist/adapters/streamable-http-adapter.js.map +1 -0
- package/dist/ai-gateway/anthropic-errors.d.ts +4 -0
- package/dist/ai-gateway/anthropic-errors.d.ts.map +1 -0
- package/dist/ai-gateway/anthropic-errors.js +17 -0
- package/dist/ai-gateway/anthropic-errors.js.map +1 -0
- package/dist/ai-gateway/auth.d.ts +3 -0
- package/dist/ai-gateway/auth.d.ts.map +1 -0
- package/dist/ai-gateway/auth.js +14 -0
- package/dist/ai-gateway/auth.js.map +1 -0
- package/dist/ai-gateway/auth.test.d.ts +2 -0
- package/dist/ai-gateway/auth.test.d.ts.map +1 -0
- package/dist/ai-gateway/auth.test.js +57 -0
- package/dist/ai-gateway/auth.test.js.map +1 -0
- package/dist/ai-gateway/count-tokens.d.ts +5 -0
- package/dist/ai-gateway/count-tokens.d.ts.map +1 -0
- package/dist/ai-gateway/count-tokens.js +37 -0
- package/dist/ai-gateway/count-tokens.js.map +1 -0
- package/dist/ai-gateway/count-tokens.test.d.ts +2 -0
- package/dist/ai-gateway/count-tokens.test.d.ts.map +1 -0
- package/dist/ai-gateway/count-tokens.test.js +19 -0
- package/dist/ai-gateway/count-tokens.test.js.map +1 -0
- package/dist/ai-gateway/dialects.d.ts +4 -0
- package/dist/ai-gateway/dialects.d.ts.map +1 -0
- package/dist/ai-gateway/dialects.js +15 -0
- package/dist/ai-gateway/dialects.js.map +1 -0
- package/dist/ai-gateway/gateway-server.d.ts +15 -0
- package/dist/ai-gateway/gateway-server.d.ts.map +1 -0
- package/dist/ai-gateway/gateway-server.js +121 -0
- package/dist/ai-gateway/gateway-server.js.map +1 -0
- package/dist/ai-gateway/integration.test.d.ts +2 -0
- package/dist/ai-gateway/integration.test.d.ts.map +1 -0
- package/dist/ai-gateway/integration.test.js +205 -0
- package/dist/ai-gateway/integration.test.js.map +1 -0
- package/dist/ai-gateway/ir/anthropic-in.d.ts +3 -0
- package/dist/ai-gateway/ir/anthropic-in.d.ts.map +1 -0
- package/dist/ai-gateway/ir/anthropic-in.js +121 -0
- package/dist/ai-gateway/ir/anthropic-in.js.map +1 -0
- package/dist/ai-gateway/ir/anthropic-in.test.d.ts +2 -0
- package/dist/ai-gateway/ir/anthropic-in.test.d.ts.map +1 -0
- package/dist/ai-gateway/ir/anthropic-in.test.js +93 -0
- package/dist/ai-gateway/ir/anthropic-in.test.js.map +1 -0
- package/dist/ai-gateway/ir/anthropic-sse.d.ts +22 -0
- package/dist/ai-gateway/ir/anthropic-sse.d.ts.map +1 -0
- package/dist/ai-gateway/ir/anthropic-sse.js +200 -0
- package/dist/ai-gateway/ir/anthropic-sse.js.map +1 -0
- package/dist/ai-gateway/ir/anthropic-sse.test.d.ts +2 -0
- package/dist/ai-gateway/ir/anthropic-sse.test.d.ts.map +1 -0
- package/dist/ai-gateway/ir/anthropic-sse.test.js +101 -0
- package/dist/ai-gateway/ir/anthropic-sse.test.js.map +1 -0
- package/dist/ai-gateway/ir/gemini-out.d.ts +20 -0
- package/dist/ai-gateway/ir/gemini-out.d.ts.map +1 -0
- package/dist/ai-gateway/ir/gemini-out.js +218 -0
- package/dist/ai-gateway/ir/gemini-out.js.map +1 -0
- package/dist/ai-gateway/ir/gemini-out.test.d.ts +2 -0
- package/dist/ai-gateway/ir/gemini-out.test.d.ts.map +1 -0
- package/dist/ai-gateway/ir/gemini-out.test.js +125 -0
- package/dist/ai-gateway/ir/gemini-out.test.js.map +1 -0
- package/dist/ai-gateway/ir/openai-out.d.ts +17 -0
- package/dist/ai-gateway/ir/openai-out.d.ts.map +1 -0
- package/dist/ai-gateway/ir/openai-out.js +226 -0
- package/dist/ai-gateway/ir/openai-out.js.map +1 -0
- package/dist/ai-gateway/ir/openai-out.test.d.ts +2 -0
- package/dist/ai-gateway/ir/openai-out.test.d.ts.map +1 -0
- package/dist/ai-gateway/ir/openai-out.test.js +144 -0
- package/dist/ai-gateway/ir/openai-out.test.js.map +1 -0
- package/dist/ai-gateway/ir/types.d.ts +77 -0
- package/dist/ai-gateway/ir/types.d.ts.map +1 -0
- package/dist/ai-gateway/ir/types.js +4 -0
- package/dist/ai-gateway/ir/types.js.map +1 -0
- package/dist/ai-gateway/ir-channel.d.ts +15 -0
- package/dist/ai-gateway/ir-channel.d.ts.map +1 -0
- package/dist/ai-gateway/ir-channel.js +120 -0
- package/dist/ai-gateway/ir-channel.js.map +1 -0
- package/dist/ai-gateway/model-router.d.ts +11 -0
- package/dist/ai-gateway/model-router.d.ts.map +1 -0
- package/dist/ai-gateway/model-router.js +27 -0
- package/dist/ai-gateway/model-router.js.map +1 -0
- package/dist/ai-gateway/model-router.test.d.ts +2 -0
- package/dist/ai-gateway/model-router.test.d.ts.map +1 -0
- package/dist/ai-gateway/model-router.test.js +43 -0
- package/dist/ai-gateway/model-router.test.js.map +1 -0
- package/dist/ai-gateway/passthrough.d.ts +9 -0
- package/dist/ai-gateway/passthrough.d.ts.map +1 -0
- package/dist/ai-gateway/passthrough.js +81 -0
- package/dist/ai-gateway/passthrough.js.map +1 -0
- package/dist/ai-gateway/passthrough.test.d.ts +2 -0
- package/dist/ai-gateway/passthrough.test.d.ts.map +1 -0
- package/dist/ai-gateway/passthrough.test.js +108 -0
- package/dist/ai-gateway/passthrough.test.js.map +1 -0
- package/dist/ai-gateway/upstream/model-lister.d.ts +13 -0
- package/dist/ai-gateway/upstream/model-lister.d.ts.map +1 -0
- package/dist/ai-gateway/upstream/model-lister.js +61 -0
- package/dist/ai-gateway/upstream/model-lister.js.map +1 -0
- package/dist/ai-gateway/upstream/provider-client.d.ts +20 -0
- package/dist/ai-gateway/upstream/provider-client.d.ts.map +1 -0
- package/dist/ai-gateway/upstream/provider-client.js +76 -0
- package/dist/ai-gateway/upstream/provider-client.js.map +1 -0
- package/dist/ai-gateway/upstream/provider-client.test.d.ts +2 -0
- package/dist/ai-gateway/upstream/provider-client.test.d.ts.map +1 -0
- package/dist/ai-gateway/upstream/provider-client.test.js +69 -0
- package/dist/ai-gateway/upstream/provider-client.test.js.map +1 -0
- package/dist/cli/cli-main.d.ts +7 -0
- package/dist/cli/cli-main.d.ts.map +1 -0
- package/dist/cli/cli-main.js +116 -0
- package/dist/cli/cli-main.js.map +1 -0
- package/dist/cli/cli-router.d.ts +20 -0
- package/dist/cli/cli-router.d.ts.map +1 -0
- package/dist/cli/cli-router.js +271 -0
- package/dist/cli/cli-router.js.map +1 -0
- package/dist/cli/cli-utils.d.ts +30 -0
- package/dist/cli/cli-utils.d.ts.map +1 -0
- package/dist/cli/cli-utils.js +219 -0
- package/dist/cli/cli-utils.js.map +1 -0
- package/dist/cli/commands/audit-commands.d.ts +30 -0
- package/dist/cli/commands/audit-commands.d.ts.map +1 -0
- package/dist/cli/commands/audit-commands.js +417 -0
- package/dist/cli/commands/audit-commands.js.map +1 -0
- package/dist/cli/commands/autostart-command.d.ts +21 -0
- package/dist/cli/commands/autostart-command.d.ts.map +1 -0
- package/dist/cli/commands/autostart-command.js +243 -0
- package/dist/cli/commands/autostart-command.js.map +1 -0
- package/dist/cli/commands/autostart-command.test.d.ts +2 -0
- package/dist/cli/commands/autostart-command.test.d.ts.map +1 -0
- package/dist/cli/commands/autostart-command.test.js +35 -0
- package/dist/cli/commands/autostart-command.test.js.map +1 -0
- package/dist/cli/commands/config-commands.d.ts +30 -0
- package/dist/cli/commands/config-commands.d.ts.map +1 -0
- package/dist/cli/commands/config-commands.js +1013 -0
- package/dist/cli/commands/config-commands.js.map +1 -0
- package/dist/cli/commands/daemon-commands.d.ts +76 -0
- package/dist/cli/commands/daemon-commands.d.ts.map +1 -0
- package/dist/cli/commands/daemon-commands.js +451 -0
- package/dist/cli/commands/daemon-commands.js.map +1 -0
- package/dist/cli/commands/detect-commands.d.ts +17 -0
- package/dist/cli/commands/detect-commands.d.ts.map +1 -0
- package/dist/cli/commands/detect-commands.js +293 -0
- package/dist/cli/commands/detect-commands.js.map +1 -0
- package/dist/cli/commands/diagnose-commands.d.ts +19 -0
- package/dist/cli/commands/diagnose-commands.d.ts.map +1 -0
- package/dist/cli/commands/diagnose-commands.js +326 -0
- package/dist/cli/commands/diagnose-commands.js.map +1 -0
- package/dist/cli/commands/optimize-commands.d.ts +14 -0
- package/dist/cli/commands/optimize-commands.d.ts.map +1 -0
- package/dist/cli/commands/optimize-commands.js +189 -0
- package/dist/cli/commands/optimize-commands.js.map +1 -0
- package/dist/cli/commands/proxy-command.d.ts +27 -0
- package/dist/cli/commands/proxy-command.d.ts.map +1 -0
- package/dist/cli/commands/proxy-command.js +212 -0
- package/dist/cli/commands/proxy-command.js.map +1 -0
- package/dist/cli/commands/start-command.d.ts +22 -0
- package/dist/cli/commands/start-command.d.ts.map +1 -0
- package/dist/cli/commands/start-command.js +275 -0
- package/dist/cli/commands/start-command.js.map +1 -0
- package/dist/config/config-manager.d.ts +125 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +569 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/config-manager.test.d.ts +2 -0
- package/dist/config/config-manager.test.d.ts.map +1 -0
- package/dist/config/config-manager.test.js +209 -0
- package/dist/config/config-manager.test.js.map +1 -0
- package/dist/core/auto-config-generator.d.ts +55 -0
- package/dist/core/auto-config-generator.d.ts.map +1 -0
- package/dist/core/auto-config-generator.js +278 -0
- package/dist/core/auto-config-generator.js.map +1 -0
- package/dist/core/mcpdog-server.d.ts +49 -0
- package/dist/core/mcpdog-server.d.ts.map +1 -0
- package/dist/core/mcpdog-server.js +552 -0
- package/dist/core/mcpdog-server.js.map +1 -0
- package/dist/core/protocol-detector.d.ts +56 -0
- package/dist/core/protocol-detector.d.ts.map +1 -0
- package/dist/core/protocol-detector.js +365 -0
- package/dist/core/protocol-detector.js.map +1 -0
- package/dist/daemon/daemon-client.d.ts +34 -0
- package/dist/daemon/daemon-client.d.ts.map +1 -0
- package/dist/daemon/daemon-client.js +130 -0
- package/dist/daemon/daemon-client.js.map +1 -0
- package/dist/daemon/daemon-client.test.d.ts +2 -0
- package/dist/daemon/daemon-client.test.d.ts.map +1 -0
- package/dist/daemon/daemon-client.test.js +77 -0
- package/dist/daemon/daemon-client.test.js.map +1 -0
- package/dist/daemon/daemon-info.d.ts +7 -0
- package/dist/daemon/daemon-info.d.ts.map +1 -0
- package/dist/daemon/daemon-info.js +34 -0
- package/dist/daemon/daemon-info.js.map +1 -0
- package/dist/daemon/daemon-info.test.d.ts +2 -0
- package/dist/daemon/daemon-info.test.d.ts.map +1 -0
- package/dist/daemon/daemon-info.test.js +57 -0
- package/dist/daemon/daemon-info.test.js.map +1 -0
- package/dist/daemon/daemon-web-server.ai.test.d.ts +2 -0
- package/dist/daemon/daemon-web-server.ai.test.d.ts.map +1 -0
- package/dist/daemon/daemon-web-server.ai.test.js +119 -0
- package/dist/daemon/daemon-web-server.ai.test.js.map +1 -0
- package/dist/daemon/daemon-web-server.d.ts +59 -0
- package/dist/daemon/daemon-web-server.d.ts.map +1 -0
- package/dist/daemon/daemon-web-server.js +1236 -0
- package/dist/daemon/daemon-web-server.js.map +1 -0
- package/dist/daemon/daemon-web-server.test.d.ts +2 -0
- package/dist/daemon/daemon-web-server.test.d.ts.map +1 -0
- package/dist/daemon/daemon-web-server.test.js +93 -0
- package/dist/daemon/daemon-web-server.test.js.map +1 -0
- package/dist/daemon/mcpdog-daemon.d.ts +42 -0
- package/dist/daemon/mcpdog-daemon.d.ts.map +1 -0
- package/dist/daemon/mcpdog-daemon.js +302 -0
- package/dist/daemon/mcpdog-daemon.js.map +1 -0
- package/dist/daemon/stdio-proxy.d.ts +17 -0
- package/dist/daemon/stdio-proxy.d.ts.map +1 -0
- package/dist/daemon/stdio-proxy.js +143 -0
- package/dist/daemon/stdio-proxy.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +198 -0
- package/dist/index.js.map +1 -0
- package/dist/intent-analyzer.d.ts +27 -0
- package/dist/intent-analyzer.d.ts.map +1 -0
- package/dist/intent-analyzer.js +140 -0
- package/dist/intent-analyzer.js.map +1 -0
- package/dist/logging/server-log-manager.d.ts +75 -0
- package/dist/logging/server-log-manager.d.ts.map +1 -0
- package/dist/logging/server-log-manager.js +185 -0
- package/dist/logging/server-log-manager.js.map +1 -0
- package/dist/mcp-registry.d.ts +35 -0
- package/dist/mcp-registry.d.ts.map +1 -0
- package/dist/mcp-registry.js +166 -0
- package/dist/mcp-registry.js.map +1 -0
- package/dist/middleware/auth.d.ts +5 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +81 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/mock-tool-database.d.ts +41 -0
- package/dist/mock-tool-database.d.ts.map +1 -0
- package/dist/mock-tool-database.js +461 -0
- package/dist/mock-tool-database.js.map +1 -0
- package/dist/proxy-server-manager.d.ts +11 -0
- package/dist/proxy-server-manager.d.ts.map +1 -0
- package/dist/proxy-server-manager.js +144 -0
- package/dist/proxy-server-manager.js.map +1 -0
- package/dist/router/tool-router.d.ts +61 -0
- package/dist/router/tool-router.d.ts.map +1 -0
- package/dist/router/tool-router.js +539 -0
- package/dist/router/tool-router.js.map +1 -0
- package/dist/router/tool-router.test.d.ts +2 -0
- package/dist/router/tool-router.test.d.ts.map +1 -0
- package/dist/router/tool-router.test.js +113 -0
- package/dist/router/tool-router.test.js.map +1 -0
- package/dist/streamable-http-server.d.ts +27 -0
- package/dist/streamable-http-server.d.ts.map +1 -0
- package/dist/streamable-http-server.js +302 -0
- package/dist/streamable-http-server.js.map +1 -0
- package/dist/tool-finder.d.ts +21 -0
- package/dist/tool-finder.d.ts.map +1 -0
- package/dist/tool-finder.js +86 -0
- package/dist/tool-finder.js.map +1 -0
- package/dist/tool-recommender.d.ts +23 -0
- package/dist/tool-recommender.d.ts.map +1 -0
- package/dist/tool-recommender.js +200 -0
- package/dist/tool-recommender.js.map +1 -0
- package/dist/types/index.d.ts +145 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/server-name-validator.d.ts +47 -0
- package/dist/utils/server-name-validator.d.ts.map +1 -0
- package/dist/utils/server-name-validator.js +156 -0
- package/dist/utils/server-name-validator.js.map +1 -0
- package/dist/web/web-server.d.ts +44 -0
- package/dist/web/web-server.d.ts.map +1 -0
- package/dist/web/web-server.js +500 -0
- package/dist/web/web-server.js.map +1 -0
- package/package.json +68 -0
- package/web/dist/assets/index-DMVhVtNU.css +1 -0
- package/web/dist/assets/index-VMXIgcOH.js +92 -0
- package/web/dist/assets/index-VMXIgcOH.js.map +1 -0
- package/web/dist/index.html +14 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
export class ToolRecommendationEngine {
|
|
2
|
+
toolDatabase;
|
|
3
|
+
constructor(toolDatabase) {
|
|
4
|
+
this.toolDatabase = toolDatabase;
|
|
5
|
+
}
|
|
6
|
+
async getRecommendations(intent) {
|
|
7
|
+
// 1. Get relevant tools from database
|
|
8
|
+
const candidateTools = await this.toolDatabase.findToolsByCategory(intent.category);
|
|
9
|
+
if (candidateTools.length === 0) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
// 2. Calculate recommendation score for each tool
|
|
13
|
+
const recommendations = [];
|
|
14
|
+
for (const tool of candidateTools) {
|
|
15
|
+
const score = this.calculateRecommendationScore(tool, intent);
|
|
16
|
+
if (score > 0.3) { // Minimum recommendation threshold
|
|
17
|
+
const recommendation = {
|
|
18
|
+
tool,
|
|
19
|
+
score,
|
|
20
|
+
rating: this.calculateDisplayRating(tool, score),
|
|
21
|
+
reasoning: this.generateReasoning(tool, intent, score),
|
|
22
|
+
usageInstructions: this.generateUsageInstructions(tool, intent),
|
|
23
|
+
configurationSteps: this.generateConfigurationSteps(tool)
|
|
24
|
+
};
|
|
25
|
+
recommendations.push(recommendation);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// 3. Sort by score and return top 3
|
|
29
|
+
return recommendations
|
|
30
|
+
.sort((a, b) => b.score - a.score)
|
|
31
|
+
.slice(0, 3);
|
|
32
|
+
}
|
|
33
|
+
calculateRecommendationScore(tool, intent) {
|
|
34
|
+
let score = 0;
|
|
35
|
+
// Basic category matching
|
|
36
|
+
if (tool.category === intent.category) {
|
|
37
|
+
score += 0.4;
|
|
38
|
+
}
|
|
39
|
+
// Keyword matching
|
|
40
|
+
const toolKeywords = [
|
|
41
|
+
...tool.name.toLowerCase().split(/\s+/),
|
|
42
|
+
...tool.description.toLowerCase().split(/\s+/),
|
|
43
|
+
...tool.keywords
|
|
44
|
+
];
|
|
45
|
+
let keywordMatches = 0;
|
|
46
|
+
for (const keyword of intent.keywords) {
|
|
47
|
+
if (toolKeywords.some(tk => tk.includes(keyword.toLowerCase()) || keyword.toLowerCase().includes(tk))) {
|
|
48
|
+
keywordMatches++;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
score += (keywordMatches / intent.keywords.length) * 0.3;
|
|
52
|
+
// Tool function matching
|
|
53
|
+
const toolFunctions = tool.tools.map(t => t.name.toLowerCase());
|
|
54
|
+
for (const keyword of intent.keywords) {
|
|
55
|
+
if (toolFunctions.some(tf => tf.includes(keyword))) {
|
|
56
|
+
score += 0.2;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// User data availability bonus
|
|
60
|
+
if (this.hasRequiredData(tool, intent)) {
|
|
61
|
+
score += 0.1;
|
|
62
|
+
}
|
|
63
|
+
// Tool popularity and rating bonus
|
|
64
|
+
const popularityBonus = (tool.stats.users / 10000) * 0.05; // Normalized
|
|
65
|
+
const ratingBonus = (tool.stats.rating / 5) * 0.1;
|
|
66
|
+
score += Math.min(popularityBonus, 0.05) + ratingBonus;
|
|
67
|
+
// Configuration difficulty penalty
|
|
68
|
+
const difficultyPenalty = {
|
|
69
|
+
'easy': 0,
|
|
70
|
+
'medium': -0.05,
|
|
71
|
+
'hard': -0.1
|
|
72
|
+
};
|
|
73
|
+
score += difficultyPenalty[tool.complexity] || 0;
|
|
74
|
+
return Math.max(0, Math.min(1, score));
|
|
75
|
+
}
|
|
76
|
+
hasRequiredData(tool, intent) {
|
|
77
|
+
// Check if user provided key data required by the tool
|
|
78
|
+
const extracted = intent.extractedData;
|
|
79
|
+
if (tool.category === 'email') {
|
|
80
|
+
return !!(extracted.email || extracted.recipient);
|
|
81
|
+
}
|
|
82
|
+
if (tool.category === 'file') {
|
|
83
|
+
return !!(extracted.filename || extracted.url);
|
|
84
|
+
}
|
|
85
|
+
if (tool.category === 'database') {
|
|
86
|
+
return !!(extracted.database);
|
|
87
|
+
}
|
|
88
|
+
return true; // Other categories temporarily return true
|
|
89
|
+
}
|
|
90
|
+
calculateDisplayRating(tool, score) {
|
|
91
|
+
// Combine tool's own rating and recommendation score
|
|
92
|
+
const baseRating = tool.stats.rating;
|
|
93
|
+
const scoreBonus = score * 0.5; // Recommendation score also affects display rating
|
|
94
|
+
return Math.min(5, baseRating + scoreBonus);
|
|
95
|
+
}
|
|
96
|
+
generateReasoning(tool, intent, score) {
|
|
97
|
+
const reasons = [];
|
|
98
|
+
if (tool.category === intent.category) {
|
|
99
|
+
reasons.push(`Specifically designed for ${intent.category} functionality`);
|
|
100
|
+
}
|
|
101
|
+
if (score > 0.8) {
|
|
102
|
+
reasons.push("Highly matches your requirements");
|
|
103
|
+
}
|
|
104
|
+
else if (score > 0.6) {
|
|
105
|
+
reasons.push("Good match for your requirements");
|
|
106
|
+
}
|
|
107
|
+
if (tool.stats.users > 5000) {
|
|
108
|
+
reasons.push("Large user base, stable and reliable");
|
|
109
|
+
}
|
|
110
|
+
if (tool.stats.rating > 4.5) {
|
|
111
|
+
reasons.push("High user rating");
|
|
112
|
+
}
|
|
113
|
+
if (tool.complexity === 'easy') {
|
|
114
|
+
reasons.push("Simple configuration, easy to use");
|
|
115
|
+
}
|
|
116
|
+
if (this.hasRequiredData(tool, intent)) {
|
|
117
|
+
reasons.push("You have provided the required key information");
|
|
118
|
+
}
|
|
119
|
+
return reasons.length > 0 ? reasons.join(", ") : "Feature match";
|
|
120
|
+
}
|
|
121
|
+
generateUsageInstructions(tool, intent) {
|
|
122
|
+
const instructions = [];
|
|
123
|
+
// Basic usage instructions
|
|
124
|
+
instructions.push(`1. Ensure ${tool.name} is properly configured`);
|
|
125
|
+
// Specific tool call example
|
|
126
|
+
if (tool.tools.length > 0) {
|
|
127
|
+
const primaryTool = tool.tools[0];
|
|
128
|
+
const example = this.generateContextualExample(primaryTool, intent);
|
|
129
|
+
instructions.push(`2. Call main function: ${example}`);
|
|
130
|
+
}
|
|
131
|
+
// Category-specific guidance
|
|
132
|
+
if (tool.category === 'email') {
|
|
133
|
+
instructions.push("3. Check email sending status and logs");
|
|
134
|
+
if (intent.extractedData.email) {
|
|
135
|
+
instructions.push(`4. Confirm recipient email: ${intent.extractedData.email}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else if (tool.category === 'database') {
|
|
139
|
+
instructions.push("3. Test database connection");
|
|
140
|
+
instructions.push("4. Check query results");
|
|
141
|
+
}
|
|
142
|
+
else if (tool.category === 'file') {
|
|
143
|
+
instructions.push("3. Verify file path and permissions");
|
|
144
|
+
instructions.push("4. Check file processing results");
|
|
145
|
+
}
|
|
146
|
+
return instructions;
|
|
147
|
+
}
|
|
148
|
+
generateContextualExample(toolDef, intent) {
|
|
149
|
+
const params = { ...toolDef.exampleParams };
|
|
150
|
+
// Intelligently fill parameters based on user intent
|
|
151
|
+
if (intent.extractedData.email && params.to) {
|
|
152
|
+
params.to = intent.extractedData.email;
|
|
153
|
+
}
|
|
154
|
+
if (intent.extractedData.subject && params.subject) {
|
|
155
|
+
params.subject = intent.extractedData.subject;
|
|
156
|
+
}
|
|
157
|
+
if (intent.extractedData.message && (params.body || params.message)) {
|
|
158
|
+
if (params.body)
|
|
159
|
+
params.body = intent.extractedData.message;
|
|
160
|
+
if (params.message)
|
|
161
|
+
params.message = intent.extractedData.message;
|
|
162
|
+
}
|
|
163
|
+
if (intent.extractedData.filename && params.filename) {
|
|
164
|
+
params.filename = intent.extractedData.filename;
|
|
165
|
+
}
|
|
166
|
+
if (intent.extractedData.url && params.url) {
|
|
167
|
+
params.url = intent.extractedData.url;
|
|
168
|
+
}
|
|
169
|
+
return `${toolDef.name}(${JSON.stringify(params, null, 2)})`;
|
|
170
|
+
}
|
|
171
|
+
generateConfigurationSteps(tool) {
|
|
172
|
+
const steps = [];
|
|
173
|
+
// General configuration steps
|
|
174
|
+
steps.push(`1. Install ${tool.name}: npm install ${tool.id}`);
|
|
175
|
+
if (tool.envVars && tool.envVars.length > 0) {
|
|
176
|
+
steps.push(`2. Configure environment variables: ${tool.envVars.join(', ')}`);
|
|
177
|
+
}
|
|
178
|
+
// Category-specific configuration
|
|
179
|
+
switch (tool.category) {
|
|
180
|
+
case 'email':
|
|
181
|
+
steps.push("3. Configure SMTP server or API keys");
|
|
182
|
+
steps.push("4. Test email sending functionality");
|
|
183
|
+
break;
|
|
184
|
+
case 'database':
|
|
185
|
+
steps.push("3. Configure database connection parameters");
|
|
186
|
+
steps.push("4. Test database connection");
|
|
187
|
+
break;
|
|
188
|
+
case 'api':
|
|
189
|
+
steps.push("3. Obtain and configure API keys");
|
|
190
|
+
steps.push("4. Test API calls");
|
|
191
|
+
break;
|
|
192
|
+
default:
|
|
193
|
+
steps.push("3. Complete specific configuration according to documentation");
|
|
194
|
+
steps.push("4. Test basic functionality");
|
|
195
|
+
}
|
|
196
|
+
steps.push(`5. Add ${tool.name} to MCP client configuration`);
|
|
197
|
+
return steps;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=tool-recommender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-recommender.js","sourceRoot":"","sources":["../src/tool-recommender.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,wBAAwB;IACf;IAApB,YAAoB,YAA8B;QAA9B,iBAAY,GAAZ,YAAY,CAAkB;IAAG,CAAC;IAEtD,KAAK,CAAC,kBAAkB,CAAC,MAAkB;QACzC,sCAAsC;QACtC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEpF,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,kDAAkD;QAClD,MAAM,eAAe,GAAyB,EAAE,CAAC;QAEjD,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAE9D,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC,mCAAmC;gBACpD,MAAM,cAAc,GAAuB;oBACzC,IAAI;oBACJ,KAAK;oBACL,MAAM,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC;oBAChD,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;oBACtD,iBAAiB,EAAE,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC;oBAC/D,kBAAkB,EAAE,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC;iBAC1D,CAAC;gBAEF,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,OAAO,eAAe;aACnB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC;IAEO,4BAA4B,CAAC,IAAa,EAAE,MAAkB;QACpE,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,0BAA0B;QAC1B,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,KAAK,IAAI,GAAG,CAAC;QACf,CAAC;QAED,mBAAmB;QACnB,MAAM,YAAY,GAAG;YACnB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;YACvC,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;YAC9C,GAAG,IAAI,CAAC,QAAQ;SACjB,CAAC;QAEF,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACtG,cAAc,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAED,KAAK,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;QAEzD,yBAAyB;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAChE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACnD,KAAK,IAAI,GAAG,CAAC;YACf,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YACvC,KAAK,IAAI,GAAG,CAAC;QACf,CAAC;QAED,mCAAmC;QACnC,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,aAAa;QACxE,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QAClD,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC;QAEvD,mCAAmC;QACnC,MAAM,iBAAiB,GAAG;YACxB,MAAM,EAAE,CAAC;YACT,QAAQ,EAAE,CAAC,IAAI;YACf,MAAM,EAAE,CAAC,GAAG;SACb,CAAC;QACF,KAAK,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEjD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;IAEO,eAAe,CAAC,IAAa,EAAE,MAAkB;QACvD,uDAAuD;QACvD,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC;QAEvC,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACjC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,IAAI,CAAC,CAAC,2CAA2C;IAC1D,CAAC;IAEO,sBAAsB,CAAC,IAAa,EAAE,KAAa;QACzD,qDAAqD;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAC/B,MAAM,UAAU,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,mDAAmD;QACzF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;IAC9C,CAAC;IAEO,iBAAiB,CAAC,IAAa,EAAE,MAAkB,EAAE,KAAa;QACxE,MAAM,OAAO,GAAG,EAAE,CAAC;QAEnB,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,QAAQ,gBAAgB,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;IACnE,CAAC;IAEO,yBAAyB,CAAC,IAAa,EAAE,MAAkB;QACjE,MAAM,YAAY,GAAG,EAAE,CAAC;QAExB,2BAA2B;QAC3B,YAAY,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,yBAAyB,CAAC,CAAC;QAEnE,6BAA6B;QAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACpE,YAAY,CAAC,IAAI,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,6BAA6B;QAC7B,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC9B,YAAY,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YAC5D,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;gBAC/B,YAAY,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACxC,YAAY,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YACzC,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACzD,YAAY,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,yBAAyB,CAAC,OAAY,EAAE,MAAkB;QAChE,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAE5C,qDAAqD;QACrD,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;QACzC,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnD,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;QAChD,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACpE,IAAI,MAAM,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;YAC5D,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;QACpE,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrD,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;QAClD,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;QACxC,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC;IAC/D,CAAC;IAEO,0BAA0B,CAAC,IAAa;QAC9C,MAAM,KAAK,GAAG,EAAE,CAAC;QAEjB,8BAA8B;QACxB,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,iBAAiB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAEpE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,uCAAuC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,kCAAkC;QAClC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,OAAO;gBACV,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;gBAC5D,MAAM;YAER,KAAK,UAAU;gBACH,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBACpD,MAAM;YAER,KAAK,KAAK;gBACE,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBAC1C,MAAM;YAER;gBACE,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;gBAC5E,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC9C,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,8BAA8B,CAAC,CAAC;QAE9D,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
export interface MCPServerConfig {
|
|
3
|
+
name: string;
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
transport: 'stdio' | 'http-sse' | 'streamable-http';
|
|
6
|
+
description?: string;
|
|
7
|
+
command?: string;
|
|
8
|
+
args?: string[];
|
|
9
|
+
cwd?: string;
|
|
10
|
+
env?: Record<string, string>;
|
|
11
|
+
endpoint?: string;
|
|
12
|
+
url?: string;
|
|
13
|
+
apiKey?: string;
|
|
14
|
+
headers?: Record<string, string>;
|
|
15
|
+
adminUrl?: string;
|
|
16
|
+
sseReconnectInterval?: number;
|
|
17
|
+
httpKeepAlive?: boolean;
|
|
18
|
+
sseEndpoint?: string;
|
|
19
|
+
maxChunkSize?: number;
|
|
20
|
+
streamTimeout?: number;
|
|
21
|
+
streamEndpoint?: string;
|
|
22
|
+
sessionMode?: 'auto' | 'required' | 'disabled';
|
|
23
|
+
toolsConfig?: {
|
|
24
|
+
mode: 'all' | 'whitelist' | 'blacklist';
|
|
25
|
+
enabledTools?: string[];
|
|
26
|
+
disabledTools?: string[];
|
|
27
|
+
toolSettings?: Record<string, {
|
|
28
|
+
enabled: boolean;
|
|
29
|
+
alias?: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
}>;
|
|
32
|
+
};
|
|
33
|
+
timeout?: number;
|
|
34
|
+
retries?: number;
|
|
35
|
+
enabledTools?: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface MCPDogConfig {
|
|
38
|
+
version: string;
|
|
39
|
+
servers: Record<string, MCPServerConfig>;
|
|
40
|
+
web?: {
|
|
41
|
+
enabled: boolean;
|
|
42
|
+
port: number;
|
|
43
|
+
host: string;
|
|
44
|
+
};
|
|
45
|
+
logging?: {
|
|
46
|
+
level: 'error' | 'warn' | 'info' | 'debug';
|
|
47
|
+
file?: string;
|
|
48
|
+
};
|
|
49
|
+
aiGateway?: AIGatewayConfig;
|
|
50
|
+
providers?: AIProviderConfig[];
|
|
51
|
+
}
|
|
52
|
+
export interface AIProviderConfig {
|
|
53
|
+
id: string;
|
|
54
|
+
slug: string;
|
|
55
|
+
name?: string;
|
|
56
|
+
dialect: 'openai' | 'anthropic' | 'gemini';
|
|
57
|
+
baseUrl: string;
|
|
58
|
+
apiKey: string;
|
|
59
|
+
enabled: boolean;
|
|
60
|
+
models?: string[];
|
|
61
|
+
headers?: Record<string, string>;
|
|
62
|
+
}
|
|
63
|
+
export interface AIGatewayConfig {
|
|
64
|
+
enabled: boolean;
|
|
65
|
+
port: number;
|
|
66
|
+
host: string;
|
|
67
|
+
apiKey: string;
|
|
68
|
+
}
|
|
69
|
+
export interface MCPTool {
|
|
70
|
+
name: string;
|
|
71
|
+
description: string;
|
|
72
|
+
inputSchema: {
|
|
73
|
+
type: string;
|
|
74
|
+
properties?: Record<string, any>;
|
|
75
|
+
required?: string[];
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export interface MCPRequest {
|
|
79
|
+
jsonrpc: '2.0';
|
|
80
|
+
id: string | number;
|
|
81
|
+
method: string;
|
|
82
|
+
params?: any;
|
|
83
|
+
}
|
|
84
|
+
export interface MCPNotificationRequest {
|
|
85
|
+
jsonrpc: '2.0';
|
|
86
|
+
method: string;
|
|
87
|
+
params?: any;
|
|
88
|
+
}
|
|
89
|
+
export type MCPMessage = MCPRequest | MCPNotificationRequest;
|
|
90
|
+
export interface MCPResponse {
|
|
91
|
+
jsonrpc: '2.0';
|
|
92
|
+
id: string | number;
|
|
93
|
+
result?: any;
|
|
94
|
+
error?: {
|
|
95
|
+
code: number;
|
|
96
|
+
message: string;
|
|
97
|
+
data?: any;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export interface MCPNotification {
|
|
101
|
+
jsonrpc: '2.0';
|
|
102
|
+
method: string;
|
|
103
|
+
params?: any;
|
|
104
|
+
}
|
|
105
|
+
export interface ServerAdapter extends EventEmitter {
|
|
106
|
+
name: string;
|
|
107
|
+
config: MCPServerConfig;
|
|
108
|
+
isConnected: boolean;
|
|
109
|
+
connect(): Promise<void>;
|
|
110
|
+
disconnect(): Promise<void>;
|
|
111
|
+
getTools(): Promise<MCPTool[]>;
|
|
112
|
+
callTool(name: string, args: any): Promise<MCPResponse>;
|
|
113
|
+
sendRequest(request: MCPRequest): Promise<MCPResponse>;
|
|
114
|
+
}
|
|
115
|
+
export interface ClientCapabilities {
|
|
116
|
+
supportsNotifications: boolean;
|
|
117
|
+
clientName: string;
|
|
118
|
+
clientVersion: string;
|
|
119
|
+
}
|
|
120
|
+
export type MCPDogEvents = {
|
|
121
|
+
'server-connected': {
|
|
122
|
+
serverName: string;
|
|
123
|
+
};
|
|
124
|
+
'server-disconnected': {
|
|
125
|
+
serverName: string;
|
|
126
|
+
error?: Error;
|
|
127
|
+
};
|
|
128
|
+
'tools-changed': {
|
|
129
|
+
serverName?: string;
|
|
130
|
+
};
|
|
131
|
+
'config-updated': {
|
|
132
|
+
config: MCPDogConfig;
|
|
133
|
+
};
|
|
134
|
+
'tool-called': {
|
|
135
|
+
serverName: string;
|
|
136
|
+
toolName: string;
|
|
137
|
+
args: any;
|
|
138
|
+
result: any;
|
|
139
|
+
};
|
|
140
|
+
'error': {
|
|
141
|
+
error: Error;
|
|
142
|
+
context?: string;
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server Name Validator
|
|
3
|
+
* Provides unified validation and naming conventions for MCP server names
|
|
4
|
+
*/
|
|
5
|
+
export interface ServerNameValidationResult {
|
|
6
|
+
valid: boolean;
|
|
7
|
+
error?: string;
|
|
8
|
+
suggestions?: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare class ServerNameValidator {
|
|
11
|
+
private static readonly SERVER_NAME_PATTERN;
|
|
12
|
+
private static readonly MAX_NAME_LENGTH;
|
|
13
|
+
private static readonly MIN_NAME_LENGTH;
|
|
14
|
+
/**
|
|
15
|
+
* Validate server name according to best practices
|
|
16
|
+
*/
|
|
17
|
+
static validateServerName(name: string): ServerNameValidationResult;
|
|
18
|
+
/**
|
|
19
|
+
* Generate suggestions for invalid server names
|
|
20
|
+
*/
|
|
21
|
+
private static generateSuggestions;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a name is reserved
|
|
24
|
+
*/
|
|
25
|
+
private static isReservedName;
|
|
26
|
+
/**
|
|
27
|
+
* Generate a unique server name based on base name and existing names
|
|
28
|
+
*/
|
|
29
|
+
static generateUniqueName(baseName: string, existingNames: string[]): string;
|
|
30
|
+
/**
|
|
31
|
+
* Normalize server name (convert to valid format)
|
|
32
|
+
*/
|
|
33
|
+
static normalizeServerName(name: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Check if server name conflicts with existing names
|
|
36
|
+
*/
|
|
37
|
+
static checkNameConflict(name: string, existingNames: string[]): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Get all validation errors for multiple server names
|
|
40
|
+
*/
|
|
41
|
+
static validateMultipleNames(names: string[]): {
|
|
42
|
+
valid: boolean;
|
|
43
|
+
errors: string[];
|
|
44
|
+
conflicts: string[];
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=server-name-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-name-validator.d.ts","sourceRoot":"","sources":["../../src/utils/server-name-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,mBAAmB;IAE9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAGlE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAM;IAG7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAK;IAE5C;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,0BAA0B;IA6CnE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAqClC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAU7B;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM;IAgB5E;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAShD;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO;IAIxE;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;QAC7C,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB;CAyBF"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server Name Validator
|
|
3
|
+
* Provides unified validation and naming conventions for MCP server names
|
|
4
|
+
*/
|
|
5
|
+
export class ServerNameValidator {
|
|
6
|
+
// Server name regex pattern - only letters, numbers, hyphens, and underscores
|
|
7
|
+
static SERVER_NAME_PATTERN = /^[a-zA-Z0-9\-_]+$/;
|
|
8
|
+
// Maximum length for server names
|
|
9
|
+
static MAX_NAME_LENGTH = 50;
|
|
10
|
+
// Minimum length for server names
|
|
11
|
+
static MIN_NAME_LENGTH = 1;
|
|
12
|
+
/**
|
|
13
|
+
* Validate server name according to best practices
|
|
14
|
+
*/
|
|
15
|
+
static validateServerName(name) {
|
|
16
|
+
// Check if name is empty
|
|
17
|
+
if (!name || name.trim() === '') {
|
|
18
|
+
return {
|
|
19
|
+
valid: false,
|
|
20
|
+
error: 'Server name cannot be empty'
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// Check minimum length
|
|
24
|
+
if (name.length < this.MIN_NAME_LENGTH) {
|
|
25
|
+
return {
|
|
26
|
+
valid: false,
|
|
27
|
+
error: `Server name must be at least ${this.MIN_NAME_LENGTH} character long`
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// Check maximum length
|
|
31
|
+
if (name.length > this.MAX_NAME_LENGTH) {
|
|
32
|
+
return {
|
|
33
|
+
valid: false,
|
|
34
|
+
error: `Server name too long (max ${this.MAX_NAME_LENGTH} characters)`
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// Check pattern (only letters, numbers, hyphens, and underscores)
|
|
38
|
+
if (!this.SERVER_NAME_PATTERN.test(name)) {
|
|
39
|
+
return {
|
|
40
|
+
valid: false,
|
|
41
|
+
error: 'Server name can only contain letters, numbers, hyphens, and underscores',
|
|
42
|
+
suggestions: this.generateSuggestions(name)
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Check for reserved names
|
|
46
|
+
if (this.isReservedName(name)) {
|
|
47
|
+
return {
|
|
48
|
+
valid: false,
|
|
49
|
+
error: `"${name}" is a reserved name and cannot be used`
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return { valid: true };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generate suggestions for invalid server names
|
|
56
|
+
*/
|
|
57
|
+
static generateSuggestions(invalidName) {
|
|
58
|
+
const suggestions = [];
|
|
59
|
+
// Remove special characters and replace with hyphens
|
|
60
|
+
let cleaned = invalidName
|
|
61
|
+
.replace(/[^a-zA-Z0-9\-_]/g, '-')
|
|
62
|
+
.replace(/-+/g, '-')
|
|
63
|
+
.replace(/^-|-$/g, '');
|
|
64
|
+
if (cleaned && this.SERVER_NAME_PATTERN.test(cleaned)) {
|
|
65
|
+
suggestions.push(cleaned);
|
|
66
|
+
}
|
|
67
|
+
// Convert to lowercase and replace spaces with hyphens
|
|
68
|
+
let lowerCase = invalidName
|
|
69
|
+
.toLowerCase()
|
|
70
|
+
.replace(/\s+/g, '-')
|
|
71
|
+
.replace(/[^a-z0-9\-_]/g, '');
|
|
72
|
+
if (lowerCase && this.SERVER_NAME_PATTERN.test(lowerCase)) {
|
|
73
|
+
suggestions.push(lowerCase);
|
|
74
|
+
}
|
|
75
|
+
// Add common patterns
|
|
76
|
+
if (invalidName.includes(' ')) {
|
|
77
|
+
const words = invalidName.split(/\s+/).filter(word => word.length > 0);
|
|
78
|
+
if (words.length > 0) {
|
|
79
|
+
const joined = words.join('-').toLowerCase().replace(/[^a-z0-9\-_]/g, '');
|
|
80
|
+
if (joined && this.SERVER_NAME_PATTERN.test(joined)) {
|
|
81
|
+
suggestions.push(joined);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return suggestions.slice(0, 3); // Limit to 3 suggestions
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if a name is reserved
|
|
89
|
+
*/
|
|
90
|
+
static isReservedName(name) {
|
|
91
|
+
const reservedNames = [
|
|
92
|
+
'config', 'settings', 'system', 'admin', 'root', 'default',
|
|
93
|
+
'test', 'temp', 'tmp', 'backup', 'old', 'new',
|
|
94
|
+
'server', 'client', 'api', 'web', 'app', 'service'
|
|
95
|
+
];
|
|
96
|
+
return reservedNames.includes(name.toLowerCase());
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Generate a unique server name based on base name and existing names
|
|
100
|
+
*/
|
|
101
|
+
static generateUniqueName(baseName, existingNames) {
|
|
102
|
+
if (!existingNames.includes(baseName)) {
|
|
103
|
+
return baseName;
|
|
104
|
+
}
|
|
105
|
+
let counter = 1;
|
|
106
|
+
let newName = `${baseName}-${counter}`;
|
|
107
|
+
while (existingNames.includes(newName)) {
|
|
108
|
+
counter++;
|
|
109
|
+
newName = `${baseName}-${counter}`;
|
|
110
|
+
}
|
|
111
|
+
return newName;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Normalize server name (convert to valid format)
|
|
115
|
+
*/
|
|
116
|
+
static normalizeServerName(name) {
|
|
117
|
+
return name
|
|
118
|
+
.toLowerCase()
|
|
119
|
+
.replace(/[^a-z0-9\-_]/g, '-')
|
|
120
|
+
.replace(/-+/g, '-')
|
|
121
|
+
.replace(/^-|-$/g, '')
|
|
122
|
+
.substring(0, this.MAX_NAME_LENGTH);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Check if server name conflicts with existing names
|
|
126
|
+
*/
|
|
127
|
+
static checkNameConflict(name, existingNames) {
|
|
128
|
+
return existingNames.includes(name);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get all validation errors for multiple server names
|
|
132
|
+
*/
|
|
133
|
+
static validateMultipleNames(names) {
|
|
134
|
+
const errors = [];
|
|
135
|
+
const conflicts = [];
|
|
136
|
+
const seenNames = new Set();
|
|
137
|
+
for (const name of names) {
|
|
138
|
+
const validation = this.validateServerName(name);
|
|
139
|
+
if (!validation.valid) {
|
|
140
|
+
errors.push(`"${name}": ${validation.error}`);
|
|
141
|
+
}
|
|
142
|
+
if (seenNames.has(name)) {
|
|
143
|
+
conflicts.push(name);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
seenNames.add(name);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
valid: errors.length === 0 && conflicts.length === 0,
|
|
151
|
+
errors,
|
|
152
|
+
conflicts
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=server-name-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-name-validator.js","sourceRoot":"","sources":["../../src/utils/server-name-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCPDog Web Management Interface Server
|
|
3
|
+
* Provides REST API and WebSocket real-time communication
|
|
4
|
+
*/
|
|
5
|
+
export interface WebServerOptions {
|
|
6
|
+
port: number;
|
|
7
|
+
configPath?: string;
|
|
8
|
+
staticPath?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class MCPDogWebServer {
|
|
11
|
+
private app;
|
|
12
|
+
private server;
|
|
13
|
+
private io;
|
|
14
|
+
private mcpServer;
|
|
15
|
+
private configManager;
|
|
16
|
+
private port;
|
|
17
|
+
constructor(options: WebServerOptions);
|
|
18
|
+
private setupMiddleware;
|
|
19
|
+
private createAPIRouter;
|
|
20
|
+
private setupRoutes;
|
|
21
|
+
private setupWebSocket;
|
|
22
|
+
private setupMCPServerEvents;
|
|
23
|
+
private handleGetStatus;
|
|
24
|
+
private handleGetServers;
|
|
25
|
+
private handleGetTools;
|
|
26
|
+
private handleCallTool;
|
|
27
|
+
private handleGetConfig;
|
|
28
|
+
private sendStatusUpdate;
|
|
29
|
+
private broadcastStatusUpdate;
|
|
30
|
+
private handleAddServer;
|
|
31
|
+
private handleUpdateServer;
|
|
32
|
+
private handleRemoveServer;
|
|
33
|
+
private handleToggleServer;
|
|
34
|
+
private handleUpdateConfig;
|
|
35
|
+
start(): Promise<void>;
|
|
36
|
+
private startMCPServerInBackground;
|
|
37
|
+
stop(): Promise<void>;
|
|
38
|
+
private handleGetAllLogs;
|
|
39
|
+
private handleGetServerLogs;
|
|
40
|
+
private handleGetServerStats;
|
|
41
|
+
private handleClearServerLogs;
|
|
42
|
+
private handleExportServerLogs;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=web-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-server.d.ts","sourceRoot":"","sources":["../../src/web/web-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,IAAI,CAAS;gBAET,OAAO,EAAE,gBAAgB;IAqBrC,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,oBAAoB;YAyCd,eAAe;YAgCf,gBAAgB;YA8BhB,cAAc;YAsBd,cAAc;YAiBd,eAAe;YAaf,gBAAgB;IA8B9B,OAAO,CAAC,qBAAqB;YAOf,eAAe;YAef,kBAAkB;YAgBlB,kBAAkB;YAelB,kBAAkB;YAgBlB,kBAAkB;IAoB1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBd,0BAA0B;IAWlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBb,gBAAgB;YAiBhB,mBAAmB;YAmCnB,oBAAoB;YAqBpB,qBAAqB;YAerB,sBAAsB;CAkBrC"}
|