nova-control-mcp-server 0.0.2 → 0.0.3
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/nova-control-mcp-server.js +55 -54
- package/package.json +1 -1
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { fileURLToPath as e } from "node:url";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
3
|
+
import { realpathSync as t } from "node:fs";
|
|
4
|
+
import { parseArgs as n } from "node:util";
|
|
5
|
+
import { Server as r } from "@modelcontextprotocol/sdk/server/index.js";
|
|
6
|
+
import { StdioServerTransport as i } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
7
|
+
import { CallToolRequestSchema as a, ListToolsRequestSchema as o } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
+
import { openNova as s } from "nova-control-node";
|
|
8
9
|
//#region src/nova-control-mcp-server.ts
|
|
9
|
-
function
|
|
10
|
+
function c() {
|
|
10
11
|
try {
|
|
11
|
-
let { values: e } =
|
|
12
|
+
let { values: e } = n({
|
|
12
13
|
args: process.argv.slice(2),
|
|
13
14
|
options: {
|
|
14
15
|
port: {
|
|
@@ -31,20 +32,20 @@ function s() {
|
|
|
31
32
|
process.stderr.write(`nova-control-mcp: ${e.message ?? e}\n`), process.exit(1);
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
|
-
var
|
|
35
|
-
async function
|
|
36
|
-
return
|
|
35
|
+
var l = "", u = 9600, d;
|
|
36
|
+
async function f() {
|
|
37
|
+
return d ??= await s(l, u), d;
|
|
37
38
|
}
|
|
38
|
-
function
|
|
39
|
-
|
|
39
|
+
function p() {
|
|
40
|
+
d != null && (d.destroy(), d = void 0);
|
|
40
41
|
}
|
|
41
|
-
function
|
|
42
|
-
|
|
42
|
+
function m(e, t = 9600) {
|
|
43
|
+
l = e, u = t;
|
|
43
44
|
}
|
|
44
|
-
function
|
|
45
|
-
|
|
45
|
+
function h() {
|
|
46
|
+
p(), l = "", u = 9600;
|
|
46
47
|
}
|
|
47
|
-
var
|
|
48
|
+
var g = [
|
|
48
49
|
{
|
|
49
50
|
name: "home",
|
|
50
51
|
description: "send all servos to their home positions",
|
|
@@ -163,80 +164,80 @@ var h = [
|
|
|
163
164
|
}
|
|
164
165
|
}
|
|
165
166
|
];
|
|
166
|
-
async function
|
|
167
|
-
return await (await
|
|
167
|
+
async function _() {
|
|
168
|
+
return await (await f()).home(), "all servos moved to home positions";
|
|
168
169
|
}
|
|
169
|
-
async function
|
|
170
|
+
async function v(e) {
|
|
170
171
|
let t = {};
|
|
171
172
|
if (e.shift_to != null && (t.s1 = Number(e.shift_to)), e.roll_to != null && (t.s2 = Number(e.roll_to)), e.pitch_to != null && (t.s3 = Number(e.pitch_to)), e.rotate_to != null && (t.s4 = Number(e.rotate_to)), e.lift_to != null && (t.s5 = Number(e.lift_to)), Object.keys(t).length === 0) throw Error("move: at least one of shift_to, roll_to, pitch_to, rotate_to, lift_to is required");
|
|
172
|
-
let n = await
|
|
173
|
+
let n = await f();
|
|
173
174
|
return n.State = t, await n.sendServoState(), `servos updated: ${JSON.stringify(t)}`;
|
|
174
175
|
}
|
|
175
|
-
async function
|
|
176
|
-
let t = Number(e.deg), n = await
|
|
176
|
+
async function y(e) {
|
|
177
|
+
let t = Number(e.deg), n = await f();
|
|
177
178
|
return n.State = { s1: t }, await n.sendServoState(), `s1 (shift) → ${t}°`;
|
|
178
179
|
}
|
|
179
|
-
async function
|
|
180
|
-
let t = Number(e.deg), n = await
|
|
180
|
+
async function b(e) {
|
|
181
|
+
let t = Number(e.deg), n = await f();
|
|
181
182
|
return n.State = { s2: t }, await n.sendServoState(), `s2 (roll) → ${t}°`;
|
|
182
183
|
}
|
|
183
|
-
async function
|
|
184
|
-
let t = Number(e.deg), n = await
|
|
184
|
+
async function x(e) {
|
|
185
|
+
let t = Number(e.deg), n = await f();
|
|
185
186
|
return n.State = { s3: t }, await n.sendServoState(), `s3 (pitch) → ${t}°`;
|
|
186
187
|
}
|
|
187
|
-
async function
|
|
188
|
-
let t = Number(e.deg), n = await
|
|
188
|
+
async function S(e) {
|
|
189
|
+
let t = Number(e.deg), n = await f();
|
|
189
190
|
return n.State = { s4: t }, await n.sendServoState(), `s4 (rotate) → ${t}°`;
|
|
190
191
|
}
|
|
191
|
-
async function
|
|
192
|
-
let t = Number(e.deg), n = await
|
|
192
|
+
async function C(e) {
|
|
193
|
+
let t = Number(e.deg), n = await f();
|
|
193
194
|
return n.State = { s5: t }, await n.sendServoState(), `s5 (lift) → ${t}°`;
|
|
194
195
|
}
|
|
195
|
-
async function
|
|
196
|
+
async function w(e) {
|
|
196
197
|
let t = Number(e.ms);
|
|
197
198
|
if (isNaN(t) || t < 0) throw Error(`wait: invalid duration '${e.ms}' — expected a non-negative number`);
|
|
198
199
|
return await new Promise((e) => setTimeout(e, t)), `waited ${t} ms`;
|
|
199
200
|
}
|
|
200
|
-
async function
|
|
201
|
-
let e = await
|
|
201
|
+
async function T() {
|
|
202
|
+
let e = await f();
|
|
202
203
|
return JSON.stringify(e.State);
|
|
203
204
|
}
|
|
204
|
-
function
|
|
205
|
-
let e = new
|
|
205
|
+
function E() {
|
|
206
|
+
let e = new r({
|
|
206
207
|
name: "nova-control-mcp-server",
|
|
207
208
|
version: "0.0.1"
|
|
208
209
|
}, { capabilities: { tools: {} } });
|
|
209
|
-
return e.setRequestHandler(
|
|
210
|
+
return e.setRequestHandler(o, async () => ({ tools: g })), e.setRequestHandler(a, async (e) => {
|
|
210
211
|
let t = e.params.name, n = e.params.arguments ?? {};
|
|
211
212
|
try {
|
|
212
213
|
let e;
|
|
213
214
|
switch (t) {
|
|
214
215
|
case "home":
|
|
215
|
-
e = await
|
|
216
|
+
e = await _();
|
|
216
217
|
break;
|
|
217
218
|
case "move":
|
|
218
|
-
e = await
|
|
219
|
+
e = await v(n);
|
|
219
220
|
break;
|
|
220
221
|
case "shift_to":
|
|
221
|
-
e = await
|
|
222
|
+
e = await y(n);
|
|
222
223
|
break;
|
|
223
224
|
case "roll_to":
|
|
224
|
-
e = await
|
|
225
|
+
e = await b(n);
|
|
225
226
|
break;
|
|
226
227
|
case "pitch_to":
|
|
227
|
-
e = await
|
|
228
|
+
e = await x(n);
|
|
228
229
|
break;
|
|
229
230
|
case "rotate_to":
|
|
230
|
-
e = await
|
|
231
|
+
e = await S(n);
|
|
231
232
|
break;
|
|
232
233
|
case "lift_to":
|
|
233
|
-
e = await
|
|
234
|
+
e = await C(n);
|
|
234
235
|
break;
|
|
235
236
|
case "wait":
|
|
236
|
-
e = await
|
|
237
|
+
e = await w(n);
|
|
237
238
|
break;
|
|
238
239
|
case "get_state":
|
|
239
|
-
e = await
|
|
240
|
+
e = await T();
|
|
240
241
|
break;
|
|
241
242
|
default: return {
|
|
242
243
|
content: [{
|
|
@@ -261,17 +262,17 @@ function T() {
|
|
|
261
262
|
}
|
|
262
263
|
}), e;
|
|
263
264
|
}
|
|
264
|
-
async function
|
|
265
|
-
let { Port: e, BaudRate: t } =
|
|
266
|
-
|
|
267
|
-
let n =
|
|
268
|
-
await n.connect(
|
|
265
|
+
async function D() {
|
|
266
|
+
let { Port: e, BaudRate: t } = c();
|
|
267
|
+
l = e, u = t;
|
|
268
|
+
let n = E(), r = new i();
|
|
269
|
+
await n.connect(r);
|
|
269
270
|
for (let e of ["SIGINT", "SIGTERM"]) process.on(e, () => {
|
|
270
|
-
|
|
271
|
+
p(), process.exit(0);
|
|
271
272
|
});
|
|
272
273
|
}
|
|
273
|
-
process.argv[1] === e(import.meta.url) &&
|
|
274
|
+
t(process.argv[1]) === e(import.meta.url) && D().catch((e) => {
|
|
274
275
|
process.stderr.write(`nova-control-mcp: fatal: ${e.message ?? e}\n`), process.exit(1);
|
|
275
276
|
});
|
|
276
277
|
//#endregion
|
|
277
|
-
export {
|
|
278
|
+
export { h as _destroyForTests, m as _setupForTests, E as createServer };
|