daedalus-cli 1.16.0 → 1.18.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.
@@ -0,0 +1,183 @@
1
+ // MCP Server Manager — discover, install, and manage MCP servers via the official registry
2
+ import { loadConfig, saveConfig } from '../../config/index.js';
3
+ const REGISTRY_BASE = 'https://registry.modelcontextprotocol.io';
4
+ const REGISTRY_TIMEOUT = 10_000;
5
+ // ── Registry API ────────────────────────────────────────────────
6
+ function registryFetch(path) {
7
+ const url = `${REGISTRY_BASE}${path}`;
8
+ return fetch(url, { signal: AbortSignal.timeout(REGISTRY_TIMEOUT) });
9
+ }
10
+ /** Collect up to `limit` latest-is-true servers from the registry */
11
+ export async function fetchAllServers(limit = 100) {
12
+ const seen = new Map();
13
+ let cursor;
14
+ const perPage = Math.min(limit, 100);
15
+ while (seen.size < limit) {
16
+ const cursorParam = cursor ? `&cursor=${encodeURIComponent(cursor)}` : '';
17
+ const resp = await registryFetch(`/v0.1/servers?limit=${perPage}${cursorParam}`);
18
+ if (!resp.ok)
19
+ throw new Error(`Registry API error: ${resp.status}`);
20
+ const data = (await resp.json());
21
+ for (const entry of data.servers) {
22
+ const s = entry.server;
23
+ // Only keep the latest-is-true version of each server
24
+ const meta = entry._meta?.['io.modelcontextprotocol.registry/official'];
25
+ if (meta?.isLatest && !seen.has(s.name)) {
26
+ seen.set(s.name, s);
27
+ }
28
+ }
29
+ if (!data.metadata.nextCursor)
30
+ break;
31
+ cursor = data.metadata.nextCursor;
32
+ }
33
+ return Array.from(seen.values());
34
+ }
35
+ /** Search the registry by keyword (matches name, title, description) */
36
+ export async function searchRegistry(query, limit = 20) {
37
+ const all = await fetchAllServers(limit * 3); // fetch more for filtering
38
+ const q = query.toLowerCase();
39
+ const scored = all
40
+ .filter(s => {
41
+ const name = s.name.toLowerCase();
42
+ const title = (s.title || '').toLowerCase();
43
+ const desc = s.description.toLowerCase();
44
+ return name.includes(q) || title.includes(q) || desc.includes(q);
45
+ })
46
+ .map(s => {
47
+ let score = 0;
48
+ const name = s.name.toLowerCase();
49
+ const title = (s.title || '').toLowerCase();
50
+ if (name === q)
51
+ score += 100;
52
+ else if (name.includes(q))
53
+ score += 50;
54
+ if (title === q)
55
+ score += 80;
56
+ else if (title.includes(q))
57
+ score += 30;
58
+ if (s.description.toLowerCase().includes(q))
59
+ score += 10;
60
+ return { server: s, score };
61
+ })
62
+ .sort((a, b) => b.score - a.score);
63
+ return scored.slice(0, limit).map(s => s.server);
64
+ }
65
+ /** Get the latest version of a specific server by name */
66
+ export async function fetchServerByName(name) {
67
+ const encoded = encodeURIComponent(name);
68
+ const resp = await registryFetch(`/v0.1/servers/${encoded}/versions/latest`);
69
+ if (resp.status === 404)
70
+ return null;
71
+ if (!resp.ok)
72
+ throw new Error(`Registry API error: ${resp.status}`);
73
+ const data = (await resp.json());
74
+ return data.server;
75
+ }
76
+ /** Build a Daedalus MCP server config from a registry entry */
77
+ export function registryEntryToConfig(entry) {
78
+ const shortName = entry.name.includes('/') ? entry.name.split('/').pop() : entry.name;
79
+ // Prefer packages (local install) over remotes (remote URL)
80
+ if (entry.packages && entry.packages.length > 0) {
81
+ const pkg = entry.packages[0];
82
+ const [command, ...args] = packageToCommand(pkg);
83
+ if (!command)
84
+ return null;
85
+ return {
86
+ name: shortName,
87
+ transport: 'stdio',
88
+ command,
89
+ args,
90
+ enabled: true,
91
+ };
92
+ }
93
+ // Fall back to remote endpoint
94
+ if (entry.remotes && entry.remotes.length > 0) {
95
+ const remote = entry.remotes[0];
96
+ const headers = {};
97
+ if (remote.headers) {
98
+ for (const h of remote.headers) {
99
+ if (h.isRequired && !h.isSecret) {
100
+ headers[h.name] = '';
101
+ }
102
+ }
103
+ }
104
+ return {
105
+ name: shortName,
106
+ transport: 'http',
107
+ url: remote.url,
108
+ headers: Object.keys(headers).length > 0 ? headers : undefined,
109
+ enabled: true,
110
+ };
111
+ }
112
+ return null;
113
+ }
114
+ function packageToCommand(pkg) {
115
+ switch (pkg.registryType) {
116
+ case 'npm':
117
+ return ['npx', '-y', pkg.identifier];
118
+ case 'pypi':
119
+ return ['uvx', pkg.identifier];
120
+ case 'go':
121
+ return ['go', 'run', pkg.identifier];
122
+ default:
123
+ return [];
124
+ }
125
+ }
126
+ // ── Config file operations ──────────────────────────────────────
127
+ /** Add an MCP server config to the Daedalus config file */
128
+ export function addServerToConfig(config) {
129
+ const cfg = loadConfig();
130
+ const servers = cfg.tools.mcpServers;
131
+ if (servers[config.name]) {
132
+ return { success: false, message: `Server "${config.name}" is already installed. Use /mcp remove first or edit config.json directly.` };
133
+ }
134
+ const entry = {
135
+ transport: config.transport,
136
+ enabled: config.enabled,
137
+ };
138
+ if (config.transport === 'stdio') {
139
+ entry.command = config.command;
140
+ entry.args = config.args;
141
+ }
142
+ else {
143
+ entry.url = config.url;
144
+ if (config.headers)
145
+ entry.headers = config.headers;
146
+ }
147
+ servers[config.name] = entry;
148
+ saveConfig(cfg);
149
+ return { success: true, message: `Installed MCP server: ${config.name}` };
150
+ }
151
+ /** Remove an MCP server from the config */
152
+ export function removeServerFromConfig(name) {
153
+ const cfg = loadConfig();
154
+ const servers = cfg.tools.mcpServers;
155
+ if (!servers[name]) {
156
+ return { success: false, message: `Server "${name}" is not installed.` };
157
+ }
158
+ delete servers[name];
159
+ saveConfig(cfg);
160
+ return { success: true, message: `Removed MCP server: ${name}` };
161
+ }
162
+ /** List installed MCP servers */
163
+ export function listInstalledServers() {
164
+ const cfg = loadConfig();
165
+ const servers = cfg.tools.mcpServers;
166
+ return Object.entries(servers).map(([name, s]) => ({
167
+ name,
168
+ transport: s.transport || 'unknown',
169
+ enabled: s.enabled !== false,
170
+ }));
171
+ }
172
+ /** Toggle an MCP server on/off */
173
+ export function toggleServer(name, enabled) {
174
+ const cfg = loadConfig();
175
+ const servers = cfg.tools.mcpServers;
176
+ if (!servers[name]) {
177
+ return { success: false, message: `Server "${name}" is not installed.` };
178
+ }
179
+ servers[name].enabled = enabled;
180
+ saveConfig(cfg);
181
+ return { success: true, message: `${enabled ? 'Enabled' : 'Disabled'} MCP server: ${name}` };
182
+ }
183
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/tools/mcp/manager.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "daedalus-cli",
3
- "version": "1.16.0",
3
+ "version": "1.18.0",
4
4
  "description": "Local-first AI coding CLI with embedded model router, multi-agent orchestration, and codebase indexing",
5
5
  "type": "module",
6
6
  "bin": {