llng-mcp 0.1.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.
Files changed (114) hide show
  1. package/.github/workflows/ci.yml +77 -0
  2. package/.prettierrc +7 -0
  3. package/LICENSE +661 -0
  4. package/README.md +502 -0
  5. package/dist/__tests__/api-transport.test.d.ts +1 -0
  6. package/dist/__tests__/api-transport.test.js +577 -0
  7. package/dist/__tests__/api-transport.test.js.map +1 -0
  8. package/dist/__tests__/config.test.d.ts +1 -0
  9. package/dist/__tests__/config.test.js +472 -0
  10. package/dist/__tests__/config.test.js.map +1 -0
  11. package/dist/__tests__/integration/api-mode.test.d.ts +1 -0
  12. package/dist/__tests__/integration/api-mode.test.js +199 -0
  13. package/dist/__tests__/integration/api-mode.test.js.map +1 -0
  14. package/dist/__tests__/integration/oidc-rp.test.d.ts +1 -0
  15. package/dist/__tests__/integration/oidc-rp.test.js +120 -0
  16. package/dist/__tests__/integration/oidc-rp.test.js.map +1 -0
  17. package/dist/__tests__/integration/ssh-mode.test.d.ts +1 -0
  18. package/dist/__tests__/integration/ssh-mode.test.js +101 -0
  19. package/dist/__tests__/integration/ssh-mode.test.js.map +1 -0
  20. package/dist/__tests__/k8s-transport.test.d.ts +1 -0
  21. package/dist/__tests__/k8s-transport.test.js +254 -0
  22. package/dist/__tests__/k8s-transport.test.js.map +1 -0
  23. package/dist/__tests__/oidc-tools.test.d.ts +1 -0
  24. package/dist/__tests__/oidc-tools.test.js +457 -0
  25. package/dist/__tests__/oidc-tools.test.js.map +1 -0
  26. package/dist/__tests__/registry.test.d.ts +1 -0
  27. package/dist/__tests__/registry.test.js +96 -0
  28. package/dist/__tests__/registry.test.js.map +1 -0
  29. package/dist/__tests__/ssh-transport.test.d.ts +1 -0
  30. package/dist/__tests__/ssh-transport.test.js +618 -0
  31. package/dist/__tests__/ssh-transport.test.js.map +1 -0
  32. package/dist/__tests__/tools.test.d.ts +1 -0
  33. package/dist/__tests__/tools.test.js +525 -0
  34. package/dist/__tests__/tools.test.js.map +1 -0
  35. package/dist/config.d.ts +65 -0
  36. package/dist/config.js +506 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.js +42 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/resources/documentation.d.ts +5 -0
  42. package/dist/resources/documentation.js +56 -0
  43. package/dist/resources/documentation.js.map +1 -0
  44. package/dist/tools/cli-utilities.d.ts +3 -0
  45. package/dist/tools/cli-utilities.js +187 -0
  46. package/dist/tools/cli-utilities.js.map +1 -0
  47. package/dist/tools/config.d.ts +6 -0
  48. package/dist/tools/config.js +326 -0
  49. package/dist/tools/config.js.map +1 -0
  50. package/dist/tools/consents.d.ts +3 -0
  51. package/dist/tools/consents.js +39 -0
  52. package/dist/tools/consents.js.map +1 -0
  53. package/dist/tools/instances.d.ts +3 -0
  54. package/dist/tools/instances.js +14 -0
  55. package/dist/tools/instances.js.map +1 -0
  56. package/dist/tools/oidc-rp.d.ts +6 -0
  57. package/dist/tools/oidc-rp.js +246 -0
  58. package/dist/tools/oidc-rp.js.map +1 -0
  59. package/dist/tools/oidc.d.ts +3 -0
  60. package/dist/tools/oidc.js +343 -0
  61. package/dist/tools/oidc.js.map +1 -0
  62. package/dist/tools/secondfactors.d.ts +3 -0
  63. package/dist/tools/secondfactors.js +62 -0
  64. package/dist/tools/secondfactors.js.map +1 -0
  65. package/dist/tools/sessions.d.ts +6 -0
  66. package/dist/tools/sessions.js +300 -0
  67. package/dist/tools/sessions.js.map +1 -0
  68. package/dist/transport/api.d.ts +35 -0
  69. package/dist/transport/api.js +327 -0
  70. package/dist/transport/api.js.map +1 -0
  71. package/dist/transport/interface.d.ts +50 -0
  72. package/dist/transport/interface.js +2 -0
  73. package/dist/transport/interface.js.map +1 -0
  74. package/dist/transport/k8s.d.ts +41 -0
  75. package/dist/transport/k8s.js +303 -0
  76. package/dist/transport/k8s.js.map +1 -0
  77. package/dist/transport/registry.d.ts +20 -0
  78. package/dist/transport/registry.js +91 -0
  79. package/dist/transport/registry.js.map +1 -0
  80. package/dist/transport/ssh.d.ts +37 -0
  81. package/dist/transport/ssh.js +353 -0
  82. package/dist/transport/ssh.js.map +1 -0
  83. package/docker-compose.test.yml +16 -0
  84. package/eslint.config.js +21 -0
  85. package/package.json +38 -0
  86. package/src/__tests__/api-transport.test.ts +746 -0
  87. package/src/__tests__/config.test.ts +587 -0
  88. package/src/__tests__/integration/api-mode.test.ts +229 -0
  89. package/src/__tests__/integration/oidc-rp.test.ts +138 -0
  90. package/src/__tests__/integration/ssh-mode.test.ts +113 -0
  91. package/src/__tests__/k8s-transport.test.ts +342 -0
  92. package/src/__tests__/oidc-tools.test.ts +554 -0
  93. package/src/__tests__/registry.test.ts +110 -0
  94. package/src/__tests__/ssh-transport.test.ts +805 -0
  95. package/src/__tests__/tools.test.ts +735 -0
  96. package/src/config.ts +605 -0
  97. package/src/index.ts +48 -0
  98. package/src/resources/documentation.ts +65 -0
  99. package/src/tools/cli-utilities.ts +207 -0
  100. package/src/tools/config.ts +382 -0
  101. package/src/tools/consents.ts +50 -0
  102. package/src/tools/instances.ts +21 -0
  103. package/src/tools/oidc-rp.ts +299 -0
  104. package/src/tools/oidc.ts +434 -0
  105. package/src/tools/secondfactors.ts +78 -0
  106. package/src/tools/sessions.ts +342 -0
  107. package/src/transport/api.ts +429 -0
  108. package/src/transport/interface.ts +58 -0
  109. package/src/transport/k8s.ts +367 -0
  110. package/src/transport/registry.ts +105 -0
  111. package/src/transport/ssh.ts +430 -0
  112. package/tsconfig.json +16 -0
  113. package/vitest.config.ts +8 -0
  114. package/vitest.integration.config.ts +9 -0
@@ -0,0 +1,65 @@
1
+ declare const VALID_MODES: readonly ["ssh", "api", "k8s"];
2
+ type LlngMode = (typeof VALID_MODES)[number];
3
+ export interface SshConfig {
4
+ host?: string;
5
+ user?: string;
6
+ port?: number;
7
+ sudo?: string;
8
+ remoteCommand?: string;
9
+ binPrefix?: string;
10
+ cliPath?: string;
11
+ sessionsPath?: string;
12
+ configEditorPath?: string;
13
+ deleteSessionPath?: string;
14
+ }
15
+ export interface ApiConfig {
16
+ baseUrl: string;
17
+ basicAuth?: {
18
+ username: string;
19
+ password: string;
20
+ };
21
+ verifySsl?: boolean;
22
+ }
23
+ export interface OidcConfig {
24
+ issuer: string;
25
+ clientId: string;
26
+ clientSecret?: string;
27
+ redirectUri: string;
28
+ scope: string;
29
+ }
30
+ export interface K8sConfig {
31
+ context?: string;
32
+ namespace?: string;
33
+ deployment?: string;
34
+ container?: string;
35
+ podSelector?: string;
36
+ binPrefix?: string;
37
+ }
38
+ export interface ManagerOverride {
39
+ mode?: LlngMode;
40
+ ssh?: Partial<SshConfig>;
41
+ api?: ApiConfig;
42
+ k8s?: K8sConfig;
43
+ }
44
+ export interface LlngConfig {
45
+ mode: LlngMode;
46
+ ssh?: SshConfig;
47
+ api?: ApiConfig;
48
+ k8s?: K8sConfig;
49
+ oidc?: OidcConfig;
50
+ manager?: ManagerOverride;
51
+ }
52
+ export interface ResolvedPaths {
53
+ cliPath: string;
54
+ sessionsPath: string;
55
+ configEditorPath: string;
56
+ }
57
+ export declare function resolvePaths(binPrefix?: string, cliPath?: string, sessionsPath?: string, configEditorPath?: string): ResolvedPaths;
58
+ export declare function loadConfig(): LlngConfig;
59
+ export type LlngInstanceConfig = LlngConfig;
60
+ export interface LlngMultiConfig {
61
+ instances: Record<string, LlngInstanceConfig>;
62
+ default: string;
63
+ }
64
+ export declare function loadMultiConfig(): LlngMultiConfig;
65
+ export {};
package/dist/config.js ADDED
@@ -0,0 +1,506 @@
1
+ import { readFileSync, statSync } from "fs";
2
+ import { join } from "path";
3
+ import { homedir } from "os";
4
+ const DEFAULT_BIN_PREFIX = "/usr/share/lemonldap-ng/bin";
5
+ const VALID_MODES = ["ssh", "api", "k8s"];
6
+ function parseMode(value) {
7
+ if (VALID_MODES.includes(value)) {
8
+ return value;
9
+ }
10
+ throw new Error(`Invalid LLNG mode '${value}'. Valid modes: ${VALID_MODES.join(", ")}`);
11
+ }
12
+ export function resolvePaths(binPrefix, cliPath, sessionsPath, configEditorPath) {
13
+ const prefix = binPrefix || DEFAULT_BIN_PREFIX;
14
+ return {
15
+ cliPath: cliPath || `${prefix}/lemonldap-ng-cli`,
16
+ sessionsPath: sessionsPath || `${prefix}/lemonldap-ng-sessions`,
17
+ configEditorPath: configEditorPath || `${prefix}/lmConfigEditor`,
18
+ };
19
+ }
20
+ export function loadConfig() {
21
+ // Start with defaults
22
+ const config = {
23
+ mode: "ssh",
24
+ ssh: {},
25
+ };
26
+ // Try to load config file from ~/.llng-mcp.json
27
+ const configPath = join(homedir(), ".llng-mcp.json");
28
+ try {
29
+ // Check file permissions - warn if too open
30
+ try {
31
+ const stats = statSync(configPath);
32
+ const mode = stats.mode & 0o777;
33
+ if (mode & 0o077) {
34
+ console.error(`WARNING: ${configPath} has permissions ${mode.toString(8)}. It may contain credentials and should be restricted to owner only (chmod 600).`);
35
+ }
36
+ }
37
+ catch {
38
+ // stat failed, file may not exist - continue
39
+ }
40
+ const fileContent = readFileSync(configPath, "utf-8");
41
+ const fileConfig = JSON.parse(fileContent);
42
+ // Merge file config with defaults
43
+ if (fileConfig.mode)
44
+ config.mode = parseMode(fileConfig.mode);
45
+ if (fileConfig.ssh) {
46
+ config.ssh = { ...config.ssh, ...fileConfig.ssh };
47
+ }
48
+ if (fileConfig.api) {
49
+ config.api = fileConfig.api;
50
+ }
51
+ if (fileConfig.k8s) {
52
+ config.k8s = fileConfig.k8s;
53
+ }
54
+ if (fileConfig.oidc) {
55
+ config.oidc = fileConfig.oidc;
56
+ }
57
+ }
58
+ catch {
59
+ // File doesn't exist or invalid JSON - continue with defaults
60
+ }
61
+ // Overlay environment variables
62
+ if (process.env.LLNG_MODE) {
63
+ config.mode = parseMode(process.env.LLNG_MODE);
64
+ }
65
+ // SSH config - helper to ensure ssh config exists
66
+ const ensureSshConfig = () => {
67
+ if (!config.ssh) {
68
+ config.ssh = {};
69
+ }
70
+ return config.ssh;
71
+ };
72
+ if (process.env.LLNG_SSH_HOST) {
73
+ ensureSshConfig().host = process.env.LLNG_SSH_HOST;
74
+ }
75
+ if (process.env.LLNG_SSH_USER) {
76
+ ensureSshConfig().user = process.env.LLNG_SSH_USER;
77
+ }
78
+ if (process.env.LLNG_SSH_PORT) {
79
+ ensureSshConfig().port = parseInt(process.env.LLNG_SSH_PORT, 10);
80
+ }
81
+ if (process.env.LLNG_SSH_SUDO) {
82
+ ensureSshConfig().sudo = process.env.LLNG_SSH_SUDO;
83
+ }
84
+ if (process.env.LLNG_SSH_REMOTE_COMMAND) {
85
+ ensureSshConfig().remoteCommand = process.env.LLNG_SSH_REMOTE_COMMAND;
86
+ }
87
+ if (process.env.LLNG_SSH_BIN_PREFIX) {
88
+ ensureSshConfig().binPrefix = process.env.LLNG_SSH_BIN_PREFIX;
89
+ }
90
+ if (process.env.LLNG_SSH_CLI_PATH) {
91
+ ensureSshConfig().cliPath = process.env.LLNG_SSH_CLI_PATH;
92
+ }
93
+ if (process.env.LLNG_SSH_SESSIONS_PATH) {
94
+ ensureSshConfig().sessionsPath = process.env.LLNG_SSH_SESSIONS_PATH;
95
+ }
96
+ if (process.env.LLNG_SSH_CONFIG_EDITOR_PATH) {
97
+ ensureSshConfig().configEditorPath = process.env.LLNG_SSH_CONFIG_EDITOR_PATH;
98
+ }
99
+ if (process.env.LLNG_SSH_DELETE_SESSION_PATH) {
100
+ ensureSshConfig().deleteSessionPath = process.env.LLNG_SSH_DELETE_SESSION_PATH;
101
+ }
102
+ // API config
103
+ if (process.env.LLNG_API_URL) {
104
+ config.api = config.api || { baseUrl: process.env.LLNG_API_URL };
105
+ config.api.baseUrl = process.env.LLNG_API_URL;
106
+ }
107
+ if (process.env.LLNG_API_BASIC_USER || process.env.LLNG_API_BASIC_PASSWORD) {
108
+ config.api = config.api || { baseUrl: "" };
109
+ config.api.basicAuth = {
110
+ username: process.env.LLNG_API_BASIC_USER || "",
111
+ password: process.env.LLNG_API_BASIC_PASSWORD || "",
112
+ };
113
+ }
114
+ if (process.env.LLNG_API_VERIFY_SSL) {
115
+ config.api = config.api || { baseUrl: "" };
116
+ config.api.verifySsl = process.env.LLNG_API_VERIFY_SSL !== "false";
117
+ }
118
+ // K8s config
119
+ const ensureK8sConfig = () => {
120
+ if (!config.k8s) {
121
+ config.k8s = {};
122
+ }
123
+ return config.k8s;
124
+ };
125
+ if (process.env.LLNG_K8S_CONTEXT) {
126
+ ensureK8sConfig().context = process.env.LLNG_K8S_CONTEXT;
127
+ }
128
+ if (process.env.LLNG_K8S_NAMESPACE) {
129
+ ensureK8sConfig().namespace = process.env.LLNG_K8S_NAMESPACE;
130
+ }
131
+ if (process.env.LLNG_K8S_DEPLOYMENT) {
132
+ ensureK8sConfig().deployment = process.env.LLNG_K8S_DEPLOYMENT;
133
+ }
134
+ if (process.env.LLNG_K8S_CONTAINER) {
135
+ ensureK8sConfig().container = process.env.LLNG_K8S_CONTAINER;
136
+ }
137
+ if (process.env.LLNG_K8S_POD_SELECTOR) {
138
+ ensureK8sConfig().podSelector = process.env.LLNG_K8S_POD_SELECTOR;
139
+ }
140
+ if (process.env.LLNG_K8S_BIN_PREFIX) {
141
+ ensureK8sConfig().binPrefix = process.env.LLNG_K8S_BIN_PREFIX;
142
+ }
143
+ // OIDC config
144
+ if (process.env.LLNG_OIDC_ISSUER) {
145
+ config.oidc = config.oidc || { issuer: "", clientId: "", redirectUri: "", scope: "" };
146
+ config.oidc.issuer = process.env.LLNG_OIDC_ISSUER;
147
+ }
148
+ if (process.env.LLNG_OIDC_CLIENT_ID) {
149
+ config.oidc = config.oidc || { issuer: "", clientId: "", redirectUri: "", scope: "" };
150
+ config.oidc.clientId = process.env.LLNG_OIDC_CLIENT_ID;
151
+ }
152
+ if (process.env.LLNG_OIDC_CLIENT_SECRET) {
153
+ config.oidc = config.oidc || { issuer: "", clientId: "", redirectUri: "", scope: "" };
154
+ config.oidc.clientSecret = process.env.LLNG_OIDC_CLIENT_SECRET;
155
+ }
156
+ if (process.env.LLNG_OIDC_REDIRECT_URI) {
157
+ config.oidc = config.oidc || { issuer: "", clientId: "", redirectUri: "", scope: "" };
158
+ config.oidc.redirectUri = process.env.LLNG_OIDC_REDIRECT_URI;
159
+ }
160
+ if (process.env.LLNG_OIDC_SCOPE) {
161
+ config.oidc = config.oidc || { issuer: "", clientId: "", redirectUri: "", scope: "" };
162
+ config.oidc.scope = process.env.LLNG_OIDC_SCOPE;
163
+ }
164
+ // Manager override config
165
+ const ensureManager = () => {
166
+ if (!config.manager) {
167
+ config.manager = {};
168
+ }
169
+ return config.manager;
170
+ };
171
+ const ensureManagerSsh = () => {
172
+ const manager = ensureManager();
173
+ if (!manager.ssh) {
174
+ manager.ssh = {};
175
+ }
176
+ return manager.ssh;
177
+ };
178
+ const ensureManagerApi = () => {
179
+ const manager = ensureManager();
180
+ if (!manager.api) {
181
+ manager.api = { baseUrl: "" };
182
+ }
183
+ return manager.api;
184
+ };
185
+ const ensureManagerK8s = () => {
186
+ const manager = ensureManager();
187
+ if (!manager.k8s) {
188
+ manager.k8s = {};
189
+ }
190
+ return manager.k8s;
191
+ };
192
+ if (process.env.LLNG_MANAGER_MODE) {
193
+ ensureManager().mode = parseMode(process.env.LLNG_MANAGER_MODE);
194
+ }
195
+ if (process.env.LLNG_MANAGER_SSH_HOST) {
196
+ ensureManagerSsh().host = process.env.LLNG_MANAGER_SSH_HOST;
197
+ }
198
+ if (process.env.LLNG_MANAGER_SSH_USER) {
199
+ ensureManagerSsh().user = process.env.LLNG_MANAGER_SSH_USER;
200
+ }
201
+ if (process.env.LLNG_MANAGER_SSH_PORT) {
202
+ ensureManagerSsh().port = parseInt(process.env.LLNG_MANAGER_SSH_PORT, 10);
203
+ }
204
+ if (process.env.LLNG_MANAGER_SSH_SUDO) {
205
+ ensureManagerSsh().sudo = process.env.LLNG_MANAGER_SSH_SUDO;
206
+ }
207
+ if (process.env.LLNG_MANAGER_SSH_REMOTE_COMMAND) {
208
+ ensureManagerSsh().remoteCommand = process.env.LLNG_MANAGER_SSH_REMOTE_COMMAND;
209
+ }
210
+ if (process.env.LLNG_MANAGER_SSH_BIN_PREFIX) {
211
+ ensureManagerSsh().binPrefix = process.env.LLNG_MANAGER_SSH_BIN_PREFIX;
212
+ }
213
+ if (process.env.LLNG_MANAGER_SSH_CLI_PATH) {
214
+ ensureManagerSsh().cliPath = process.env.LLNG_MANAGER_SSH_CLI_PATH;
215
+ }
216
+ if (process.env.LLNG_MANAGER_SSH_SESSIONS_PATH) {
217
+ ensureManagerSsh().sessionsPath = process.env.LLNG_MANAGER_SSH_SESSIONS_PATH;
218
+ }
219
+ if (process.env.LLNG_MANAGER_SSH_CONFIG_EDITOR_PATH) {
220
+ ensureManagerSsh().configEditorPath = process.env.LLNG_MANAGER_SSH_CONFIG_EDITOR_PATH;
221
+ }
222
+ if (process.env.LLNG_MANAGER_SSH_DELETE_SESSION_PATH) {
223
+ ensureManagerSsh().deleteSessionPath = process.env.LLNG_MANAGER_SSH_DELETE_SESSION_PATH;
224
+ }
225
+ if (process.env.LLNG_MANAGER_API_URL) {
226
+ ensureManagerApi().baseUrl = process.env.LLNG_MANAGER_API_URL;
227
+ }
228
+ if (process.env.LLNG_MANAGER_API_BASIC_USER || process.env.LLNG_MANAGER_API_BASIC_PASSWORD) {
229
+ ensureManagerApi().basicAuth = {
230
+ username: process.env.LLNG_MANAGER_API_BASIC_USER || "",
231
+ password: process.env.LLNG_MANAGER_API_BASIC_PASSWORD || "",
232
+ };
233
+ }
234
+ if (process.env.LLNG_MANAGER_API_VERIFY_SSL) {
235
+ ensureManagerApi().verifySsl = process.env.LLNG_MANAGER_API_VERIFY_SSL !== "false";
236
+ }
237
+ if (process.env.LLNG_MANAGER_K8S_CONTEXT) {
238
+ ensureManagerK8s().context = process.env.LLNG_MANAGER_K8S_CONTEXT;
239
+ }
240
+ if (process.env.LLNG_MANAGER_K8S_NAMESPACE) {
241
+ ensureManagerK8s().namespace = process.env.LLNG_MANAGER_K8S_NAMESPACE;
242
+ }
243
+ if (process.env.LLNG_MANAGER_K8S_DEPLOYMENT) {
244
+ ensureManagerK8s().deployment = process.env.LLNG_MANAGER_K8S_DEPLOYMENT;
245
+ }
246
+ if (process.env.LLNG_MANAGER_K8S_CONTAINER) {
247
+ ensureManagerK8s().container = process.env.LLNG_MANAGER_K8S_CONTAINER;
248
+ }
249
+ if (process.env.LLNG_MANAGER_K8S_POD_SELECTOR) {
250
+ ensureManagerK8s().podSelector = process.env.LLNG_MANAGER_K8S_POD_SELECTOR;
251
+ }
252
+ if (process.env.LLNG_MANAGER_K8S_BIN_PREFIX) {
253
+ ensureManagerK8s().binPrefix = process.env.LLNG_MANAGER_K8S_BIN_PREFIX;
254
+ }
255
+ return config;
256
+ }
257
+ function applyInstanceDefaults(partial) {
258
+ const config = {
259
+ mode: partial.mode ? parseMode(partial.mode) : "ssh",
260
+ };
261
+ if (partial.ssh)
262
+ config.ssh = { ...partial.ssh };
263
+ if (partial.api)
264
+ config.api = partial.api;
265
+ if (partial.k8s)
266
+ config.k8s = partial.k8s;
267
+ if (partial.oidc)
268
+ config.oidc = partial.oidc;
269
+ if (partial.manager)
270
+ config.manager = partial.manager;
271
+ // For ssh mode without explicit ssh config, provide empty object
272
+ if (config.mode === "ssh" && !config.ssh) {
273
+ config.ssh = {};
274
+ }
275
+ // For k8s mode without explicit k8s config, provide empty object
276
+ if (config.mode === "k8s" && !config.k8s) {
277
+ config.k8s = {};
278
+ }
279
+ return config;
280
+ }
281
+ function applyEnvOverrides(config) {
282
+ if (process.env.LLNG_MODE) {
283
+ config.mode = parseMode(process.env.LLNG_MODE);
284
+ }
285
+ const ensureSsh = () => {
286
+ if (!config.ssh) {
287
+ config.ssh = {};
288
+ }
289
+ return config.ssh;
290
+ };
291
+ if (process.env.LLNG_SSH_HOST)
292
+ ensureSsh().host = process.env.LLNG_SSH_HOST;
293
+ if (process.env.LLNG_SSH_USER)
294
+ ensureSsh().user = process.env.LLNG_SSH_USER;
295
+ if (process.env.LLNG_SSH_PORT)
296
+ ensureSsh().port = parseInt(process.env.LLNG_SSH_PORT, 10);
297
+ if (process.env.LLNG_SSH_SUDO)
298
+ ensureSsh().sudo = process.env.LLNG_SSH_SUDO;
299
+ if (process.env.LLNG_SSH_REMOTE_COMMAND)
300
+ ensureSsh().remoteCommand = process.env.LLNG_SSH_REMOTE_COMMAND;
301
+ if (process.env.LLNG_SSH_BIN_PREFIX)
302
+ ensureSsh().binPrefix = process.env.LLNG_SSH_BIN_PREFIX;
303
+ if (process.env.LLNG_SSH_CLI_PATH)
304
+ ensureSsh().cliPath = process.env.LLNG_SSH_CLI_PATH;
305
+ if (process.env.LLNG_SSH_SESSIONS_PATH)
306
+ ensureSsh().sessionsPath = process.env.LLNG_SSH_SESSIONS_PATH;
307
+ if (process.env.LLNG_SSH_CONFIG_EDITOR_PATH)
308
+ ensureSsh().configEditorPath = process.env.LLNG_SSH_CONFIG_EDITOR_PATH;
309
+ if (process.env.LLNG_SSH_DELETE_SESSION_PATH)
310
+ ensureSsh().deleteSessionPath = process.env.LLNG_SSH_DELETE_SESSION_PATH;
311
+ if (process.env.LLNG_API_URL) {
312
+ config.api = config.api || { baseUrl: process.env.LLNG_API_URL };
313
+ config.api.baseUrl = process.env.LLNG_API_URL;
314
+ }
315
+ if (process.env.LLNG_API_BASIC_USER || process.env.LLNG_API_BASIC_PASSWORD) {
316
+ config.api = config.api || { baseUrl: "" };
317
+ config.api.basicAuth = {
318
+ username: process.env.LLNG_API_BASIC_USER || "",
319
+ password: process.env.LLNG_API_BASIC_PASSWORD || "",
320
+ };
321
+ }
322
+ if (process.env.LLNG_API_VERIFY_SSL) {
323
+ config.api = config.api || { baseUrl: "" };
324
+ config.api.verifySsl = process.env.LLNG_API_VERIFY_SSL !== "false";
325
+ }
326
+ // K8s env overrides
327
+ const ensureK8s = () => {
328
+ if (!config.k8s) {
329
+ config.k8s = {};
330
+ }
331
+ return config.k8s;
332
+ };
333
+ if (process.env.LLNG_K8S_CONTEXT)
334
+ ensureK8s().context = process.env.LLNG_K8S_CONTEXT;
335
+ if (process.env.LLNG_K8S_NAMESPACE)
336
+ ensureK8s().namespace = process.env.LLNG_K8S_NAMESPACE;
337
+ if (process.env.LLNG_K8S_DEPLOYMENT)
338
+ ensureK8s().deployment = process.env.LLNG_K8S_DEPLOYMENT;
339
+ if (process.env.LLNG_K8S_CONTAINER)
340
+ ensureK8s().container = process.env.LLNG_K8S_CONTAINER;
341
+ if (process.env.LLNG_K8S_POD_SELECTOR)
342
+ ensureK8s().podSelector = process.env.LLNG_K8S_POD_SELECTOR;
343
+ if (process.env.LLNG_K8S_BIN_PREFIX)
344
+ ensureK8s().binPrefix = process.env.LLNG_K8S_BIN_PREFIX;
345
+ if (process.env.LLNG_OIDC_ISSUER) {
346
+ config.oidc = config.oidc || { issuer: "", clientId: "", redirectUri: "", scope: "" };
347
+ config.oidc.issuer = process.env.LLNG_OIDC_ISSUER;
348
+ }
349
+ if (process.env.LLNG_OIDC_CLIENT_ID) {
350
+ config.oidc = config.oidc || { issuer: "", clientId: "", redirectUri: "", scope: "" };
351
+ config.oidc.clientId = process.env.LLNG_OIDC_CLIENT_ID;
352
+ }
353
+ if (process.env.LLNG_OIDC_CLIENT_SECRET) {
354
+ config.oidc = config.oidc || { issuer: "", clientId: "", redirectUri: "", scope: "" };
355
+ config.oidc.clientSecret = process.env.LLNG_OIDC_CLIENT_SECRET;
356
+ }
357
+ if (process.env.LLNG_OIDC_REDIRECT_URI) {
358
+ config.oidc = config.oidc || { issuer: "", clientId: "", redirectUri: "", scope: "" };
359
+ config.oidc.redirectUri = process.env.LLNG_OIDC_REDIRECT_URI;
360
+ }
361
+ if (process.env.LLNG_OIDC_SCOPE) {
362
+ config.oidc = config.oidc || { issuer: "", clientId: "", redirectUri: "", scope: "" };
363
+ config.oidc.scope = process.env.LLNG_OIDC_SCOPE;
364
+ }
365
+ // Manager override env overrides
366
+ const ensureManager = () => {
367
+ if (!config.manager) {
368
+ config.manager = {};
369
+ }
370
+ return config.manager;
371
+ };
372
+ const ensureManagerSsh = () => {
373
+ const manager = ensureManager();
374
+ if (!manager.ssh) {
375
+ manager.ssh = {};
376
+ }
377
+ return manager.ssh;
378
+ };
379
+ const ensureManagerApi = () => {
380
+ const manager = ensureManager();
381
+ if (!manager.api) {
382
+ manager.api = { baseUrl: "" };
383
+ }
384
+ return manager.api;
385
+ };
386
+ const ensureManagerK8s = () => {
387
+ const manager = ensureManager();
388
+ if (!manager.k8s) {
389
+ manager.k8s = {};
390
+ }
391
+ return manager.k8s;
392
+ };
393
+ if (process.env.LLNG_MANAGER_MODE) {
394
+ ensureManager().mode = parseMode(process.env.LLNG_MANAGER_MODE);
395
+ }
396
+ if (process.env.LLNG_MANAGER_SSH_HOST) {
397
+ ensureManagerSsh().host = process.env.LLNG_MANAGER_SSH_HOST;
398
+ }
399
+ if (process.env.LLNG_MANAGER_SSH_USER) {
400
+ ensureManagerSsh().user = process.env.LLNG_MANAGER_SSH_USER;
401
+ }
402
+ if (process.env.LLNG_MANAGER_SSH_PORT) {
403
+ ensureManagerSsh().port = parseInt(process.env.LLNG_MANAGER_SSH_PORT, 10);
404
+ }
405
+ if (process.env.LLNG_MANAGER_SSH_SUDO) {
406
+ ensureManagerSsh().sudo = process.env.LLNG_MANAGER_SSH_SUDO;
407
+ }
408
+ if (process.env.LLNG_MANAGER_SSH_REMOTE_COMMAND) {
409
+ ensureManagerSsh().remoteCommand = process.env.LLNG_MANAGER_SSH_REMOTE_COMMAND;
410
+ }
411
+ if (process.env.LLNG_MANAGER_SSH_BIN_PREFIX) {
412
+ ensureManagerSsh().binPrefix = process.env.LLNG_MANAGER_SSH_BIN_PREFIX;
413
+ }
414
+ if (process.env.LLNG_MANAGER_SSH_CLI_PATH) {
415
+ ensureManagerSsh().cliPath = process.env.LLNG_MANAGER_SSH_CLI_PATH;
416
+ }
417
+ if (process.env.LLNG_MANAGER_SSH_SESSIONS_PATH) {
418
+ ensureManagerSsh().sessionsPath = process.env.LLNG_MANAGER_SSH_SESSIONS_PATH;
419
+ }
420
+ if (process.env.LLNG_MANAGER_SSH_CONFIG_EDITOR_PATH) {
421
+ ensureManagerSsh().configEditorPath = process.env.LLNG_MANAGER_SSH_CONFIG_EDITOR_PATH;
422
+ }
423
+ if (process.env.LLNG_MANAGER_SSH_DELETE_SESSION_PATH) {
424
+ ensureManagerSsh().deleteSessionPath = process.env.LLNG_MANAGER_SSH_DELETE_SESSION_PATH;
425
+ }
426
+ if (process.env.LLNG_MANAGER_API_URL) {
427
+ ensureManagerApi().baseUrl = process.env.LLNG_MANAGER_API_URL;
428
+ }
429
+ if (process.env.LLNG_MANAGER_API_BASIC_USER || process.env.LLNG_MANAGER_API_BASIC_PASSWORD) {
430
+ ensureManagerApi().basicAuth = {
431
+ username: process.env.LLNG_MANAGER_API_BASIC_USER || "",
432
+ password: process.env.LLNG_MANAGER_API_BASIC_PASSWORD || "",
433
+ };
434
+ }
435
+ if (process.env.LLNG_MANAGER_API_VERIFY_SSL) {
436
+ ensureManagerApi().verifySsl = process.env.LLNG_MANAGER_API_VERIFY_SSL !== "false";
437
+ }
438
+ if (process.env.LLNG_MANAGER_K8S_CONTEXT) {
439
+ ensureManagerK8s().context = process.env.LLNG_MANAGER_K8S_CONTEXT;
440
+ }
441
+ if (process.env.LLNG_MANAGER_K8S_NAMESPACE) {
442
+ ensureManagerK8s().namespace = process.env.LLNG_MANAGER_K8S_NAMESPACE;
443
+ }
444
+ if (process.env.LLNG_MANAGER_K8S_DEPLOYMENT) {
445
+ ensureManagerK8s().deployment = process.env.LLNG_MANAGER_K8S_DEPLOYMENT;
446
+ }
447
+ if (process.env.LLNG_MANAGER_K8S_CONTAINER) {
448
+ ensureManagerK8s().container = process.env.LLNG_MANAGER_K8S_CONTAINER;
449
+ }
450
+ if (process.env.LLNG_MANAGER_K8S_POD_SELECTOR) {
451
+ ensureManagerK8s().podSelector = process.env.LLNG_MANAGER_K8S_POD_SELECTOR;
452
+ }
453
+ if (process.env.LLNG_MANAGER_K8S_BIN_PREFIX) {
454
+ ensureManagerK8s().binPrefix = process.env.LLNG_MANAGER_K8S_BIN_PREFIX;
455
+ }
456
+ }
457
+ export function loadMultiConfig() {
458
+ const configPath = join(homedir(), ".llng-mcp.json");
459
+ let fileConfig = null;
460
+ // Check file permissions
461
+ try {
462
+ const stats = statSync(configPath);
463
+ const mode = stats.mode & 0o777;
464
+ if (mode & 0o077) {
465
+ console.error(`WARNING: ${configPath} has permissions ${mode.toString(8)}. It may contain credentials and should be restricted to owner only (chmod 600).`);
466
+ }
467
+ }
468
+ catch {
469
+ // stat failed, file may not exist
470
+ }
471
+ try {
472
+ const fileContent = readFileSync(configPath, "utf-8");
473
+ fileConfig = JSON.parse(fileContent);
474
+ }
475
+ catch {
476
+ // File doesn't exist or invalid JSON
477
+ }
478
+ // Detect multi-instance format
479
+ if (fileConfig && fileConfig.instances) {
480
+ const instances = {};
481
+ for (const [name, instanceConfig] of Object.entries(fileConfig.instances)) {
482
+ instances[name] = applyInstanceDefaults(instanceConfig);
483
+ }
484
+ const instanceNames = Object.keys(instances);
485
+ let defaultName = fileConfig.default;
486
+ if (!defaultName || !instances[defaultName]) {
487
+ defaultName = instanceNames[0] || "default";
488
+ }
489
+ const multi = {
490
+ instances,
491
+ default: defaultName,
492
+ };
493
+ // Apply env vars to the default instance, if it exists
494
+ if (multi.instances[multi.default]) {
495
+ applyEnvOverrides(multi.instances[multi.default]);
496
+ }
497
+ return multi;
498
+ }
499
+ // Legacy flat format: wrap as single "default" instance
500
+ const singleConfig = loadConfig();
501
+ return {
502
+ instances: { default: singleConfig },
503
+ default: "default",
504
+ };
505
+ }
506
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { loadMultiConfig } from "./config.js";
5
+ import { TransportRegistry } from "./transport/registry.js";
6
+ import { registerConfigTools } from "./tools/config.js";
7
+ import { registerSessionTools } from "./tools/sessions.js";
8
+ import { registerSecondFactorTools } from "./tools/secondfactors.js";
9
+ import { registerConsentTools } from "./tools/consents.js";
10
+ import { registerOidcTools } from "./tools/oidc.js";
11
+ import { registerOidcRpTools } from "./tools/oidc-rp.js";
12
+ import { registerInstanceTools } from "./tools/instances.js";
13
+ import { registerCliUtilityTools } from "./tools/cli-utilities.js";
14
+ import { registerDocumentationResource } from "./resources/documentation.js";
15
+ async function main() {
16
+ const multiConfig = loadMultiConfig();
17
+ const registry = new TransportRegistry(multiConfig);
18
+ // Create MCP server
19
+ const server = new McpServer({
20
+ name: "llng-mcp",
21
+ version: "0.1.0",
22
+ });
23
+ // Register all tools
24
+ registerConfigTools(server, registry);
25
+ registerSessionTools(server, registry);
26
+ registerSecondFactorTools(server, registry);
27
+ registerConsentTools(server, registry);
28
+ registerOidcTools(server, registry);
29
+ registerOidcRpTools(server, registry);
30
+ registerInstanceTools(server, registry);
31
+ registerCliUtilityTools(server, registry);
32
+ // Register resources
33
+ registerDocumentationResource(server);
34
+ // Start server
35
+ const stdioTransport = new StdioServerTransport();
36
+ await server.connect(stdioTransport);
37
+ }
38
+ main().catch((error) => {
39
+ console.error("Fatal error:", error instanceof Error ? error.message : String(error));
40
+ process.exit(1);
41
+ });
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAE7E,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAEpD,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,qBAAqB;IACrB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,yBAAyB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5C,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE1C,qBAAqB;IACrB,6BAA6B,CAAC,MAAM,CAAC,CAAC;IAEtC,eAAe;IACf,MAAM,cAAc,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAClD,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AACvC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Register LLNG documentation resource template
4
+ */
5
+ export declare function registerDocumentationResource(server: McpServer): void;