nomos-mcp-bridge 1.0.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.
package/dist/index.js ADDED
@@ -0,0 +1,439 @@
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 { z } from 'zod';
5
+ import * as config from './config.js';
6
+ import * as proxy from './proxy.js';
7
+ import * as authServer from './auth/server.js';
8
+ // ── Stderr logging (stdout is reserved for MCP stdio transport) ──
9
+ function log(msg) {
10
+ process.stderr.write('[nomos-mcp-bridge] ' + msg + '\n');
11
+ }
12
+ // ── Bridge MCP Server ────────────────────────
13
+ const server = new McpServer({
14
+ name: 'nomos-mcp-bridge',
15
+ version: '1.0.0',
16
+ }, {
17
+ instructions: 'This is a nomos MCP Bridge that manages connections to one or more nomos system controllers.\n\n'
18
+ + '## Getting Started\n'
19
+ + '1. Use `list_controllers` to see registered controllers.\n'
20
+ + '2. If no controllers are registered, use `add_controller` or `open_setup` to add one.\n'
21
+ + '3. Use `select_controller` to connect to a controller by name.\n'
22
+ + '4. Once connected, all nomos tools, resources, and prompts from that controller become available.\n\n'
23
+ + '## Switching Controllers\n'
24
+ + 'Call `select_controller` with a different name to disconnect from the current controller and connect to another.\n\n'
25
+ + '## Important\n'
26
+ + '- You must select a controller before you can use any nomos tools.\n'
27
+ + '- After selecting a controller, the bridge dynamically exposes all tools, resources, and prompts from that controller.\n',
28
+ });
29
+ // ── Bridge Management Tools ──────────────────
30
+ server.registerTool('list_controllers', {
31
+ title: 'List Controllers',
32
+ description: 'Lists all registered nomos controllers with their names, URLs, and which one is currently active.',
33
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
34
+ inputSchema: {},
35
+ }, () => {
36
+ const controllers = config.getControllers();
37
+ const activeId = config.getActiveControllerId();
38
+ const connected = proxy.getConnectionInfo();
39
+ const list = controllers.map(c => ({
40
+ id: c.id,
41
+ name: c.name,
42
+ url: c.url,
43
+ isActive: c.id === activeId,
44
+ isConnected: connected !== null && connected.id === c.id,
45
+ }));
46
+ return {
47
+ content: [{
48
+ type: 'text',
49
+ text: JSON.stringify({ controllers: list, total: list.length }, null, 2),
50
+ }],
51
+ };
52
+ });
53
+ server.registerTool('select_controller', {
54
+ title: 'Select Controller',
55
+ description: 'Connects to a nomos controller by name. Disconnects from any previously connected controller. After connecting, all tools, resources, and prompts from that controller become available.',
56
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
57
+ inputSchema: {
58
+ name: z.string().describe('The name of the controller to connect to (as shown in list_controllers).'),
59
+ },
60
+ }, async (args) => {
61
+ const controller = config.getControllerByName(args.name);
62
+ if (!controller) {
63
+ return {
64
+ content: [{ type: 'text', text: `Controller not found: "${args.name}". Use list_controllers to see available controllers.` }],
65
+ isError: true,
66
+ };
67
+ }
68
+ try {
69
+ config.setActiveControllerId(controller.id);
70
+ const info = await proxy.connect(controller);
71
+ await registerProxiedCapabilities();
72
+ return {
73
+ content: [{
74
+ type: 'text',
75
+ text: `Connected to controller "${info.name}" at ${info.url}. All nomos tools, resources, and prompts are now available.`,
76
+ }],
77
+ };
78
+ }
79
+ catch (e) {
80
+ const message = e instanceof Error ? e.message : String(e);
81
+ return {
82
+ content: [{ type: 'text', text: `Failed to connect to "${args.name}": ${message}` }],
83
+ isError: true,
84
+ };
85
+ }
86
+ });
87
+ server.registerTool('add_controller', {
88
+ title: 'Add Controller',
89
+ description: 'Registers a new nomos controller. If this is the first controller, it is automatically selected.',
90
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
91
+ inputSchema: {
92
+ name: z.string().describe('A friendly name for the controller (e.g. "Wohnhaus", "Büro")'),
93
+ url: z.string().describe('The base URL of the controller (e.g. "https://192.168.1.100"). The /mcp path is appended automatically.'),
94
+ token: z.string().describe('The MCP Bearer token from the nomos controller settings.'),
95
+ },
96
+ }, (args) => {
97
+ let url = args.url.replace(/\/+$/, '');
98
+ if (!url.endsWith('/mcp')) {
99
+ url += '/mcp';
100
+ }
101
+ try {
102
+ const entry = config.addController({ name: args.name, url, token: args.token });
103
+ const autoSelected = config.getControllers().length === 1
104
+ ? ' It has been automatically selected. Use select_controller to connect.'
105
+ : '';
106
+ return {
107
+ content: [{
108
+ type: 'text',
109
+ text: `Controller "${entry.name}" added successfully (ID: ${entry.id}).${autoSelected}`,
110
+ }],
111
+ };
112
+ }
113
+ catch (e) {
114
+ const message = e instanceof Error ? e.message : String(e);
115
+ return {
116
+ content: [{ type: 'text', text: 'Error: ' + message }],
117
+ isError: true,
118
+ };
119
+ }
120
+ });
121
+ server.registerTool('remove_controller', {
122
+ title: 'Remove Controller',
123
+ description: 'Removes a registered controller by name. If it is the currently connected controller, the connection is closed.',
124
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
125
+ inputSchema: {
126
+ name: z.string().describe('The name of the controller to remove.'),
127
+ },
128
+ }, async (args) => {
129
+ const controller = config.getControllerByName(args.name);
130
+ if (!controller) {
131
+ return {
132
+ content: [{ type: 'text', text: `Controller not found: "${args.name}".` }],
133
+ isError: true,
134
+ };
135
+ }
136
+ const connected = proxy.getConnectionInfo();
137
+ if (connected && connected.id === controller.id) {
138
+ await proxy.disconnect();
139
+ }
140
+ try {
141
+ config.removeController(controller.id);
142
+ return {
143
+ content: [{
144
+ type: 'text',
145
+ text: `Controller "${args.name}" has been removed.`,
146
+ }],
147
+ };
148
+ }
149
+ catch (e) {
150
+ const message = e instanceof Error ? e.message : String(e);
151
+ return {
152
+ content: [{ type: 'text', text: 'Error: ' + message }],
153
+ isError: true,
154
+ };
155
+ }
156
+ });
157
+ server.registerTool('open_setup', {
158
+ title: 'Open Setup Page',
159
+ description: 'Opens the nomos MCP Bridge setup page in the default browser, where controllers can be added via a web form.',
160
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
161
+ inputSchema: {},
162
+ }, async () => {
163
+ try {
164
+ const url = await authServer.start();
165
+ const open = (await import('open')).default;
166
+ await open(url);
167
+ return {
168
+ content: [{
169
+ type: 'text',
170
+ text: `Setup page opened in browser at ${url}. Add your controller there and then use list_controllers to verify.`,
171
+ }],
172
+ };
173
+ }
174
+ catch (e) {
175
+ const message = e instanceof Error ? e.message : String(e);
176
+ return {
177
+ content: [{ type: 'text', text: 'Failed to open setup page: ' + message }],
178
+ isError: true,
179
+ };
180
+ }
181
+ });
182
+ server.registerTool('connection_status', {
183
+ title: 'Connection Status',
184
+ description: 'Shows the current connection status — which controller is connected and whether the connection is active.',
185
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
186
+ inputSchema: {},
187
+ }, () => {
188
+ const connected = proxy.getConnectionInfo();
189
+ if (!connected) {
190
+ return {
191
+ content: [{
192
+ type: 'text',
193
+ text: 'Not connected to any controller. Use select_controller to connect.',
194
+ }],
195
+ };
196
+ }
197
+ return {
198
+ content: [{
199
+ type: 'text',
200
+ text: JSON.stringify({ connected: true, controller: connected }, null, 2),
201
+ }],
202
+ };
203
+ });
204
+ // ── Dynamic Proxy Registration ───────────────
205
+ const registeredProxyTools = new Set();
206
+ const registeredProxyResources = new Set();
207
+ const registeredProxyPrompts = new Set();
208
+ // Convert JSON Schema to Zod — keep it permissive so the controller
209
+ // does the real validation. We only need enough structure for the
210
+ // MCP client to generate reasonable arguments.
211
+ function jsonSchemaToZod(prop) {
212
+ if (prop.enum && prop.enum.length > 0) {
213
+ return z.enum(prop.enum);
214
+ }
215
+ switch (prop.type) {
216
+ case 'string':
217
+ return z.string();
218
+ case 'number':
219
+ case 'integer':
220
+ return z.number();
221
+ case 'boolean':
222
+ return z.boolean();
223
+ case 'array':
224
+ if (prop.items) {
225
+ return z.array(jsonSchemaToZod(prop.items));
226
+ }
227
+ return z.array(z.any());
228
+ case 'object':
229
+ if (prop.properties) {
230
+ const shape = {};
231
+ const required = prop.required ?? [];
232
+ for (const key of Object.keys(prop.properties)) {
233
+ const subProp = prop.properties[key];
234
+ let zodType = jsonSchemaToZod(subProp);
235
+ if (!required.includes(key)) {
236
+ zodType = zodType.optional();
237
+ }
238
+ if (subProp.description) {
239
+ zodType = zodType.describe(subProp.description);
240
+ }
241
+ shape[key] = zodType;
242
+ }
243
+ return z.object(shape).passthrough();
244
+ }
245
+ return z.record(z.any());
246
+ default:
247
+ return z.any();
248
+ }
249
+ }
250
+ async function registerProxiedCapabilities() {
251
+ // ── Tools ────────────────────────
252
+ try {
253
+ const tools = await proxy.listTools();
254
+ for (const tool of tools) {
255
+ if (registeredProxyTools.has(tool.name))
256
+ continue;
257
+ const zodSchema = {};
258
+ const inputSchema = tool.inputSchema;
259
+ if (inputSchema?.properties) {
260
+ const props = inputSchema.properties;
261
+ const required = inputSchema.required ?? [];
262
+ for (const key of Object.keys(props)) {
263
+ const prop = props[key];
264
+ let zodType = jsonSchemaToZod(prop);
265
+ if (!required.includes(key)) {
266
+ zodType = zodType.optional();
267
+ }
268
+ if (prop.description) {
269
+ zodType = zodType.describe(prop.description);
270
+ }
271
+ zodSchema[key] = zodType;
272
+ }
273
+ }
274
+ const toolName = tool.name;
275
+ server.registerTool(toolName, {
276
+ title: tool.title ?? toolName,
277
+ description: tool.description ?? '',
278
+ annotations: tool.annotations ?? {},
279
+ inputSchema: zodSchema,
280
+ }, async (args) => {
281
+ try {
282
+ const result = await proxy.callTool(toolName, args);
283
+ // Normalize: SDK client may return toolResult or content
284
+ if (result.content) {
285
+ return result;
286
+ }
287
+ // Fallback: wrap raw result
288
+ return {
289
+ content: [{ type: 'text', text: JSON.stringify(result) }],
290
+ };
291
+ }
292
+ catch (e) {
293
+ const message = e instanceof Error ? e.message : String(e);
294
+ return {
295
+ content: [{ type: 'text', text: `Error calling ${toolName}: ${message}` }],
296
+ isError: true,
297
+ };
298
+ }
299
+ });
300
+ registeredProxyTools.add(toolName);
301
+ }
302
+ }
303
+ catch (e) {
304
+ const message = e instanceof Error ? e.message : String(e);
305
+ log('Error registering proxied tools: ' + message);
306
+ }
307
+ // ── Resources ────────────────────
308
+ try {
309
+ const resources = await proxy.listResources();
310
+ for (const resource of resources) {
311
+ if (registeredProxyResources.has(resource.uri))
312
+ continue;
313
+ const resourceUri = resource.uri;
314
+ server.registerResource(resource.name ?? resourceUri, resourceUri, { description: resource.description ?? '', mimeType: resource.mimeType }, async (uri) => {
315
+ try {
316
+ return await proxy.readResource(uri.href);
317
+ }
318
+ catch (e) {
319
+ const message = e instanceof Error ? e.message : String(e);
320
+ return { contents: [{ uri: uri.href, text: 'Error: ' + message }] };
321
+ }
322
+ });
323
+ registeredProxyResources.add(resourceUri);
324
+ }
325
+ }
326
+ catch (e) {
327
+ const message = e instanceof Error ? e.message : String(e);
328
+ log('Error registering proxied resources: ' + message);
329
+ }
330
+ // ── Prompts ──────────────────────
331
+ try {
332
+ const prompts = await proxy.listPrompts();
333
+ for (const prompt of prompts) {
334
+ if (registeredProxyPrompts.has(prompt.name))
335
+ continue;
336
+ const promptName = prompt.name;
337
+ const promptArgs = prompt.arguments;
338
+ if (promptArgs && promptArgs.length > 0) {
339
+ // Prompt declares arguments — build argsSchema so callback gets (args, extra)
340
+ const argsSchema = {};
341
+ for (const arg of promptArgs) {
342
+ let zodType = z.string();
343
+ if (arg.description)
344
+ zodType = zodType.describe(arg.description);
345
+ if (!arg.required)
346
+ zodType = zodType.optional();
347
+ argsSchema[arg.name] = zodType;
348
+ }
349
+ server.registerPrompt(promptName, { description: prompt.description ?? '', argsSchema }, async (args) => {
350
+ try {
351
+ return await proxy.getPrompt(promptName, args);
352
+ }
353
+ catch (e) {
354
+ const message = e instanceof Error ? e.message : String(e);
355
+ return { messages: [{ role: 'user', content: { type: 'text', text: 'Error: ' + message } }] };
356
+ }
357
+ });
358
+ }
359
+ else {
360
+ // No arguments — callback signature is (extra), not (args, extra)
361
+ server.registerPrompt(promptName, { description: prompt.description ?? '' }, async () => {
362
+ try {
363
+ return await proxy.getPrompt(promptName);
364
+ }
365
+ catch (e) {
366
+ const message = e instanceof Error ? e.message : String(e);
367
+ return { messages: [{ role: 'user', content: { type: 'text', text: 'Error: ' + message } }] };
368
+ }
369
+ });
370
+ }
371
+ registeredProxyPrompts.add(promptName);
372
+ }
373
+ }
374
+ catch (e) {
375
+ const message = e instanceof Error ? e.message : String(e);
376
+ log('Error registering proxied prompts: ' + message);
377
+ }
378
+ // ── Notify client that capabilities changed ──
379
+ try {
380
+ server.sendToolListChanged();
381
+ }
382
+ catch { /* not connected yet */ }
383
+ try {
384
+ server.sendResourceListChanged();
385
+ }
386
+ catch { /* not connected yet */ }
387
+ try {
388
+ server.sendPromptListChanged();
389
+ }
390
+ catch { /* not connected yet */ }
391
+ log(`Proxied ${registeredProxyTools.size} tools, ${registeredProxyResources.size} resources, ${registeredProxyPrompts.size} prompts.`);
392
+ }
393
+ // ── Startup ──────────────────────────────────
394
+ async function main() {
395
+ log('Starting nomos MCP Bridge...');
396
+ log('Config directory: ' + config.CONFIG_DIR);
397
+ // Auto-connect to the active controller if one is configured
398
+ const activeController = config.getActiveController();
399
+ if (activeController) {
400
+ log(`Auto-connecting to "${activeController.name}" at ${activeController.url}`);
401
+ try {
402
+ await proxy.connect(activeController);
403
+ await registerProxiedCapabilities();
404
+ log(`Connected to "${activeController.name}".`);
405
+ }
406
+ catch (e) {
407
+ const message = e instanceof Error ? e.message : String(e);
408
+ log('Auto-connect failed: ' + message + '. Use select_controller to connect manually.');
409
+ }
410
+ }
411
+ else {
412
+ const controllers = config.getControllers();
413
+ if (controllers.length === 0) {
414
+ log('No controllers registered. Use add_controller or open_setup to add one.');
415
+ }
416
+ else {
417
+ log(controllers.length + ' controller(s) registered. Use select_controller to connect.');
418
+ }
419
+ }
420
+ // Start the local setup web server in the background
421
+ try {
422
+ await authServer.start();
423
+ log('Setup page available at ' + authServer.getAuthUrl());
424
+ }
425
+ catch (e) {
426
+ const message = e instanceof Error ? e.message : String(e);
427
+ log('Warning: Could not start setup web server: ' + message);
428
+ }
429
+ // Connect to Claude via stdio
430
+ const transport = new StdioServerTransport();
431
+ await server.connect(transport);
432
+ log('MCP Bridge ready (stdio transport).');
433
+ }
434
+ main().catch((e) => {
435
+ const message = e instanceof Error ? e.message : String(e);
436
+ process.stderr.write('[nomos-mcp-bridge] Fatal error: ' + message + '\n');
437
+ process.exit(1);
438
+ });
439
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}