@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.
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visorcraft/idlehands",
3
- "version": "2.2.8",
3
+ "version": "2.2.10",
4
4
  "type": "module",
5
5
  "description": "Local-first coding agent CLI for OpenAI-compatible endpoints",
6
6
  "license": "MIT",