@visorcraft/idlehands 2.2.8 → 2.2.10
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/dist/agent/compaction-scoring.js +113 -0
- package/dist/agent/compaction-scoring.js.map +1 -0
- package/dist/agent/tools-schema.js +97 -0
- package/dist/agent/tools-schema.js.map +1 -1
- package/dist/agent.js +86 -4
- package/dist/agent.js.map +1 -1
- package/dist/bot/command-logic.js +1 -0
- package/dist/bot/command-logic.js.map +1 -1
- package/dist/bot/commands.js +12 -1
- package/dist/bot/commands.js.map +1 -1
- package/dist/bot/discord-commands.js +5 -1
- package/dist/bot/discord-commands.js.map +1 -1
- package/dist/bot/mcp-discover-command.js +35 -0
- package/dist/bot/mcp-discover-command.js.map +1 -0
- package/dist/bot/telegram.js +2 -1
- package/dist/bot/telegram.js.map +1 -1
- package/dist/mcp-discovery.js +104 -0
- package/dist/mcp-discovery.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Auto-Discovery
|
|
3
|
+
*
|
|
4
|
+
* Scans for common MCP configuration files in a project directory
|
|
5
|
+
* and returns discovered server configurations.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'node:fs/promises';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
/** Well-known MCP config file locations (relative to project root). */
|
|
10
|
+
const MCP_CONFIG_FILES = [
|
|
11
|
+
'.mcp.json',
|
|
12
|
+
'.mcp/config.json',
|
|
13
|
+
'mcp.json',
|
|
14
|
+
'.cursor/mcp.json',
|
|
15
|
+
'.vscode/mcp.json',
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* Scan a project directory for MCP server configurations.
|
|
19
|
+
*/
|
|
20
|
+
export async function discoverMcpServers(projectDir) {
|
|
21
|
+
const servers = [];
|
|
22
|
+
for (const relPath of MCP_CONFIG_FILES) {
|
|
23
|
+
const fullPath = path.join(projectDir, relPath);
|
|
24
|
+
try {
|
|
25
|
+
const raw = await fs.readFile(fullPath, 'utf8');
|
|
26
|
+
const parsed = JSON.parse(raw);
|
|
27
|
+
const found = extractServers(parsed, relPath);
|
|
28
|
+
servers.push(...found);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// File doesn't exist or isn't valid JSON — skip
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Also check package.json for mcp field
|
|
35
|
+
try {
|
|
36
|
+
const pkgPath = path.join(projectDir, 'package.json');
|
|
37
|
+
const raw = await fs.readFile(pkgPath, 'utf8');
|
|
38
|
+
const pkg = JSON.parse(raw);
|
|
39
|
+
if (pkg.mcp?.servers) {
|
|
40
|
+
const found = extractServers(pkg.mcp, 'package.json#mcp');
|
|
41
|
+
servers.push(...found);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// No package.json or no mcp field — skip
|
|
46
|
+
}
|
|
47
|
+
return servers;
|
|
48
|
+
}
|
|
49
|
+
function extractServers(config, source) {
|
|
50
|
+
const servers = [];
|
|
51
|
+
// Format 1: { servers: { name: { command, args, ... } } }
|
|
52
|
+
if (config?.servers && typeof config.servers === 'object') {
|
|
53
|
+
for (const [name, def] of Object.entries(config.servers)) {
|
|
54
|
+
const server = parseServerDef(name, def, source);
|
|
55
|
+
if (server)
|
|
56
|
+
servers.push(server);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Format 2: { mcpServers: { name: { ... } } } (Cursor/VSCode format)
|
|
60
|
+
if (config?.mcpServers && typeof config.mcpServers === 'object') {
|
|
61
|
+
for (const [name, def] of Object.entries(config.mcpServers)) {
|
|
62
|
+
const server = parseServerDef(name, def, source);
|
|
63
|
+
if (server)
|
|
64
|
+
servers.push(server);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return servers;
|
|
68
|
+
}
|
|
69
|
+
function parseServerDef(name, def, source) {
|
|
70
|
+
if (!def || typeof def !== 'object')
|
|
71
|
+
return null;
|
|
72
|
+
// SSE transport
|
|
73
|
+
if (def.url || def.transport === 'sse') {
|
|
74
|
+
return {
|
|
75
|
+
name,
|
|
76
|
+
transport: 'sse',
|
|
77
|
+
url: def.url,
|
|
78
|
+
source,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Stdio transport
|
|
82
|
+
if (def.command) {
|
|
83
|
+
return {
|
|
84
|
+
name,
|
|
85
|
+
transport: 'stdio',
|
|
86
|
+
command: def.command,
|
|
87
|
+
args: Array.isArray(def.args) ? def.args : [],
|
|
88
|
+
source,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Format discovered servers for display.
|
|
95
|
+
*/
|
|
96
|
+
export function formatDiscoveredServers(servers) {
|
|
97
|
+
if (!servers.length)
|
|
98
|
+
return ['No MCP servers discovered.'];
|
|
99
|
+
return servers.map((s) => {
|
|
100
|
+
const transport = s.transport === 'sse' ? `SSE ${s.url}` : `stdio: ${s.command} ${(s.args ?? []).join(' ')}`;
|
|
101
|
+
return ` • ${s.name} (${transport}) [${s.source}]`;
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=mcp-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-discovery.js","sourceRoot":"","sources":["../src/mcp-discovery.ts"],"names":[],"mappings":"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"}
|