@pleri/olam-cli 0.1.47 → 0.1.49
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/__tests__/mcp-import.test.d.ts +11 -0
- package/dist/__tests__/mcp-import.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-import.test.js +134 -0
- package/dist/__tests__/mcp-import.test.js.map +1 -0
- package/dist/commands/__tests__/upgrade.compose-path.test.d.ts +20 -0
- package/dist/commands/__tests__/upgrade.compose-path.test.d.ts.map +1 -0
- package/dist/commands/__tests__/upgrade.compose-path.test.js +152 -0
- package/dist/commands/__tests__/upgrade.compose-path.test.js.map +1 -0
- package/dist/commands/host-cp.d.ts +6 -0
- package/dist/commands/host-cp.d.ts.map +1 -1
- package/dist/commands/host-cp.js +1 -1
- package/dist/commands/host-cp.js.map +1 -1
- package/dist/commands/mcp/add.d.ts +9 -0
- package/dist/commands/mcp/add.d.ts.map +1 -0
- package/dist/commands/mcp/add.js +87 -0
- package/dist/commands/mcp/add.js.map +1 -0
- package/dist/commands/mcp/client.d.ts +60 -0
- package/dist/commands/mcp/client.d.ts.map +1 -0
- package/dist/commands/mcp/client.js +70 -0
- package/dist/commands/mcp/client.js.map +1 -0
- package/dist/commands/mcp/import-discovery.d.ts +25 -0
- package/dist/commands/mcp/import-discovery.d.ts.map +1 -0
- package/dist/commands/mcp/import-discovery.js +135 -0
- package/dist/commands/mcp/import-discovery.js.map +1 -0
- package/dist/commands/mcp/import-validate.d.ts +15 -0
- package/dist/commands/mcp/import-validate.d.ts.map +1 -0
- package/dist/commands/mcp/import-validate.js +55 -0
- package/dist/commands/mcp/import-validate.js.map +1 -0
- package/dist/commands/mcp/import.d.ts +12 -0
- package/dist/commands/mcp/import.d.ts.map +1 -0
- package/dist/commands/mcp/import.js +126 -0
- package/dist/commands/mcp/import.js.map +1 -0
- package/dist/commands/mcp/index.d.ts +11 -0
- package/dist/commands/mcp/index.d.ts.map +1 -0
- package/dist/commands/mcp/index.js +26 -0
- package/dist/commands/mcp/index.js.map +1 -0
- package/dist/commands/mcp/list.d.ts +6 -0
- package/dist/commands/mcp/list.d.ts.map +1 -0
- package/dist/commands/mcp/list.js +56 -0
- package/dist/commands/mcp/list.js.map +1 -0
- package/dist/commands/mcp/login.d.ts +6 -0
- package/dist/commands/mcp/login.d.ts.map +1 -0
- package/dist/commands/mcp/login.js +38 -0
- package/dist/commands/mcp/login.js.map +1 -0
- package/dist/commands/mcp/remove.d.ts +6 -0
- package/dist/commands/mcp/remove.d.ts.map +1 -0
- package/dist/commands/mcp/remove.js +21 -0
- package/dist/commands/mcp/remove.js.map +1 -0
- package/dist/commands/mcp/status.d.ts +6 -0
- package/dist/commands/mcp/status.d.ts.map +1 -0
- package/dist/commands/mcp/status.js +57 -0
- package/dist/commands/mcp/status.js.map +1 -0
- package/dist/commands/upgrade.d.ts +3 -3
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +4 -5
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/image-digests.json +1 -1
- package/dist/index.js +606 -61
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin HTTP client for the mcp-auth-service.
|
|
3
|
+
*
|
|
4
|
+
* Reads OLAM_MCP_AUTH_SERVICE_URL (default http://127.0.0.1:9998) and
|
|
5
|
+
* OLAM_MCP_AUTH_SECRET from the environment.
|
|
6
|
+
*
|
|
7
|
+
* This URL contract is the Phase C integration point — Phase C reads from
|
|
8
|
+
* mcp-auth at OLAM_MCP_AUTH_SERVICE_URL.
|
|
9
|
+
*/
|
|
10
|
+
export interface McpStatusEntry {
|
|
11
|
+
id: string;
|
|
12
|
+
service: string;
|
|
13
|
+
label: string;
|
|
14
|
+
type: 'oauth' | 'static-key';
|
|
15
|
+
envName?: string;
|
|
16
|
+
validated: boolean;
|
|
17
|
+
importedFrom?: string;
|
|
18
|
+
lastUsed?: string;
|
|
19
|
+
addedAt: string;
|
|
20
|
+
expiresAt?: number;
|
|
21
|
+
expired?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface McpAuthClient {
|
|
24
|
+
status(): Promise<{
|
|
25
|
+
mcps: McpStatusEntry[];
|
|
26
|
+
}>;
|
|
27
|
+
getCredential(service: string): Promise<unknown>;
|
|
28
|
+
staticAdd(opts: {
|
|
29
|
+
service: string;
|
|
30
|
+
token: string;
|
|
31
|
+
label?: string;
|
|
32
|
+
envName?: string;
|
|
33
|
+
}): Promise<{
|
|
34
|
+
ok: boolean;
|
|
35
|
+
error?: string;
|
|
36
|
+
}>;
|
|
37
|
+
oauthStart(opts: {
|
|
38
|
+
service: string;
|
|
39
|
+
label?: string;
|
|
40
|
+
}): Promise<{
|
|
41
|
+
ok: boolean;
|
|
42
|
+
loginUrl?: string;
|
|
43
|
+
state?: string;
|
|
44
|
+
error?: string;
|
|
45
|
+
}>;
|
|
46
|
+
oauthComplete(opts: {
|
|
47
|
+
state: string;
|
|
48
|
+
accessToken: string;
|
|
49
|
+
refreshToken?: string;
|
|
50
|
+
}): Promise<{
|
|
51
|
+
ok: boolean;
|
|
52
|
+
error?: string;
|
|
53
|
+
}>;
|
|
54
|
+
remove(id: string): Promise<{
|
|
55
|
+
ok: boolean;
|
|
56
|
+
error?: string;
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
export declare function getMcpAuthClient(): McpAuthClient;
|
|
60
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA8BH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,SAAS,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChI,UAAU,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnI,aAAa,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7H,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAiChD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin HTTP client for the mcp-auth-service.
|
|
3
|
+
*
|
|
4
|
+
* Reads OLAM_MCP_AUTH_SERVICE_URL (default http://127.0.0.1:9998) and
|
|
5
|
+
* OLAM_MCP_AUTH_SECRET from the environment.
|
|
6
|
+
*
|
|
7
|
+
* This URL contract is the Phase C integration point — Phase C reads from
|
|
8
|
+
* mcp-auth at OLAM_MCP_AUTH_SERVICE_URL.
|
|
9
|
+
*/
|
|
10
|
+
const BASE_URL = process.env['OLAM_MCP_AUTH_SERVICE_URL'] ?? 'http://127.0.0.1:9998';
|
|
11
|
+
const SECRET = process.env['OLAM_MCP_AUTH_SECRET'] ?? '';
|
|
12
|
+
function authHeaders() {
|
|
13
|
+
return SECRET ? { 'X-Olam-Mcp-Secret': SECRET } : {};
|
|
14
|
+
}
|
|
15
|
+
async function apiFetch(path, init = {}) {
|
|
16
|
+
const res = await fetch(`${BASE_URL}${path}`, {
|
|
17
|
+
...init,
|
|
18
|
+
headers: {
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
...authHeaders(),
|
|
21
|
+
...init.headers,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
let msg = `HTTP ${res.status}`;
|
|
26
|
+
try {
|
|
27
|
+
const body = await res.json();
|
|
28
|
+
if (body.error)
|
|
29
|
+
msg = body.error;
|
|
30
|
+
}
|
|
31
|
+
catch { /* ignore */ }
|
|
32
|
+
return { ok: false, error: msg };
|
|
33
|
+
}
|
|
34
|
+
return res.json();
|
|
35
|
+
}
|
|
36
|
+
export function getMcpAuthClient() {
|
|
37
|
+
return {
|
|
38
|
+
async status() {
|
|
39
|
+
const res = await apiFetch('/credentials/status');
|
|
40
|
+
return res;
|
|
41
|
+
},
|
|
42
|
+
async getCredential(service) {
|
|
43
|
+
return apiFetch(`/credentials/${encodeURIComponent(service)}`);
|
|
44
|
+
},
|
|
45
|
+
async staticAdd({ service, token, label, envName }) {
|
|
46
|
+
return apiFetch('/credentials/static/add', {
|
|
47
|
+
method: 'POST',
|
|
48
|
+
body: JSON.stringify({ service, token, label, envName }),
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
async oauthStart({ service, label }) {
|
|
52
|
+
return apiFetch('/credentials/oauth/start', {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
body: JSON.stringify({ service, label }),
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
async oauthComplete({ state, accessToken, refreshToken }) {
|
|
58
|
+
return apiFetch('/credentials/oauth/complete', {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
body: JSON.stringify({ state, accessToken, refreshToken }),
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
async remove(id) {
|
|
64
|
+
return apiFetch(`/credentials/${encodeURIComponent(id)}`, {
|
|
65
|
+
method: 'DELETE',
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/commands/mcp/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,uBAAuB,CAAC;AACtE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AAEzD,SAAS,WAAW;IAClB,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAoB,EAAE;IAC1D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,GAAG,IAAI,EAAE,EAAE;QAC5C,GAAG,IAAI;QACP,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,WAAW,EAAE;YAChB,GAAI,IAAI,CAAC,OAA8C;SACxD;KACF,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,GAAG,GAAG,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAwB,CAAC;YACpD,IAAI,IAAI,CAAC,KAAK;gBAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAyBD,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,KAAK,CAAC,MAAM;YACV,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,qBAAqB,CAA+B,CAAC;YAChF,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,OAAO;YACzB,OAAO,QAAQ,CAAC,gBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;YAChD,OAAO,QAAQ,CAAC,yBAAyB,EAAE;gBACzC,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aACzD,CAA6C,CAAC;QACjD,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;YACjC,OAAO,QAAQ,CAAC,0BAA0B,EAAE;gBAC1C,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;aACzC,CAAgF,CAAC;QACpF,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE;YACtD,OAAO,QAAQ,CAAC,6BAA6B,EAAE;gBAC7C,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;aAC3D,CAA6C,CAAC;QACjD,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,EAAE;YACb,OAAO,QAAQ,CAAC,gBAAgB,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE;gBACxD,MAAM,EAAE,QAAQ;aACjB,CAA6C,CAAC;QACjD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP config discovery — parallel sweep of 5 source paths.
|
|
3
|
+
*
|
|
4
|
+
* Sources:
|
|
5
|
+
* 1. Claude Code: ~/.claude.json mcpServers
|
|
6
|
+
* 2. Claude Desktop: OS-specific config path mcpServers
|
|
7
|
+
* 3. Cursor: ~/.cursor/mcp.json mcpServers
|
|
8
|
+
* 4. Windsurf: ~/.codeium/windsurf/mcp_config.json mcpServers
|
|
9
|
+
* 5. Project .mcp.json from each world repo path in .olam/config.yaml
|
|
10
|
+
*/
|
|
11
|
+
export interface DiscoveredMcp {
|
|
12
|
+
name: string;
|
|
13
|
+
command: string;
|
|
14
|
+
args?: string[];
|
|
15
|
+
env?: Record<string, string>;
|
|
16
|
+
source: string;
|
|
17
|
+
sourceLabel: string;
|
|
18
|
+
}
|
|
19
|
+
export interface DiscoveryResult {
|
|
20
|
+
entries: DiscoveredMcp[];
|
|
21
|
+
sources: string[];
|
|
22
|
+
durationMs: number;
|
|
23
|
+
}
|
|
24
|
+
export declare function discoverMcpSources(repoPaths?: string[]): Promise<DiscoveryResult>;
|
|
25
|
+
//# sourceMappingURL=import-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-discovery.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/import-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAyED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,kBAAkB,CACtC,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,eAAe,CAAC,CA6D1B"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP config discovery — parallel sweep of 5 source paths.
|
|
3
|
+
*
|
|
4
|
+
* Sources:
|
|
5
|
+
* 1. Claude Code: ~/.claude.json mcpServers
|
|
6
|
+
* 2. Claude Desktop: OS-specific config path mcpServers
|
|
7
|
+
* 3. Cursor: ~/.cursor/mcp.json mcpServers
|
|
8
|
+
* 4. Windsurf: ~/.codeium/windsurf/mcp_config.json mcpServers
|
|
9
|
+
* 5. Project .mcp.json from each world repo path in .olam/config.yaml
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as os from 'node:os';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
function readJsonFile(filePath) {
|
|
15
|
+
try {
|
|
16
|
+
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
17
|
+
return JSON.parse(raw);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function extractMcpServers(obj, source, sourceLabel) {
|
|
24
|
+
if (!obj || typeof obj !== 'object' || Array.isArray(obj))
|
|
25
|
+
return [];
|
|
26
|
+
const record = obj;
|
|
27
|
+
const mcpServers = record['mcpServers'] ?? record['mcps'];
|
|
28
|
+
if (!mcpServers || typeof mcpServers !== 'object' || Array.isArray(mcpServers))
|
|
29
|
+
return [];
|
|
30
|
+
const result = [];
|
|
31
|
+
for (const [name, entry] of Object.entries(mcpServers)) {
|
|
32
|
+
if (!entry || typeof entry !== 'object')
|
|
33
|
+
continue;
|
|
34
|
+
const command = entry.command;
|
|
35
|
+
if (!command || typeof command !== 'string')
|
|
36
|
+
continue;
|
|
37
|
+
result.push({
|
|
38
|
+
name,
|
|
39
|
+
command,
|
|
40
|
+
args: Array.isArray(entry.args) ? entry.args : [],
|
|
41
|
+
env: entry.env && typeof entry.env === 'object' ? entry.env : undefined,
|
|
42
|
+
source,
|
|
43
|
+
sourceLabel,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
function getClaudeDesktopPath() {
|
|
49
|
+
if (process.platform === 'darwin') {
|
|
50
|
+
return path.join(os.homedir(), 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
|
|
51
|
+
}
|
|
52
|
+
if (process.platform === 'win32') {
|
|
53
|
+
const appData = process.env['APPDATA'] ?? path.join(os.homedir(), 'AppData', 'Roaming');
|
|
54
|
+
return path.join(appData, 'Claude', 'claude_desktop_config.json');
|
|
55
|
+
}
|
|
56
|
+
return path.join(os.homedir(), '.config', 'Claude', 'claude_desktop_config.json');
|
|
57
|
+
}
|
|
58
|
+
function getOlamRepoPaths() {
|
|
59
|
+
const configPaths = [
|
|
60
|
+
path.join(os.homedir(), '.olam', 'config.yaml'),
|
|
61
|
+
path.join(process.cwd(), '.olam', 'config.yaml'),
|
|
62
|
+
];
|
|
63
|
+
const paths = [];
|
|
64
|
+
for (const configPath of configPaths) {
|
|
65
|
+
if (!fs.existsSync(configPath))
|
|
66
|
+
continue;
|
|
67
|
+
try {
|
|
68
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
69
|
+
const repoMatches = [...raw.matchAll(/path:\s*["']?([^\s"'\n]+)/g)];
|
|
70
|
+
for (const m of repoMatches) {
|
|
71
|
+
if (m[1])
|
|
72
|
+
paths.push(m[1]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch { /* ignore */ }
|
|
76
|
+
}
|
|
77
|
+
return paths;
|
|
78
|
+
}
|
|
79
|
+
export async function discoverMcpSources(repoPaths) {
|
|
80
|
+
const start = performance.now();
|
|
81
|
+
const allEntries = [];
|
|
82
|
+
const sources = [];
|
|
83
|
+
const sourceDefs = [
|
|
84
|
+
{
|
|
85
|
+
path: path.join(os.homedir(), '.claude.json'),
|
|
86
|
+
label: 'Claude Code (~/.claude.json)',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
path: getClaudeDesktopPath(),
|
|
90
|
+
label: 'Claude Desktop',
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
path: path.join(os.homedir(), '.cursor', 'mcp.json'),
|
|
94
|
+
label: 'Cursor (~/.cursor/mcp.json)',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
path: path.join(os.homedir(), '.codeium', 'windsurf', 'mcp_config.json'),
|
|
98
|
+
label: 'Windsurf (~/.codeium/windsurf/mcp_config.json)',
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
// Project .mcp.json files from repo paths
|
|
102
|
+
const resolvedRepoPaths = repoPaths ?? getOlamRepoPaths();
|
|
103
|
+
for (const repoPath of resolvedRepoPaths) {
|
|
104
|
+
sourceDefs.push({
|
|
105
|
+
path: path.join(repoPath, '.mcp.json'),
|
|
106
|
+
label: `.mcp.json (${path.basename(repoPath)})`,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Parallel reads
|
|
110
|
+
const reads = await Promise.all(sourceDefs.map(async ({ path: filePath, label }) => ({
|
|
111
|
+
filePath,
|
|
112
|
+
label,
|
|
113
|
+
data: await Promise.resolve(readJsonFile(filePath)),
|
|
114
|
+
})));
|
|
115
|
+
const seen = new Set();
|
|
116
|
+
for (const { filePath, label, data } of reads) {
|
|
117
|
+
if (!data)
|
|
118
|
+
continue;
|
|
119
|
+
sources.push(label);
|
|
120
|
+
const entries = extractMcpServers(data, filePath, label);
|
|
121
|
+
for (const entry of entries) {
|
|
122
|
+
// Deduplicate by name — first occurrence wins
|
|
123
|
+
if (!seen.has(entry.name)) {
|
|
124
|
+
seen.add(entry.name);
|
|
125
|
+
allEntries.push(entry);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
entries: allEntries,
|
|
131
|
+
sources,
|
|
132
|
+
durationMs: performance.now() - start,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=import-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-discovery.js","sourceRoot":"","sources":["../../../src/commands/mcp/import-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-entry validation probe for olam mcp import.
|
|
3
|
+
*
|
|
4
|
+
* Runs `command + args` with stdin closed and a 5s timeout.
|
|
5
|
+
* Successful exit + non-empty stdout → validated: true.
|
|
6
|
+
* Failed exit → validated: false (import anyway, flagged).
|
|
7
|
+
*/
|
|
8
|
+
import type { DiscoveredMcp } from './import-discovery.js';
|
|
9
|
+
export interface ValidationResult {
|
|
10
|
+
name: string;
|
|
11
|
+
validated: boolean;
|
|
12
|
+
reason: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function validateMcpEntry(entry: DiscoveredMcp): Promise<ValidationResult>;
|
|
15
|
+
//# sourceMappingURL=import-validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-validate.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/import-validate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAgD3B"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-entry validation probe for olam mcp import.
|
|
3
|
+
*
|
|
4
|
+
* Runs `command + args` with stdin closed and a 5s timeout.
|
|
5
|
+
* Successful exit + non-empty stdout → validated: true.
|
|
6
|
+
* Failed exit → validated: false (import anyway, flagged).
|
|
7
|
+
*/
|
|
8
|
+
import { spawn } from 'node:child_process';
|
|
9
|
+
const VALIDATION_TIMEOUT_MS = 5000;
|
|
10
|
+
export async function validateMcpEntry(entry) {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
let stdout = '';
|
|
13
|
+
let timedOut = false;
|
|
14
|
+
let child;
|
|
15
|
+
try {
|
|
16
|
+
child = spawn(entry.command, [...(entry.args ?? [])], {
|
|
17
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
18
|
+
env: { ...process.env, ...(entry.env ?? {}) },
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
resolve({
|
|
23
|
+
name: entry.name,
|
|
24
|
+
validated: false,
|
|
25
|
+
reason: err instanceof Error ? err.message : 'spawn failed',
|
|
26
|
+
});
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const timer = setTimeout(() => {
|
|
30
|
+
timedOut = true;
|
|
31
|
+
child.kill('SIGKILL');
|
|
32
|
+
}, VALIDATION_TIMEOUT_MS);
|
|
33
|
+
child.stdout?.on('data', (chunk) => {
|
|
34
|
+
stdout += chunk.toString();
|
|
35
|
+
});
|
|
36
|
+
child.on('close', (code) => {
|
|
37
|
+
clearTimeout(timer);
|
|
38
|
+
if (timedOut) {
|
|
39
|
+
resolve({ name: entry.name, validated: false, reason: 'timeout (5s)' });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const validated = code === 0 && stdout.trim().length > 0;
|
|
43
|
+
resolve({
|
|
44
|
+
name: entry.name,
|
|
45
|
+
validated,
|
|
46
|
+
reason: validated ? 'ok' : `exit code ${code ?? 'null'}`,
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
child.on('error', (err) => {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
resolve({ name: entry.name, validated: false, reason: err.message });
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=import-validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-validate.js","sourceRoot":"","sources":["../../../src/commands/mcp/import-validate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAS3C,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAoB;IAEpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,IAAI,KAA+B,CAAC;QACpC,IAAI,CAAC;YACH,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE;gBACpD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;gBACnC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;aAC9C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,OAAO,CAAC;gBACN,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,SAAS,EAAE,KAAK;gBAChB,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc;aAC5D,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,QAAQ,GAAG,IAAI,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAE1B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;gBACxE,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACzD,OAAO,CAAC;gBACN,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,SAAS;gBACT,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,IAAI,MAAM,EAAE;aACzD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam mcp import — Discovery sweep + interactive multi-select picker.
|
|
3
|
+
*
|
|
4
|
+
* Scans 5 source paths in parallel, deduplicates by service name, presents
|
|
5
|
+
* a numbered multi-select list, validates each picked entry (5s timeout),
|
|
6
|
+
* then registers with mcp-auth-service.
|
|
7
|
+
*
|
|
8
|
+
* Idempotent re-run: skips already-registered services unless --reimport.
|
|
9
|
+
*/
|
|
10
|
+
import type { Command } from 'commander';
|
|
11
|
+
export declare function registerMcpImport(cmd: Command): void;
|
|
12
|
+
//# sourceMappingURL=import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/import.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0CzC,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAkGpD"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam mcp import — Discovery sweep + interactive multi-select picker.
|
|
3
|
+
*
|
|
4
|
+
* Scans 5 source paths in parallel, deduplicates by service name, presents
|
|
5
|
+
* a numbered multi-select list, validates each picked entry (5s timeout),
|
|
6
|
+
* then registers with mcp-auth-service.
|
|
7
|
+
*
|
|
8
|
+
* Idempotent re-run: skips already-registered services unless --reimport.
|
|
9
|
+
*/
|
|
10
|
+
import * as readline from 'node:readline';
|
|
11
|
+
import pc from 'picocolors';
|
|
12
|
+
import { printError, printInfo } from '../../output.js';
|
|
13
|
+
import { discoverMcpSources } from './import-discovery.js';
|
|
14
|
+
import { validateMcpEntry } from './import-validate.js';
|
|
15
|
+
import { getMcpAuthClient } from './client.js';
|
|
16
|
+
async function multiSelectPicker(entries) {
|
|
17
|
+
if (entries.length === 0)
|
|
18
|
+
return [];
|
|
19
|
+
console.log('\n' + pc.bold('Discovered MCP servers:'));
|
|
20
|
+
entries.forEach((e, i) => {
|
|
21
|
+
console.log(` ${pc.dim(`[${i + 1}]`)} ${pc.cyan(e.name.padEnd(20))} ${pc.dim(e.sourceLabel)}`);
|
|
22
|
+
});
|
|
23
|
+
console.log('\n' + pc.dim('Enter numbers to import (e.g. 1,2,3 or "all" or Enter to skip):'));
|
|
24
|
+
const answer = await new Promise((resolve) => {
|
|
25
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
26
|
+
rl.question('> ', (ans) => {
|
|
27
|
+
rl.close();
|
|
28
|
+
resolve(ans.trim());
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
if (!answer || answer === '')
|
|
32
|
+
return [];
|
|
33
|
+
if (answer.toLowerCase() === 'all')
|
|
34
|
+
return entries;
|
|
35
|
+
const indices = answer
|
|
36
|
+
.split(/[\s,]+/)
|
|
37
|
+
.map((s) => parseInt(s, 10) - 1)
|
|
38
|
+
.filter((i) => !isNaN(i) && i >= 0 && i < entries.length);
|
|
39
|
+
const unique = [...new Set(indices)];
|
|
40
|
+
return unique.map((i) => entries[i]).filter((e) => e != null);
|
|
41
|
+
}
|
|
42
|
+
export function registerMcpImport(cmd) {
|
|
43
|
+
cmd
|
|
44
|
+
.command('import')
|
|
45
|
+
.description('Discover MCP servers from Claude Code, Desktop, Cursor, Windsurf, and .mcp.json')
|
|
46
|
+
.option('--reimport', 'Re-import services that are already registered')
|
|
47
|
+
.option('--no-validate', 'Skip validation probes')
|
|
48
|
+
.option('--repo-paths <paths>', 'Comma-separated list of repo paths to scan for .mcp.json')
|
|
49
|
+
.action(async (opts) => {
|
|
50
|
+
const client = getMcpAuthClient();
|
|
51
|
+
// Load existing services for idempotency check
|
|
52
|
+
let existingIds = new Set();
|
|
53
|
+
try {
|
|
54
|
+
const data = await client.status();
|
|
55
|
+
existingIds = new Set((data.mcps ?? []).map((m) => m.id));
|
|
56
|
+
}
|
|
57
|
+
catch { /* mcp-auth not running — treat all as new */ }
|
|
58
|
+
printInfo('Scanning', 'Claude Code, Claude Desktop, Cursor, Windsurf, .mcp.json…');
|
|
59
|
+
const repoPaths = opts.repoPaths ? opts.repoPaths.split(',').map((s) => s.trim()) : undefined;
|
|
60
|
+
const { entries, sources, durationMs } = await discoverMcpSources(repoPaths);
|
|
61
|
+
if (entries.length === 0) {
|
|
62
|
+
console.log(pc.dim('No MCP servers found in any source path.'));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
printInfo('Sources', sources.length > 0 ? sources.join(', ') : 'none');
|
|
66
|
+
printInfo('Found', `${entries.length} MCP server(s) in ${Math.round(durationMs)}ms`);
|
|
67
|
+
// Filter already-registered unless --reimport
|
|
68
|
+
let candidates = entries;
|
|
69
|
+
let skippedCount = 0;
|
|
70
|
+
if (!opts.reimport) {
|
|
71
|
+
const filtered = entries.filter((e) => !existingIds.has(e.name));
|
|
72
|
+
skippedCount = entries.length - filtered.length;
|
|
73
|
+
candidates = filtered;
|
|
74
|
+
}
|
|
75
|
+
if (skippedCount > 0) {
|
|
76
|
+
console.log(pc.dim(`skipped: ${skippedCount} already registered`));
|
|
77
|
+
}
|
|
78
|
+
if (candidates.length === 0) {
|
|
79
|
+
console.log(pc.dim('Nothing new to import. Use --reimport to force.'));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Interactive picker
|
|
83
|
+
const selected = await multiSelectPicker(candidates);
|
|
84
|
+
if (selected.length === 0) {
|
|
85
|
+
console.log(pc.dim('No servers selected.'));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
console.log(`\nImporting ${selected.length} server(s)…`);
|
|
89
|
+
let importedCount = 0;
|
|
90
|
+
let validatedCount = 0;
|
|
91
|
+
for (const entry of selected) {
|
|
92
|
+
let validated = false;
|
|
93
|
+
let validationReason = 'skipped';
|
|
94
|
+
if (opts.validate !== false) {
|
|
95
|
+
process.stdout.write(` ${pc.dim('→')} ${entry.name} validating… `);
|
|
96
|
+
const vr = await validateMcpEntry(entry);
|
|
97
|
+
validated = vr.validated;
|
|
98
|
+
validationReason = vr.reason;
|
|
99
|
+
process.stdout.write(validated ? pc.green('ok\n') : pc.yellow(`unvalidated (${vr.reason})\n`));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.log(` ${pc.dim('→')} ${entry.name} ${pc.dim('(validation skipped)')}`);
|
|
103
|
+
}
|
|
104
|
+
if (validated)
|
|
105
|
+
validatedCount++;
|
|
106
|
+
// Register as static-key (type depends on whether command uses env vars for tokens)
|
|
107
|
+
const result = await client.staticAdd({
|
|
108
|
+
service: entry.name,
|
|
109
|
+
token: `mcp://${entry.command}`,
|
|
110
|
+
label: entry.name,
|
|
111
|
+
});
|
|
112
|
+
if (result.ok) {
|
|
113
|
+
importedCount++;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
printError(`Failed to register ${entry.name}: ${result.error ?? 'unknown error'}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
console.log('');
|
|
120
|
+
console.log(pc.green(`✓ Imported ${importedCount}/${selected.length}`));
|
|
121
|
+
if (validatedCount > 0) {
|
|
122
|
+
console.log(pc.dim(` ${validatedCount} validated, ${importedCount - validatedCount} unvalidated`));
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../../src/commands/mcp/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam mcp — MCP credential management verb namespace.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands: login, add, list, remove, status, import
|
|
5
|
+
* Discoverable via: olam mcp --help
|
|
6
|
+
*
|
|
7
|
+
* Does NOT touch existing `olam auth` commands.
|
|
8
|
+
*/
|
|
9
|
+
import type { Command } from 'commander';
|
|
10
|
+
export declare function registerMcp(program: Command): void;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAWlD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam mcp — MCP credential management verb namespace.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands: login, add, list, remove, status, import
|
|
5
|
+
* Discoverable via: olam mcp --help
|
|
6
|
+
*
|
|
7
|
+
* Does NOT touch existing `olam auth` commands.
|
|
8
|
+
*/
|
|
9
|
+
import { registerMcpLogin } from './login.js';
|
|
10
|
+
import { registerMcpAdd } from './add.js';
|
|
11
|
+
import { registerMcpList } from './list.js';
|
|
12
|
+
import { registerMcpRemove } from './remove.js';
|
|
13
|
+
import { registerMcpStatus } from './status.js';
|
|
14
|
+
import { registerMcpImport } from './import.js';
|
|
15
|
+
export function registerMcp(program) {
|
|
16
|
+
const mcp = program
|
|
17
|
+
.command('mcp')
|
|
18
|
+
.description('Manage MCP server credentials (login, add, list, remove, import)');
|
|
19
|
+
registerMcpLogin(mcp);
|
|
20
|
+
registerMcpAdd(mcp);
|
|
21
|
+
registerMcpList(mcp);
|
|
22
|
+
registerMcpRemove(mcp);
|
|
23
|
+
registerMcpStatus(mcp);
|
|
24
|
+
registerMcpImport(mcp);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,kEAAkE,CAAC,CAAC;IAEnF,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,cAAc,CAAC,GAAG,CAAC,CAAC;IACpB,eAAe,CAAC,GAAG,CAAC,CAAC;IACrB,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvB,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvB,iBAAiB,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAkDlD"}
|