@kwonye/mcpx 0.1.0 → 0.1.43

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.
Files changed (79) hide show
  1. package/dist/adapters/claude-desktop.d.ts +8 -0
  2. package/dist/adapters/claude-desktop.js +116 -0
  3. package/dist/adapters/claude-desktop.js.map +1 -0
  4. package/dist/adapters/claude.d.ts +2 -1
  5. package/dist/adapters/claude.js +70 -23
  6. package/dist/adapters/claude.js.map +1 -1
  7. package/dist/adapters/cline.d.ts +2 -1
  8. package/dist/adapters/cline.js +72 -1
  9. package/dist/adapters/cline.js.map +1 -1
  10. package/dist/adapters/codex.d.ts +2 -1
  11. package/dist/adapters/codex.js +77 -2
  12. package/dist/adapters/codex.js.map +1 -1
  13. package/dist/adapters/cursor.d.ts +2 -1
  14. package/dist/adapters/cursor.js +72 -1
  15. package/dist/adapters/cursor.js.map +1 -1
  16. package/dist/adapters/index.js +9 -1
  17. package/dist/adapters/index.js.map +1 -1
  18. package/dist/adapters/kiro.d.ts +8 -0
  19. package/dist/adapters/kiro.js +122 -0
  20. package/dist/adapters/kiro.js.map +1 -0
  21. package/dist/adapters/opencode.d.ts +8 -0
  22. package/dist/adapters/opencode.js +124 -0
  23. package/dist/adapters/opencode.js.map +1 -0
  24. package/dist/adapters/qwen.d.ts +8 -0
  25. package/dist/adapters/qwen.js +114 -0
  26. package/dist/adapters/qwen.js.map +1 -0
  27. package/dist/adapters/{utils.d.ts → utils/index.d.ts} +9 -1
  28. package/dist/adapters/{utils.js → utils/index.js} +59 -2
  29. package/dist/adapters/utils/index.js.map +1 -0
  30. package/dist/adapters/vscode.d.ts +2 -1
  31. package/dist/adapters/vscode.js +72 -1
  32. package/dist/adapters/vscode.js.map +1 -1
  33. package/dist/cli.js +586 -23
  34. package/dist/cli.js.map +1 -1
  35. package/dist/compat/claude.d.ts +28 -0
  36. package/dist/compat/claude.js +252 -0
  37. package/dist/compat/claude.js.map +1 -0
  38. package/dist/compat/codex.d.ts +22 -0
  39. package/dist/compat/codex.js +179 -0
  40. package/dist/compat/codex.js.map +1 -0
  41. package/dist/compat/index.d.ts +28 -0
  42. package/dist/compat/index.js +108 -0
  43. package/dist/compat/index.js.map +1 -0
  44. package/dist/compat/qwen.d.ts +29 -0
  45. package/dist/compat/qwen.js +316 -0
  46. package/dist/compat/qwen.js.map +1 -0
  47. package/dist/compat/unsupported.d.ts +24 -0
  48. package/dist/compat/unsupported.js +47 -0
  49. package/dist/compat/unsupported.js.map +1 -0
  50. package/dist/compat/vscode.d.ts +21 -0
  51. package/dist/compat/vscode.js +164 -0
  52. package/dist/compat/vscode.js.map +1 -0
  53. package/dist/core/auth-probe.d.ts +9 -0
  54. package/dist/core/auth-probe.js +54 -0
  55. package/dist/core/auth-probe.js.map +1 -0
  56. package/dist/core/config.js +1 -1
  57. package/dist/core/config.js.map +1 -1
  58. package/dist/core/index.d.ts +15 -0
  59. package/dist/core/index.js +21 -0
  60. package/dist/core/index.js.map +1 -0
  61. package/dist/core/registry.d.ts +1 -0
  62. package/dist/core/registry.js +7 -0
  63. package/dist/core/registry.js.map +1 -1
  64. package/dist/core/status.d.ts +32 -0
  65. package/dist/core/status.js +63 -0
  66. package/dist/core/status.js.map +1 -0
  67. package/dist/core/sync.d.ts +2 -1
  68. package/dist/core/sync.js +70 -7
  69. package/dist/core/sync.js.map +1 -1
  70. package/dist/gateway/server.js +33 -3
  71. package/dist/gateway/server.js.map +1 -1
  72. package/dist/types.d.ts +54 -1
  73. package/dist/version.d.ts +1 -1
  74. package/dist/version.js +1 -1
  75. package/dist/version.js.map +1 -1
  76. package/package.json +14 -3
  77. package/LICENSE +0 -21
  78. package/README.md +0 -150
  79. package/dist/adapters/utils.js.map +0 -1
@@ -1,7 +1,19 @@
1
1
  import os from "node:os";
2
2
  import path from "node:path";
3
+ import { z } from "zod";
3
4
  import { readJsonFile, writeJsonAtomic } from "../util/fs.js";
4
- import { ensureManagedEntryWritable, errorResult, okResult, pruneStaleManagedEntries, setManagedEntries } from "./utils.js";
5
+ import { buildImportSkip, emptyImportScan, ensureManagedEntryWritable, errorResult, isManagedGatewayProjection, okResult, pruneStaleManagedEntries, removeSourceEntries, setManagedEntries } from "./utils/index.js";
6
+ const stringMapSchema = z.record(z.string(), z.string());
7
+ const cursorEntrySchema = z.object({
8
+ type: z.string().optional(),
9
+ url: z.string().min(1).optional(),
10
+ headers: stringMapSchema.optional(),
11
+ command: z.string().min(1).optional(),
12
+ args: z.array(z.string()).optional(),
13
+ env: stringMapSchema.optional(),
14
+ cwd: z.string().min(1).optional(),
15
+ disabled: z.boolean().optional()
16
+ }).passthrough();
5
17
  export class CursorAdapter {
6
18
  id = "cursor";
7
19
  detectConfigPath() {
@@ -10,6 +22,64 @@ export class CursorAdapter {
10
22
  supportsHttp() {
11
23
  return true;
12
24
  }
25
+ scanForImports(_config, managedIndex) {
26
+ const configPath = this.detectConfigPath();
27
+ const result = emptyImportScan(this.id, configPath ?? undefined);
28
+ if (!configPath) {
29
+ return result;
30
+ }
31
+ const raw = readJsonFile(configPath, {});
32
+ const servers = {
33
+ ...(raw.servers ?? {})
34
+ };
35
+ for (const [name, rawEntry] of Object.entries(servers)) {
36
+ if (isManagedGatewayProjection(name) || managedIndex.managed[this.id]?.entries?.[name]) {
37
+ continue;
38
+ }
39
+ const parsed = cursorEntrySchema.safeParse(rawEntry);
40
+ if (!parsed.success) {
41
+ result.skipped.push(buildImportSkip(this.id, name, "Entry could not be mapped to an mcpx server.", configPath));
42
+ continue;
43
+ }
44
+ const entry = parsed.data;
45
+ if (entry.disabled) {
46
+ result.skipped.push(buildImportSkip(this.id, name, "Entry is disabled in Cursor config.", configPath));
47
+ continue;
48
+ }
49
+ if ((entry.type === undefined || entry.type === "http") && entry.url && !entry.command) {
50
+ result.candidates.push({
51
+ clientId: this.id,
52
+ configPath,
53
+ sourceEntryName: name,
54
+ serverName: name,
55
+ spec: {
56
+ transport: "http",
57
+ url: entry.url,
58
+ headers: entry.headers
59
+ }
60
+ });
61
+ continue;
62
+ }
63
+ if ((entry.type === undefined || entry.type === "stdio") && entry.command && !entry.url) {
64
+ result.candidates.push({
65
+ clientId: this.id,
66
+ configPath,
67
+ sourceEntryName: name,
68
+ serverName: name,
69
+ spec: {
70
+ transport: "stdio",
71
+ command: entry.command,
72
+ args: entry.args,
73
+ env: entry.env,
74
+ cwd: entry.cwd
75
+ }
76
+ });
77
+ continue;
78
+ }
79
+ result.skipped.push(buildImportSkip(this.id, name, "Entry must define exactly one transport that mcpx supports.", configPath));
80
+ }
81
+ return result;
82
+ }
13
83
  syncGateway(_config, options) {
14
84
  const configPath = this.detectConfigPath();
15
85
  if (!configPath) {
@@ -20,6 +90,7 @@ export class CursorAdapter {
20
90
  const servers = {
21
91
  ...(raw.servers ?? {})
22
92
  };
93
+ removeSourceEntries(servers, options.sourceEntriesToRemove);
23
94
  const managedNames = options.managedEntries.map((entry) => entry.name);
24
95
  const serverEntries = Object.fromEntries(options.managedEntries.map((entry) => [entry.name, {
25
96
  type: "http",
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/adapters/cursor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/adapters/cursor.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,23 @@
1
1
  import { ClaudeAdapter } from "./claude.js";
2
+ import { ClaudeDesktopAdapter } from "./claude-desktop.js";
2
3
  import { CodexAdapter } from "./codex.js";
3
4
  import { CursorAdapter } from "./cursor.js";
4
5
  import { ClineAdapter } from "./cline.js";
6
+ import { KiroAdapter } from "./kiro.js";
7
+ import { OpenCodeAdapter } from "./opencode.js";
5
8
  import { VsCodeAdapter } from "./vscode.js";
9
+ import { QwenAdapter } from "./qwen.js";
6
10
  export function getAdapters() {
7
11
  return [
8
12
  new ClaudeAdapter(),
13
+ new ClaudeDesktopAdapter(),
9
14
  new CodexAdapter(),
10
15
  new CursorAdapter(),
11
16
  new ClineAdapter(),
12
- new VsCodeAdapter()
17
+ new OpenCodeAdapter(),
18
+ new KiroAdapter(),
19
+ new VsCodeAdapter(),
20
+ new QwenAdapter()
13
21
  ];
14
22
  }
15
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,IAAI,aAAa,EAAE;QACnB,IAAI,YAAY,EAAE;QAClB,IAAI,aAAa,EAAE;QACnB,IAAI,YAAY,EAAE;QAClB,IAAI,aAAa,EAAE;KACpB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,IAAI,aAAa,EAAE;QACnB,IAAI,oBAAoB,EAAE;QAC1B,IAAI,YAAY,EAAE;QAClB,IAAI,aAAa,EAAE;QACnB,IAAI,YAAY,EAAE;QAClB,IAAI,eAAe,EAAE;QACrB,IAAI,WAAW,EAAE;QACjB,IAAI,aAAa,EAAE;QACnB,IAAI,WAAW,EAAE;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ClientAdapter, ManagedIndex, McpxConfig, SyncClientOptions, SyncResult } from "../types.js";
2
+ export declare class KiroAdapter implements ClientAdapter {
3
+ readonly id: "kiro";
4
+ detectConfigPath(): string | null;
5
+ supportsHttp(): boolean;
6
+ scanForImports(_config: McpxConfig, managedIndex: ManagedIndex): import("../types.js").ClientImportScanResult;
7
+ syncGateway(_config: McpxConfig, options: SyncClientOptions): SyncResult;
8
+ }
@@ -0,0 +1,122 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import { z } from "zod";
4
+ import { readJsonFile, writeJsonAtomic } from "../util/fs.js";
5
+ import { buildImportSkip, emptyImportScan, ensureManagedEntryWritable, errorResult, isManagedGatewayProjection, okResult, pruneStaleManagedEntries, removeSourceEntries, setManagedEntries } from "./utils/index.js";
6
+ const stringMapSchema = z.record(z.string(), z.string());
7
+ const kiroEntrySchema = z.object({
8
+ url: z.string().min(1).optional(),
9
+ headers: stringMapSchema.optional(),
10
+ command: z.string().min(1).optional(),
11
+ args: z.array(z.string()).optional(),
12
+ env: stringMapSchema.optional(),
13
+ cwd: z.string().min(1).optional(),
14
+ disabled: z.boolean().optional()
15
+ }).passthrough();
16
+ export class KiroAdapter {
17
+ id = "kiro";
18
+ detectConfigPath() {
19
+ return path.join(os.homedir(), ".kiro", "settings", "mcp.json");
20
+ }
21
+ supportsHttp() {
22
+ return true;
23
+ }
24
+ scanForImports(_config, managedIndex) {
25
+ const configPath = this.detectConfigPath();
26
+ const result = emptyImportScan(this.id, configPath ?? undefined);
27
+ if (!configPath) {
28
+ return result;
29
+ }
30
+ const raw = readJsonFile(configPath, {});
31
+ const servers = {
32
+ ...(raw.mcpServers ?? {})
33
+ };
34
+ for (const [name, rawEntry] of Object.entries(servers)) {
35
+ if (isManagedGatewayProjection(name) || managedIndex.managed[this.id]?.entries?.[name]) {
36
+ continue;
37
+ }
38
+ const parsed = kiroEntrySchema.safeParse(rawEntry);
39
+ if (!parsed.success) {
40
+ result.skipped.push(buildImportSkip(this.id, name, "Entry could not be mapped to an mcpx server.", configPath));
41
+ continue;
42
+ }
43
+ const entry = parsed.data;
44
+ if (entry.disabled) {
45
+ result.skipped.push(buildImportSkip(this.id, name, "Entry is disabled in Kiro config.", configPath));
46
+ continue;
47
+ }
48
+ if (entry.url && !entry.command) {
49
+ result.candidates.push({
50
+ clientId: this.id,
51
+ configPath,
52
+ sourceEntryName: name,
53
+ serverName: name,
54
+ spec: {
55
+ transport: "http",
56
+ url: entry.url,
57
+ headers: entry.headers
58
+ }
59
+ });
60
+ continue;
61
+ }
62
+ if (entry.command && !entry.url) {
63
+ result.candidates.push({
64
+ clientId: this.id,
65
+ configPath,
66
+ sourceEntryName: name,
67
+ serverName: name,
68
+ spec: {
69
+ transport: "stdio",
70
+ command: entry.command,
71
+ args: entry.args,
72
+ env: entry.env,
73
+ cwd: entry.cwd
74
+ }
75
+ });
76
+ continue;
77
+ }
78
+ result.skipped.push(buildImportSkip(this.id, name, "Entry must define exactly one transport that mcpx supports.", configPath));
79
+ }
80
+ return result;
81
+ }
82
+ syncGateway(_config, options) {
83
+ const configPath = this.detectConfigPath();
84
+ if (!configPath) {
85
+ return errorResult(this.id, undefined, "Unable to resolve Kiro MCP config path.");
86
+ }
87
+ try {
88
+ const raw = readJsonFile(configPath, {});
89
+ const servers = {
90
+ ...(raw.mcpServers ?? {})
91
+ };
92
+ removeSourceEntries(servers, options.sourceEntriesToRemove);
93
+ const managedNames = options.managedEntries.map((entry) => entry.name);
94
+ const serverEntries = Object.fromEntries(options.managedEntries.map((entry) => [entry.name, {
95
+ url: entry.url,
96
+ headers: entry.headers,
97
+ disabled: false
98
+ }]));
99
+ for (const name of managedNames) {
100
+ const conflict = ensureManagedEntryWritable(options.managedIndex, this.id, name, servers[name]);
101
+ if (conflict) {
102
+ return errorResult(this.id, configPath, conflict);
103
+ }
104
+ }
105
+ pruneStaleManagedEntries(options.managedIndex, this.id, servers, managedNames);
106
+ for (const [name, entry] of Object.entries(serverEntries)) {
107
+ servers[name] = entry;
108
+ }
109
+ const next = {
110
+ ...raw,
111
+ mcpServers: servers
112
+ };
113
+ writeJsonAtomic(configPath, next);
114
+ setManagedEntries(options.managedIndex, this.id, configPath, Object.fromEntries(Object.entries(serverEntries).map(([name, entry]) => [name, JSON.stringify(entry)])));
115
+ return okResult(this.id, configPath);
116
+ }
117
+ catch (error) {
118
+ return errorResult(this.id, configPath, error.message);
119
+ }
120
+ }
121
+ }
122
+ //# sourceMappingURL=kiro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kiro.js","sourceRoot":"","sources":["../../src/adapters/kiro.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,eAAe,EACf,0BAA0B,EAC1B,WAAW,EACX,0BAA0B,EAC1B,QAAQ,EACR,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAM1B,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACzD,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjC,OAAO,EAAE,eAAe,CAAC,QAAQ,EAAE;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,eAAe,CAAC,QAAQ,EAAE;IAC/B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC,WAAW,EAAE,CAAC;AAEjB,MAAM,OAAO,WAAW;IACb,EAAE,GAAG,MAAe,CAAC;IAE9B,gBAAgB;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAClE,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,OAAmB,EAAE,YAA0B;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,IAAI,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,GAAG,GAAG,YAAY,CAAgB,UAAU,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG;YACd,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;SAC1B,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvF,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,8CAA8C,EAAE,UAAU,CAAC,CAAC,CAAC;gBAChH,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;YAC1B,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,mCAAmC,EAAE,UAAU,CAAC,CAAC,CAAC;gBACrG,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;oBACrB,QAAQ,EAAE,IAAI,CAAC,EAAE;oBACjB,UAAU;oBACV,eAAe,EAAE,IAAI;oBACrB,UAAU,EAAE,IAAI;oBAChB,IAAI,EAAE;wBACJ,SAAS,EAAE,MAAM;wBACjB,GAAG,EAAE,KAAK,CAAC,GAAG;wBACd,OAAO,EAAE,KAAK,CAAC,OAAO;qBACvB;iBACF,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;oBACrB,QAAQ,EAAE,IAAI,CAAC,EAAE;oBACjB,UAAU;oBACV,eAAe,EAAE,IAAI;oBACrB,UAAU,EAAE,IAAI;oBAChB,IAAI,EAAE;wBACJ,SAAS,EAAE,OAAO;wBAClB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;wBACd,GAAG,EAAE,KAAK,CAAC,GAAG;qBACf;iBACF,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,6DAA6D,EAAE,UAAU,CAAC,CAAC,CAAC;QACjI,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,OAAmB,EAAE,OAA0B;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,yCAAyC,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAgB,UAAU,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG;gBACd,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;aAC1B,CAAC;YACF,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;YAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvE,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CACtC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;oBACjD,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,QAAQ,EAAE,KAAK;iBAChB,CAAC,CAAC,CACuB,CAAC;YAE7B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,0BAA0B,CACzC,OAAO,CAAC,YAAY,EACpB,IAAI,CAAC,EAAE,EACP,IAAI,EACJ,OAAO,CAAC,IAAI,CAAC,CACd,CAAC;gBACF,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;YAED,wBAAwB,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YAC/E,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACxB,CAAC;YAED,MAAM,IAAI,GAAkB;gBAC1B,GAAG,GAAG;gBACN,UAAU,EAAE,OAAO;aACpB,CAAC;YAEF,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAClC,iBAAiB,CACf,OAAO,CAAC,YAAY,EACpB,IAAI,CAAC,EAAE,EACP,UAAU,EACV,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACxG,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { ClientAdapter, ManagedIndex, McpxConfig, SyncClientOptions, SyncResult } from "../types.js";
2
+ export declare class OpenCodeAdapter implements ClientAdapter {
3
+ readonly id: "opencode";
4
+ detectConfigPath(): string | null;
5
+ supportsHttp(): boolean;
6
+ scanForImports(_config: McpxConfig, managedIndex: ManagedIndex): import("../types.js").ClientImportScanResult;
7
+ syncGateway(_config: McpxConfig, options: SyncClientOptions): SyncResult;
8
+ }
@@ -0,0 +1,124 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import { z } from "zod";
4
+ import { readJsonFile, writeJsonAtomic } from "../util/fs.js";
5
+ import { buildImportSkip, emptyImportScan, ensureManagedEntryWritable, errorResult, isManagedGatewayProjection, okResult, pruneStaleManagedEntries, removeSourceEntries, setManagedEntries } from "./utils/index.js";
6
+ const stringMapSchema = z.record(z.string(), z.string());
7
+ const openCodeEntrySchema = z.object({
8
+ type: z.string().optional(),
9
+ url: z.string().min(1).optional(),
10
+ headers: stringMapSchema.optional(),
11
+ command: z.string().min(1).optional(),
12
+ args: z.array(z.string()).optional(),
13
+ env: stringMapSchema.optional(),
14
+ cwd: z.string().min(1).optional(),
15
+ enabled: z.boolean().optional()
16
+ }).passthrough();
17
+ export class OpenCodeAdapter {
18
+ id = "opencode";
19
+ detectConfigPath() {
20
+ return path.join(os.homedir(), ".config", "opencode", "opencode.json");
21
+ }
22
+ supportsHttp() {
23
+ return true;
24
+ }
25
+ scanForImports(_config, managedIndex) {
26
+ const configPath = this.detectConfigPath();
27
+ const result = emptyImportScan(this.id, configPath ?? undefined);
28
+ if (!configPath) {
29
+ return result;
30
+ }
31
+ const raw = readJsonFile(configPath, {});
32
+ const mcp = {
33
+ ...(raw.mcp ?? {})
34
+ };
35
+ for (const [name, rawEntry] of Object.entries(mcp)) {
36
+ if (isManagedGatewayProjection(name) || managedIndex.managed[this.id]?.entries?.[name]) {
37
+ continue;
38
+ }
39
+ const parsed = openCodeEntrySchema.safeParse(rawEntry);
40
+ if (!parsed.success) {
41
+ result.skipped.push(buildImportSkip(this.id, name, "Entry could not be mapped to an mcpx server.", configPath));
42
+ continue;
43
+ }
44
+ const entry = parsed.data;
45
+ if (entry.enabled === false) {
46
+ result.skipped.push(buildImportSkip(this.id, name, "Entry is disabled in OpenCode config.", configPath));
47
+ continue;
48
+ }
49
+ if ((entry.type === undefined || entry.type === "remote" || entry.type === "http") && entry.url && !entry.command) {
50
+ result.candidates.push({
51
+ clientId: this.id,
52
+ configPath,
53
+ sourceEntryName: name,
54
+ serverName: name,
55
+ spec: {
56
+ transport: "http",
57
+ url: entry.url,
58
+ headers: entry.headers
59
+ }
60
+ });
61
+ continue;
62
+ }
63
+ if ((entry.type === undefined || entry.type === "stdio") && entry.command && !entry.url) {
64
+ result.candidates.push({
65
+ clientId: this.id,
66
+ configPath,
67
+ sourceEntryName: name,
68
+ serverName: name,
69
+ spec: {
70
+ transport: "stdio",
71
+ command: entry.command,
72
+ args: entry.args,
73
+ env: entry.env,
74
+ cwd: entry.cwd
75
+ }
76
+ });
77
+ continue;
78
+ }
79
+ result.skipped.push(buildImportSkip(this.id, name, "Entry must define exactly one transport that mcpx supports.", configPath));
80
+ }
81
+ return result;
82
+ }
83
+ syncGateway(_config, options) {
84
+ const configPath = this.detectConfigPath();
85
+ if (!configPath) {
86
+ return errorResult(this.id, undefined, "Unable to resolve OpenCode config path.");
87
+ }
88
+ try {
89
+ const raw = readJsonFile(configPath, {});
90
+ const mcp = {
91
+ ...(raw.mcp ?? {})
92
+ };
93
+ removeSourceEntries(mcp, options.sourceEntriesToRemove);
94
+ const managedNames = options.managedEntries.map((entry) => entry.name);
95
+ const serverEntries = Object.fromEntries(options.managedEntries.map((entry) => [entry.name, {
96
+ type: "remote",
97
+ url: entry.url,
98
+ headers: entry.headers,
99
+ enabled: true
100
+ }]));
101
+ for (const name of managedNames) {
102
+ const conflict = ensureManagedEntryWritable(options.managedIndex, this.id, name, mcp[name]);
103
+ if (conflict) {
104
+ return errorResult(this.id, configPath, conflict);
105
+ }
106
+ }
107
+ pruneStaleManagedEntries(options.managedIndex, this.id, mcp, managedNames);
108
+ for (const [name, entry] of Object.entries(serverEntries)) {
109
+ mcp[name] = entry;
110
+ }
111
+ const next = {
112
+ ...raw,
113
+ mcp
114
+ };
115
+ writeJsonAtomic(configPath, next);
116
+ setManagedEntries(options.managedIndex, this.id, configPath, Object.fromEntries(Object.entries(serverEntries).map(([name, entry]) => [name, JSON.stringify(entry)])));
117
+ return okResult(this.id, configPath);
118
+ }
119
+ catch (error) {
120
+ return errorResult(this.id, configPath, error.message);
121
+ }
122
+ }
123
+ }
124
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/adapters/opencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ClientAdapter, ManagedIndex, McpxConfig, SyncClientOptions, SyncResult } from "../types.js";
2
+ export declare class QwenAdapter implements ClientAdapter {
3
+ readonly id: "qwen";
4
+ detectConfigPath(): string | null;
5
+ supportsHttp(): boolean;
6
+ scanForImports(_config: McpxConfig, managedIndex: ManagedIndex): import("../types.js").ClientImportScanResult;
7
+ syncGateway(_config: McpxConfig, options: SyncClientOptions): SyncResult;
8
+ }
@@ -0,0 +1,114 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import { z } from "zod";
4
+ import { readJsonFile, writeJsonAtomic } from "../util/fs.js";
5
+ import { buildImportSkip, emptyImportScan, ensureManagedEntryWritable, errorResult, isManagedGatewayProjection, okResult, pruneStaleManagedEntries, removeSourceEntries, setManagedEntries } from "./utils/index.js";
6
+ const stringMapSchema = z.record(z.string(), z.string());
7
+ const qwenEntrySchema = z.object({
8
+ httpUrl: z.string().min(1).optional(),
9
+ headers: stringMapSchema.optional(),
10
+ command: z.string().min(1).optional(),
11
+ args: z.array(z.string()).optional(),
12
+ env: stringMapSchema.optional(),
13
+ cwd: z.string().min(1).optional(),
14
+ disabled: z.boolean().optional()
15
+ }).passthrough();
16
+ export class QwenAdapter {
17
+ id = "qwen";
18
+ detectConfigPath() {
19
+ return path.join(os.homedir(), ".qwen", "settings.json");
20
+ }
21
+ supportsHttp() {
22
+ return true;
23
+ }
24
+ scanForImports(_config, managedIndex) {
25
+ const configPath = this.detectConfigPath();
26
+ const result = emptyImportScan(this.id, configPath ?? undefined);
27
+ if (!configPath) {
28
+ return result;
29
+ }
30
+ const raw = readJsonFile(configPath, {});
31
+ const topLevelServers = (raw.mcpServers ?? {});
32
+ for (const [name, rawEntry] of Object.entries(topLevelServers)) {
33
+ if (isManagedGatewayProjection(name) || managedIndex.managed[this.id]?.entries?.[name]) {
34
+ continue;
35
+ }
36
+ const parsed = qwenEntrySchema.safeParse(rawEntry);
37
+ if (!parsed.success) {
38
+ result.skipped.push(buildImportSkip(this.id, name, "Entry could not be mapped to an mcpx server.", configPath));
39
+ continue;
40
+ }
41
+ const entry = parsed.data;
42
+ if (entry.disabled) {
43
+ result.skipped.push(buildImportSkip(this.id, name, "Entry is disabled in Qwen config.", configPath));
44
+ continue;
45
+ }
46
+ if (entry.httpUrl && !entry.command) {
47
+ result.candidates.push({
48
+ clientId: this.id,
49
+ configPath,
50
+ sourceEntryName: name,
51
+ serverName: name,
52
+ spec: {
53
+ transport: "http",
54
+ url: entry.httpUrl,
55
+ headers: entry.headers
56
+ }
57
+ });
58
+ continue;
59
+ }
60
+ if (entry.command && !entry.httpUrl) {
61
+ result.candidates.push({
62
+ clientId: this.id,
63
+ configPath,
64
+ sourceEntryName: name,
65
+ serverName: name,
66
+ spec: {
67
+ transport: "stdio",
68
+ command: entry.command,
69
+ args: entry.args,
70
+ env: entry.env,
71
+ cwd: entry.cwd
72
+ }
73
+ });
74
+ continue;
75
+ }
76
+ result.skipped.push(buildImportSkip(this.id, name, "Entry must define exactly one transport that mcpx supports.", configPath));
77
+ }
78
+ return result;
79
+ }
80
+ syncGateway(_config, options) {
81
+ const configPath = this.detectConfigPath();
82
+ if (!configPath) {
83
+ return errorResult(this.id, undefined, "Unable to resolve Qwen config path.");
84
+ }
85
+ try {
86
+ const raw = readJsonFile(configPath, {});
87
+ const managedNames = options.managedEntries.map((entry) => entry.name);
88
+ const serverEntries = Object.fromEntries(options.managedEntries.map((entry) => [entry.name, {
89
+ httpUrl: entry.url,
90
+ headers: entry.headers
91
+ }]));
92
+ const topLevelServers = (raw.mcpServers ?? {});
93
+ removeSourceEntries(topLevelServers, options.sourceEntriesToRemove);
94
+ for (const name of managedNames) {
95
+ const topLevelConflict = ensureManagedEntryWritable(options.managedIndex, this.id, name, topLevelServers[name]);
96
+ if (topLevelConflict) {
97
+ return errorResult(this.id, configPath, topLevelConflict);
98
+ }
99
+ }
100
+ pruneStaleManagedEntries(options.managedIndex, this.id, topLevelServers, managedNames);
101
+ for (const [name, entry] of Object.entries(serverEntries)) {
102
+ topLevelServers[name] = entry;
103
+ }
104
+ raw.mcpServers = topLevelServers;
105
+ writeJsonAtomic(configPath, raw);
106
+ setManagedEntries(options.managedIndex, this.id, configPath, Object.fromEntries(Object.entries(serverEntries).map(([name, entry]) => [name, JSON.stringify(entry)])));
107
+ return okResult(this.id, configPath);
108
+ }
109
+ catch (error) {
110
+ return errorResult(this.id, configPath, error.message);
111
+ }
112
+ }
113
+ }
114
+ //# sourceMappingURL=qwen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen.js","sourceRoot":"","sources":["../../src/adapters/qwen.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ClientId, ManagedIndex, SyncResult } from "../types.js";
1
+ import type { ClientId, ClientImportScanResult, ClientImportSkippedEntry, ManagedIndex, SyncResult, UpstreamServerSpec } from "../../types.js";
2
2
  export declare function getManagedEntryNames(managedIndex: ManagedIndex, clientId: ClientId): string[];
3
3
  export declare function isManagedEntry(managedIndex: ManagedIndex, clientId: ClientId, entryName: string): boolean;
4
4
  export declare function pruneStaleManagedEntries(managedIndex: ManagedIndex, clientId: ClientId, servers: Record<string, unknown>, keepEntryNames: string[]): void;
@@ -8,3 +8,11 @@ export declare function okResult(clientId: ClientId, configPath: string, message
8
8
  export declare function unsupportedResult(clientId: ClientId, message: string): SyncResult;
9
9
  export declare function errorResult(clientId: ClientId, configPath: string | undefined, message: string): SyncResult;
10
10
  export declare function skippedResult(clientId: ClientId, message: string): SyncResult;
11
+ export declare function managedGatewayEntryName(serverName: string): string;
12
+ export declare function isManagedGatewayProjection(entryName: string): boolean;
13
+ export declare function normalizeServerSpec(spec: UpstreamServerSpec): UpstreamServerSpec;
14
+ export declare function serializeServerSpec(spec: UpstreamServerSpec): string;
15
+ export declare function serverSpecsEqual(left: UpstreamServerSpec, right: UpstreamServerSpec): boolean;
16
+ export declare function emptyImportScan(clientId: ClientId, configPath?: string): ClientImportScanResult;
17
+ export declare function buildImportSkip(clientId: ClientId, sourceEntryName: string, reason: string, configPath?: string, serverName?: string): ClientImportSkippedEntry;
18
+ export declare function removeSourceEntries(entries: Record<string, unknown>, names: string[] | undefined): void;
@@ -1,4 +1,4 @@
1
- import { sha256 } from "../util/fs.js";
1
+ import { sha256 } from "../../util/fs.js";
2
2
  export function getManagedEntryNames(managedIndex, clientId) {
3
3
  return Object.keys(managedIndex.managed[clientId]?.entries ?? {});
4
4
  }
@@ -66,4 +66,61 @@ export function skippedResult(clientId, message) {
66
66
  message
67
67
  };
68
68
  }
69
- //# sourceMappingURL=utils.js.map
69
+ export function managedGatewayEntryName(serverName) {
70
+ return `${serverName} (mcpx)`;
71
+ }
72
+ export function isManagedGatewayProjection(entryName) {
73
+ return entryName.endsWith(" (mcpx)");
74
+ }
75
+ function sortRecord(record) {
76
+ if (!record || Object.keys(record).length === 0) {
77
+ return undefined;
78
+ }
79
+ return Object.fromEntries(Object.entries(record)
80
+ .sort(([left], [right]) => left.localeCompare(right)));
81
+ }
82
+ export function normalizeServerSpec(spec) {
83
+ if (spec.transport === "http") {
84
+ return {
85
+ transport: "http",
86
+ url: spec.url,
87
+ headers: sortRecord(spec.headers)
88
+ };
89
+ }
90
+ return {
91
+ transport: "stdio",
92
+ command: spec.command,
93
+ args: spec.args && spec.args.length > 0 ? [...spec.args] : undefined,
94
+ env: sortRecord(spec.env),
95
+ cwd: spec.cwd
96
+ };
97
+ }
98
+ export function serializeServerSpec(spec) {
99
+ return JSON.stringify(normalizeServerSpec(spec));
100
+ }
101
+ export function serverSpecsEqual(left, right) {
102
+ return serializeServerSpec(left) === serializeServerSpec(right);
103
+ }
104
+ export function emptyImportScan(clientId, configPath) {
105
+ return {
106
+ clientId,
107
+ configPath,
108
+ candidates: [],
109
+ skipped: []
110
+ };
111
+ }
112
+ export function buildImportSkip(clientId, sourceEntryName, reason, configPath, serverName = sourceEntryName) {
113
+ return {
114
+ clientId,
115
+ configPath,
116
+ sourceEntryName,
117
+ serverName,
118
+ reason
119
+ };
120
+ }
121
+ export function removeSourceEntries(entries, names) {
122
+ for (const name of names ?? []) {
123
+ delete entries[name];
124
+ }
125
+ }
126
+ //# sourceMappingURL=index.js.map