@tmhs/homelab-mcp 0.7.0 → 0.9.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/README.md +10 -1
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/adguardFilters.d.ts.map +1 -1
- package/dist/tools/adguardFilters.js +3 -2
- package/dist/tools/adguardFilters.js.map +1 -1
- package/dist/tools/adguardQueryLog.d.ts.map +1 -1
- package/dist/tools/adguardQueryLog.js +3 -1
- package/dist/tools/adguardQueryLog.js.map +1 -1
- package/dist/tools/adguardStats.d.ts.map +1 -1
- package/dist/tools/adguardStats.js +3 -2
- package/dist/tools/adguardStats.js.map +1 -1
- package/dist/tools/alertList.d.ts.map +1 -1
- package/dist/tools/alertList.js +3 -1
- package/dist/tools/alertList.js.map +1 -1
- package/dist/tools/aptHistory.d.ts.map +1 -1
- package/dist/tools/aptHistory.js +3 -1
- package/dist/tools/aptHistory.js.map +1 -1
- package/dist/tools/aptUpdate.d.ts.map +1 -1
- package/dist/tools/aptUpdate.js +3 -1
- package/dist/tools/aptUpdate.js.map +1 -1
- package/dist/tools/aptUpgradable.d.ts.map +1 -1
- package/dist/tools/aptUpgradable.js +4 -3
- package/dist/tools/aptUpgradable.js.map +1 -1
- package/dist/tools/backupDiff.d.ts.map +1 -1
- package/dist/tools/backupDiff.js +3 -1
- package/dist/tools/backupDiff.js.map +1 -1
- package/dist/tools/backupList.d.ts.map +1 -1
- package/dist/tools/backupList.js +3 -1
- package/dist/tools/backupList.js.map +1 -1
- package/dist/tools/backupRestore.d.ts.map +1 -1
- package/dist/tools/backupRestore.js +3 -1
- package/dist/tools/backupRestore.js.map +1 -1
- package/dist/tools/backupRun.d.ts.map +1 -1
- package/dist/tools/backupRun.js +3 -1
- package/dist/tools/backupRun.js.map +1 -1
- package/dist/tools/backupStatus.d.ts.map +1 -1
- package/dist/tools/backupStatus.js +3 -1
- package/dist/tools/backupStatus.js.map +1 -1
- package/dist/tools/certCheck.d.ts +3 -0
- package/dist/tools/certCheck.d.ts.map +1 -0
- package/dist/tools/certCheck.js +31 -0
- package/dist/tools/certCheck.js.map +1 -0
- package/dist/tools/certList.d.ts +3 -0
- package/dist/tools/certList.d.ts.map +1 -0
- package/dist/tools/certList.js +40 -0
- package/dist/tools/certList.js.map +1 -0
- package/dist/tools/certRenew.d.ts +3 -0
- package/dist/tools/certRenew.d.ts.map +1 -0
- package/dist/tools/certRenew.js +47 -0
- package/dist/tools/certRenew.js.map +1 -0
- package/dist/tools/composeDown.d.ts.map +1 -1
- package/dist/tools/composeDown.js +3 -1
- package/dist/tools/composeDown.js.map +1 -1
- package/dist/tools/composePs.d.ts.map +1 -1
- package/dist/tools/composePs.js +3 -2
- package/dist/tools/composePs.js.map +1 -1
- package/dist/tools/composePull.d.ts.map +1 -1
- package/dist/tools/composePull.js +3 -1
- package/dist/tools/composePull.js.map +1 -1
- package/dist/tools/composeUp.d.ts.map +1 -1
- package/dist/tools/composeUp.js +3 -1
- package/dist/tools/composeUp.js.map +1 -1
- package/dist/tools/containerScan.d.ts.map +1 -1
- package/dist/tools/containerScan.js +4 -2
- package/dist/tools/containerScan.js.map +1 -1
- package/dist/tools/diskUsage.d.ts.map +1 -1
- package/dist/tools/diskUsage.js +3 -1
- package/dist/tools/diskUsage.js.map +1 -1
- package/dist/tools/fail2banStatus.d.ts.map +1 -1
- package/dist/tools/fail2banStatus.js +3 -1
- package/dist/tools/fail2banStatus.js.map +1 -1
- package/dist/tools/grafanaSnapshot.d.ts.map +1 -1
- package/dist/tools/grafanaSnapshot.js +3 -1
- package/dist/tools/grafanaSnapshot.js.map +1 -1
- package/dist/tools/inventorySync.d.ts +3 -0
- package/dist/tools/inventorySync.d.ts.map +1 -0
- package/dist/tools/inventorySync.js +36 -0
- package/dist/tools/inventorySync.js.map +1 -0
- package/dist/tools/journalLogs.d.ts.map +1 -1
- package/dist/tools/journalLogs.js +3 -1
- package/dist/tools/journalLogs.js.map +1 -1
- package/dist/tools/kernelInfo.d.ts.map +1 -1
- package/dist/tools/kernelInfo.js +4 -3
- package/dist/tools/kernelInfo.js.map +1 -1
- package/dist/tools/logSearch.d.ts.map +1 -1
- package/dist/tools/logSearch.js +3 -1
- package/dist/tools/logSearch.js.map +1 -1
- package/dist/tools/networkInfo.d.ts.map +1 -1
- package/dist/tools/networkInfo.js +3 -2
- package/dist/tools/networkInfo.js.map +1 -1
- package/dist/tools/nodeExec.d.ts +3 -0
- package/dist/tools/nodeExec.d.ts.map +1 -0
- package/dist/tools/nodeExec.js +34 -0
- package/dist/tools/nodeExec.js.map +1 -0
- package/dist/tools/nodeList.d.ts +3 -0
- package/dist/tools/nodeList.d.ts.map +1 -0
- package/dist/tools/nodeList.js +24 -0
- package/dist/tools/nodeList.js.map +1 -0
- package/dist/tools/nodeStatus.d.ts +3 -0
- package/dist/tools/nodeStatus.d.ts.map +1 -0
- package/dist/tools/nodeStatus.js +30 -0
- package/dist/tools/nodeStatus.js.map +1 -0
- package/dist/tools/npmCerts.d.ts.map +1 -1
- package/dist/tools/npmCerts.js +6 -5
- package/dist/tools/npmCerts.js.map +1 -1
- package/dist/tools/npmProxyHosts.d.ts.map +1 -1
- package/dist/tools/npmProxyHosts.js +6 -5
- package/dist/tools/npmProxyHosts.js.map +1 -1
- package/dist/tools/ntfySend.d.ts.map +1 -1
- package/dist/tools/ntfySend.js +3 -1
- package/dist/tools/ntfySend.js.map +1 -1
- package/dist/tools/ntfyTopics.d.ts.map +1 -1
- package/dist/tools/ntfyTopics.js +3 -1
- package/dist/tools/ntfyTopics.js.map +1 -1
- package/dist/tools/openPorts.d.ts.map +1 -1
- package/dist/tools/openPorts.js +3 -2
- package/dist/tools/openPorts.js.map +1 -1
- package/dist/tools/piReboot.d.ts.map +1 -1
- package/dist/tools/piReboot.js +5 -3
- package/dist/tools/piReboot.js.map +1 -1
- package/dist/tools/piStatus.d.ts.map +1 -1
- package/dist/tools/piStatus.js +3 -2
- package/dist/tools/piStatus.js.map +1 -1
- package/dist/tools/prometheusQuery.d.ts.map +1 -1
- package/dist/tools/prometheusQuery.js +3 -1
- package/dist/tools/prometheusQuery.js.map +1 -1
- package/dist/tools/serviceHealth.d.ts.map +1 -1
- package/dist/tools/serviceHealth.js +4 -2
- package/dist/tools/serviceHealth.js.map +1 -1
- package/dist/tools/serviceLogs.d.ts.map +1 -1
- package/dist/tools/serviceLogs.js +3 -1
- package/dist/tools/serviceLogs.js.map +1 -1
- package/dist/tools/serviceRestart.d.ts.map +1 -1
- package/dist/tools/serviceRestart.js +4 -2
- package/dist/tools/serviceRestart.js.map +1 -1
- package/dist/tools/speedtestResults.d.ts.map +1 -1
- package/dist/tools/speedtestResults.js +3 -1
- package/dist/tools/speedtestResults.js.map +1 -1
- package/dist/tools/sshTest.d.ts.map +1 -1
- package/dist/tools/sshTest.js +3 -2
- package/dist/tools/sshTest.js.map +1 -1
- package/dist/tools/systemdServices.d.ts.map +1 -1
- package/dist/tools/systemdServices.js +3 -1
- package/dist/tools/systemdServices.js.map +1 -1
- package/dist/tools/ufwStatus.d.ts.map +1 -1
- package/dist/tools/ufwStatus.js +3 -2
- package/dist/tools/ufwStatus.js.map +1 -1
- package/dist/tools/uptimeKumaStatus.d.ts.map +1 -1
- package/dist/tools/uptimeKumaStatus.js +3 -2
- package/dist/tools/uptimeKumaStatus.js.map +1 -1
- package/dist/tools/volumeBackup.d.ts.map +1 -1
- package/dist/tools/volumeBackup.js +3 -1
- package/dist/tools/volumeBackup.js.map +1 -1
- package/dist/utils/node-param.d.ts +5 -0
- package/dist/utils/node-param.d.ts.map +1 -0
- package/dist/utils/node-param.js +8 -0
- package/dist/utils/node-param.js.map +1 -0
- package/dist/utils/ssh-api.d.ts +12 -1
- package/dist/utils/ssh-api.d.ts.map +1 -1
- package/dist/utils/ssh-api.js +50 -7
- package/dist/utils/ssh-api.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { execSSH, listNodes } from "../utils/ssh-api.js";
|
|
2
|
+
const inputSchema = {};
|
|
3
|
+
export function register(server) {
|
|
4
|
+
server.tool("homelab_nodeList", "List all managed nodes and their connection status", inputSchema, async () => {
|
|
5
|
+
const nodes = listNodes();
|
|
6
|
+
const results = [];
|
|
7
|
+
for (const node of nodes) {
|
|
8
|
+
try {
|
|
9
|
+
await execSSH("echo ok", node.name === "default" ? undefined : node.name);
|
|
10
|
+
results.push(`${node.name} (${node.host}) -- online`);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
results.push(`${node.name} (${node.host}) -- offline`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
content: [{
|
|
18
|
+
type: "text",
|
|
19
|
+
text: results.join("\n") || "No nodes configured.",
|
|
20
|
+
}],
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=nodeList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeList.js","sourceRoot":"","sources":["../../src/tools/nodeList.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAiB,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAExE,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,oDAAoD,EACpD,WAAW,EACX,KAAK,IAAI,EAAE;QACT,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1E,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,aAAa,CAAC,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB;iBACnD,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeStatus.d.ts","sourceRoot":"","sources":["../../src/tools/nodeStatus.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4BhD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
3
|
+
const inputSchema = {
|
|
4
|
+
node: z.string().min(1).describe("Target node name from the node registry"),
|
|
5
|
+
};
|
|
6
|
+
export function register(server) {
|
|
7
|
+
server.tool("homelab_nodeStatus", "Get system status for a specific node (uptime, CPU, memory, disk)", inputSchema, async (args) => {
|
|
8
|
+
try {
|
|
9
|
+
const cmd = [
|
|
10
|
+
'echo "=== Uptime ==="',
|
|
11
|
+
"uptime",
|
|
12
|
+
'echo ""',
|
|
13
|
+
'echo "=== CPU Temperature ==="',
|
|
14
|
+
"cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null | awk '{printf \"%.1f C\\n\", $1/1000}' || echo 'N/A'",
|
|
15
|
+
'echo ""',
|
|
16
|
+
'echo "=== Memory ==="',
|
|
17
|
+
"free -h | head -2",
|
|
18
|
+
'echo ""',
|
|
19
|
+
'echo "=== Disk ==="',
|
|
20
|
+
"df -h / | tail -1",
|
|
21
|
+
].join(" && ");
|
|
22
|
+
const output = await execSSH(cmd, args.node);
|
|
23
|
+
return { content: [{ type: "text", text: output }] };
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return errorResponse(error);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=nodeStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeStatus.js","sourceRoot":"","sources":["../../src/tools/nodeStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;CAC5E,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,mEAAmE,EACnE,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,GAAG,GAAG;gBACV,uBAAuB;gBACvB,QAAQ;gBACR,SAAS;gBACT,gCAAgC;gBAChC,6GAA6G;gBAC7G,SAAS;gBACT,uBAAuB;gBACvB,mBAAmB;gBACnB,SAAS;gBACT,qBAAqB;gBACrB,mBAAmB;aACpB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEf,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npmCerts.d.ts","sourceRoot":"","sources":["../../src/tools/npmCerts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"npmCerts.d.ts","sourceRoot":"","sources":["../../src/tools/npmCerts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgCzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+ChD"}
|
package/dist/tools/npmCerts.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
2
2
|
import { CommandFailedError } from "../utils/errors.js";
|
|
3
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
3
4
|
const DEFAULT_PORT = 81;
|
|
4
5
|
const SERVICE_NAME = "Nginx Proxy Manager";
|
|
5
6
|
function getPort() {
|
|
@@ -12,21 +13,21 @@ function getCredentials() {
|
|
|
12
13
|
password: process.env.HOMELAB_NPM_PASSWORD || "changeme",
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
|
-
async function getNpmToken(port) {
|
|
16
|
+
async function getNpmToken(port, node) {
|
|
16
17
|
const { email, password } = getCredentials();
|
|
17
18
|
const payload = JSON.stringify({ identity: email, secret: password });
|
|
18
19
|
const output = await execSSH(`curl -sf -X POST -H 'Content-Type: application/json' ` +
|
|
19
|
-
`-d '${payload}' 'http://localhost:${port}/api/tokens'
|
|
20
|
+
`-d '${payload}' 'http://localhost:${port}/api/tokens'`, node);
|
|
20
21
|
const parsed = JSON.parse(output);
|
|
21
22
|
return parsed.token;
|
|
22
23
|
}
|
|
23
24
|
export function register(server) {
|
|
24
|
-
server.tool("homelab_npmCerts", "List SSL certificates managed by Nginx Proxy Manager with expiry dates", {}, async () => {
|
|
25
|
+
server.tool("homelab_npmCerts", "List SSL certificates managed by Nginx Proxy Manager with expiry dates", { ...nodeParam }, async (args) => {
|
|
25
26
|
const port = getPort();
|
|
26
27
|
try {
|
|
27
|
-
const token = await getNpmToken(port);
|
|
28
|
+
const token = await getNpmToken(port, args.node);
|
|
28
29
|
const output = await execSSH(`curl -sf -H 'Authorization: Bearer ${token}' ` +
|
|
29
|
-
`'http://localhost:${port}/api/nginx/certificates'
|
|
30
|
+
`'http://localhost:${port}/api/nginx/certificates'`, args.node);
|
|
30
31
|
return { content: [{ type: "text", text: output }] };
|
|
31
32
|
}
|
|
32
33
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npmCerts.js","sourceRoot":"","sources":["../../src/tools/npmCerts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"npmCerts.js","sourceRoot":"","sources":["../../src/tools/npmCerts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAE3C,SAAS,OAAO;IACd,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC9C,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;AAC1D,CAAC;AAED,SAAS,cAAc;IACrB,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,mBAAmB;QAC3D,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,UAAU;KACzD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAAa;IACpD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,uDAAuD;QACrD,OAAO,OAAO,uBAAuB,IAAI,cAAc,EACzD,IAAI,CACL,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,wEAAwE,EACxE,EAAE,GAAG,SAAS,EAAE,EAChB,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,sCAAsC,KAAK,IAAI;gBAC7C,qBAAqB,IAAI,0BAA0B,EACrD,IAAI,CAAC,IAAI,CACV,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,aAAa,CAClB,IAAI,KAAK,CACP,wBAAwB,YAAY,YAAY,IAAI,mBAAmB;wBACrE,mDAAmD,CACtD,CACF,CAAC;gBACJ,CAAC;gBACD,IAAI,KAAK,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;oBAC1B,OAAO,aAAa,CAClB,IAAI,KAAK,CACP,GAAG,YAAY,mDAAmD;wBAChE,iDAAiD,CACpD,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;gBACjC,OAAO,aAAa,CAClB,IAAI,KAAK,CACP,mBAAmB,YAAY,4BAA4B;oBACzD,gEAAgE,CACnE,CACF,CAAC;YACJ,CAAC;YACD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npmProxyHosts.d.ts","sourceRoot":"","sources":["../../src/tools/npmProxyHosts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"npmProxyHosts.d.ts","sourceRoot":"","sources":["../../src/tools/npmProxyHosts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgCzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+ChD"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
2
2
|
import { CommandFailedError } from "../utils/errors.js";
|
|
3
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
3
4
|
const DEFAULT_PORT = 81;
|
|
4
5
|
const SERVICE_NAME = "Nginx Proxy Manager";
|
|
5
6
|
function getPort() {
|
|
@@ -12,21 +13,21 @@ function getCredentials() {
|
|
|
12
13
|
password: process.env.HOMELAB_NPM_PASSWORD || "changeme",
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
|
-
async function getNpmToken(port) {
|
|
16
|
+
async function getNpmToken(port, node) {
|
|
16
17
|
const { email, password } = getCredentials();
|
|
17
18
|
const payload = JSON.stringify({ identity: email, secret: password });
|
|
18
19
|
const output = await execSSH(`curl -sf -X POST -H 'Content-Type: application/json' ` +
|
|
19
|
-
`-d '${payload}' 'http://localhost:${port}/api/tokens'
|
|
20
|
+
`-d '${payload}' 'http://localhost:${port}/api/tokens'`, node);
|
|
20
21
|
const parsed = JSON.parse(output);
|
|
21
22
|
return parsed.token;
|
|
22
23
|
}
|
|
23
24
|
export function register(server) {
|
|
24
|
-
server.tool("homelab_npmProxyHosts", "List all Nginx Proxy Manager proxy host configurations", {}, async () => {
|
|
25
|
+
server.tool("homelab_npmProxyHosts", "List all Nginx Proxy Manager proxy host configurations", { ...nodeParam }, async (args) => {
|
|
25
26
|
const port = getPort();
|
|
26
27
|
try {
|
|
27
|
-
const token = await getNpmToken(port);
|
|
28
|
+
const token = await getNpmToken(port, args.node);
|
|
28
29
|
const output = await execSSH(`curl -sf -H 'Authorization: Bearer ${token}' ` +
|
|
29
|
-
`'http://localhost:${port}/api/nginx/proxy-hosts'
|
|
30
|
+
`'http://localhost:${port}/api/nginx/proxy-hosts'`, args.node);
|
|
30
31
|
return { content: [{ type: "text", text: output }] };
|
|
31
32
|
}
|
|
32
33
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npmProxyHosts.js","sourceRoot":"","sources":["../../src/tools/npmProxyHosts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"npmProxyHosts.js","sourceRoot":"","sources":["../../src/tools/npmProxyHosts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAE3C,SAAS,OAAO;IACd,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC9C,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;AAC1D,CAAC;AAED,SAAS,cAAc;IACrB,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,mBAAmB;QAC3D,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,UAAU;KACzD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAAa;IACpD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,uDAAuD;QACrD,OAAO,OAAO,uBAAuB,IAAI,cAAc,EACzD,IAAI,CACL,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,wDAAwD,EACxD,EAAE,GAAG,SAAS,EAAE,EAChB,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,sCAAsC,KAAK,IAAI;gBAC7C,qBAAqB,IAAI,yBAAyB,EACpD,IAAI,CAAC,IAAI,CACV,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,aAAa,CAClB,IAAI,KAAK,CACP,wBAAwB,YAAY,YAAY,IAAI,mBAAmB;wBACrE,mDAAmD,CACtD,CACF,CAAC;gBACJ,CAAC;gBACD,IAAI,KAAK,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;oBAC1B,OAAO,aAAa,CAClB,IAAI,KAAK,CACP,GAAG,YAAY,mDAAmD;wBAChE,iDAAiD,CACpD,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;gBACjC,OAAO,aAAa,CAClB,IAAI,KAAK,CACP,mBAAmB,YAAY,4BAA4B;oBACzD,gEAAgE,CACnE,CACF,CAAC;YACJ,CAAC;YACD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ntfySend.d.ts","sourceRoot":"","sources":["../../src/tools/ntfySend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"ntfySend.d.ts","sourceRoot":"","sources":["../../src/tools/ntfySend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqCzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+BhD"}
|
package/dist/tools/ntfySend.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
3
3
|
import { CommandFailedError } from "../utils/errors.js";
|
|
4
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
4
5
|
const DEFAULT_PORT = 8080;
|
|
5
6
|
const SERVICE_NAME = "Ntfy";
|
|
6
7
|
const inputSchema = {
|
|
8
|
+
...nodeParam,
|
|
7
9
|
topic: z
|
|
8
10
|
.string()
|
|
9
11
|
.min(1)
|
|
@@ -42,7 +44,7 @@ export function register(server) {
|
|
|
42
44
|
headers.push(`-H 'Tags: ${args.tags}'`);
|
|
43
45
|
const escaped = args.message.replace(/'/g, "'\\''");
|
|
44
46
|
const cmd = `curl -sf -d '${escaped}' ${headers.join(" ")} 'http://localhost:${port}/${args.topic}'`;
|
|
45
|
-
const output = await execSSH(cmd);
|
|
47
|
+
const output = await execSSH(cmd, args.node);
|
|
46
48
|
return { content: [{ type: "text", text: output || `Notification sent to topic '${args.topic}'.` }] };
|
|
47
49
|
}
|
|
48
50
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ntfySend.js","sourceRoot":"","sources":["../../src/tools/ntfySend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"ntfySend.js","sourceRoot":"","sources":["../../src/tools/ntfySend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B,MAAM,WAAW,GAAG;IAClB,GAAG,SAAS;IACZ,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,0BAA0B,CAAC;IACvC,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,2BAA2B,CAAC;IACxC,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,oBAAoB,CAAC;IACjC,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;SACjD,QAAQ,EAAE;SACV,QAAQ,CAAC,6BAA6B,CAAC;IAC1C,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,qDAAqD,CAAC;CACnE,CAAC;AAEF,SAAS,OAAO;IACd,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC/C,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,mCAAmC,EACnC,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YACnE,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,gBAAgB,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;YACrG,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,IAAI,+BAA+B,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QACjH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,aAAa,CAClB,IAAI,KAAK,CACP,wBAAwB,YAAY,YAAY,IAAI,mBAAmB;wBACrE,oDAAoD,CACvD,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ntfyTopics.d.ts","sourceRoot":"","sources":["../../src/tools/ntfyTopics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"ntfyTopics.d.ts","sourceRoot":"","sources":["../../src/tools/ntfyTopics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0BzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2BhD"}
|
package/dist/tools/ntfyTopics.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
3
3
|
import { CommandFailedError } from "../utils/errors.js";
|
|
4
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
4
5
|
const DEFAULT_PORT = 8080;
|
|
5
6
|
const SERVICE_NAME = "Ntfy";
|
|
6
7
|
const inputSchema = {
|
|
8
|
+
...nodeParam,
|
|
7
9
|
topic: z
|
|
8
10
|
.string()
|
|
9
11
|
.optional()
|
|
@@ -24,7 +26,7 @@ export function register(server) {
|
|
|
24
26
|
try {
|
|
25
27
|
const topicPath = args.topic || "*";
|
|
26
28
|
const cmd = `curl -sf 'http://localhost:${port}/${topicPath}/json?since=${args.since}&poll=1'`;
|
|
27
|
-
const output = await execSSH(cmd);
|
|
29
|
+
const output = await execSSH(cmd, args.node);
|
|
28
30
|
return { content: [{ type: "text", text: output || "No recent messages found." }] };
|
|
29
31
|
}
|
|
30
32
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ntfyTopics.js","sourceRoot":"","sources":["../../src/tools/ntfyTopics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"ntfyTopics.js","sourceRoot":"","sources":["../../src/tools/ntfyTopics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B,MAAM,WAAW,GAAG;IAClB,GAAG,SAAS;IACZ,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;IAC5E,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,0DAA0D,CAAC;CACxE,CAAC;AAEF,SAAS,OAAO;IACd,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC/C,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,sCAAsC,EACtC,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;YACpC,MAAM,GAAG,GAAG,8BAA8B,IAAI,IAAI,SAAS,eAAe,IAAI,CAAC,KAAK,UAAU,CAAC;YAC/F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,IAAI,2BAA2B,EAAE,CAAC,EAAE,CAAC;QAC/F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,aAAa,CAClB,IAAI,KAAK,CACP,wBAAwB,YAAY,YAAY,IAAI,mBAAmB;wBACrE,oDAAoD,CACvD,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openPorts.d.ts","sourceRoot":"","sources":["../../src/tools/openPorts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"openPorts.d.ts","sourceRoot":"","sources":["../../src/tools/openPorts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAchD"}
|
package/dist/tools/openPorts.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
2
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
2
3
|
export function register(server) {
|
|
3
|
-
server.tool("homelab_openPorts", "Scan for listening TCP ports and map them to processes", {}, async () => {
|
|
4
|
+
server.tool("homelab_openPorts", "Scan for listening TCP ports and map them to processes", { ...nodeParam }, async (args) => {
|
|
4
5
|
try {
|
|
5
|
-
const output = await execSSH("sudo ss -tlnp 2>&1");
|
|
6
|
+
const output = await execSSH("sudo ss -tlnp 2>&1", args.node);
|
|
6
7
|
return { content: [{ type: "text", text: output }] };
|
|
7
8
|
}
|
|
8
9
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openPorts.js","sourceRoot":"","sources":["../../src/tools/openPorts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"openPorts.js","sourceRoot":"","sources":["../../src/tools/openPorts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,wDAAwD,EACxD,EAAE,GAAG,SAAS,EAAE,EAChB,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piReboot.d.ts","sourceRoot":"","sources":["../../src/tools/piReboot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"piReboot.d.ts","sourceRoot":"","sources":["../../src/tools/piReboot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyChD"}
|
package/dist/tools/piReboot.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
3
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
3
4
|
const inputSchema = {
|
|
5
|
+
...nodeParam,
|
|
4
6
|
confirm: z
|
|
5
7
|
.boolean()
|
|
6
8
|
.describe("Must be true to proceed with reboot. Safety check to prevent accidental reboots."),
|
|
@@ -16,16 +18,16 @@ export function register(server) {
|
|
|
16
18
|
}],
|
|
17
19
|
};
|
|
18
20
|
}
|
|
19
|
-
const containers = await execSSH("docker ps --format '{{.Names}}' 2>/dev/null | wc -l");
|
|
21
|
+
const containers = await execSSH("docker ps --format '{{.Names}}' 2>/dev/null | wc -l", args.node);
|
|
20
22
|
const count = parseInt(containers, 10) || 0;
|
|
21
23
|
let preCheck = "";
|
|
22
24
|
if (count > 0) {
|
|
23
25
|
preCheck = `Warning: ${count} running container(s) will be stopped.\n`;
|
|
24
26
|
}
|
|
25
|
-
const uptime = await execSSH("uptime -p");
|
|
27
|
+
const uptime = await execSSH("uptime -p", args.node);
|
|
26
28
|
preCheck += `Current uptime: ${uptime}\n`;
|
|
27
29
|
preCheck += "Initiating reboot...\n";
|
|
28
|
-
await execSSH("sudo shutdown -r +0");
|
|
30
|
+
await execSSH("sudo shutdown -r +0", args.node);
|
|
29
31
|
return {
|
|
30
32
|
content: [{ type: "text", text: preCheck + "Reboot command sent." }],
|
|
31
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piReboot.js","sourceRoot":"","sources":["../../src/tools/piReboot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"piReboot.js","sourceRoot":"","sources":["../../src/tools/piReboot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,WAAW,GAAG;IAClB,GAAG,SAAS;IACZ,OAAO,EAAE,CAAC;SACP,OAAO,EAAE;SACT,QAAQ,CAAC,kFAAkF,CAAC;CAChG,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,iFAAiF,EACjF,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,gDAAgD;yBACvD,CAAC;iBACH,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,OAAO,CAC9B,qDAAqD,EACrD,IAAI,CAAC,IAAI,CACV,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YAE5C,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,QAAQ,GAAG,YAAY,KAAK,0CAA0C,CAAC;YACzE,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,QAAQ,IAAI,mBAAmB,MAAM,IAAI,CAAC;YAC1C,QAAQ,IAAI,wBAAwB,CAAC;YAErC,MAAM,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEhD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,QAAQ,GAAG,sBAAsB,EAAE,CAAC;aAC9E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piStatus.d.ts","sourceRoot":"","sources":["../../src/tools/piStatus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"piStatus.d.ts","sourceRoot":"","sources":["../../src/tools/piStatus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8BhD"}
|
package/dist/tools/piStatus.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
1
2
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
2
3
|
export function register(server) {
|
|
3
|
-
server.tool("homelab_piStatus", "Get Raspberry Pi system status: CPU temp, memory, disk, uptime, and throttle state", {}, async () => {
|
|
4
|
+
server.tool("homelab_piStatus", "Get Raspberry Pi system status: CPU temp, memory, disk, uptime, and throttle state", { ...nodeParam }, async (args) => {
|
|
4
5
|
try {
|
|
5
6
|
const output = await execSSH([
|
|
6
7
|
'echo "=== Uptime ==="',
|
|
@@ -17,7 +18,7 @@ export function register(server) {
|
|
|
17
18
|
'echo ""',
|
|
18
19
|
'echo "=== Throttle Status ==="',
|
|
19
20
|
"vcgencmd get_throttled 2>/dev/null || echo 'N/A'",
|
|
20
|
-
].join(" && "));
|
|
21
|
+
].join(" && "), args.node);
|
|
21
22
|
return { content: [{ type: "text", text: output }] };
|
|
22
23
|
}
|
|
23
24
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piStatus.js","sourceRoot":"","sources":["../../src/tools/piStatus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,oFAAoF,EACpF,EAAE,
|
|
1
|
+
{"version":3,"file":"piStatus.js","sourceRoot":"","sources":["../../src/tools/piStatus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,oFAAoF,EACpF,EAAE,GAAG,SAAS,EAAE,EAChB,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,uBAAuB;gBACvB,QAAQ;gBACR,SAAS;gBACT,gCAAgC;gBAChC,mFAAmF;gBACnF,SAAS;gBACT,uBAAuB;gBACvB,mBAAmB;gBACnB,SAAS;gBACT,qBAAqB;gBACrB,mBAAmB;gBACnB,SAAS;gBACT,gCAAgC;gBAChC,kDAAkD;aACnD,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAE3B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prometheusQuery.d.ts","sourceRoot":"","sources":["../../src/tools/prometheusQuery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"prometheusQuery.d.ts","sourceRoot":"","sources":["../../src/tools/prometheusQuery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+BhD"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
3
3
|
import { CommandFailedError } from "../utils/errors.js";
|
|
4
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
4
5
|
const DEFAULT_PORT = 9090;
|
|
5
6
|
const SERVICE_NAME = "Prometheus";
|
|
6
7
|
const inputSchema = {
|
|
8
|
+
...nodeParam,
|
|
7
9
|
query: z.string().min(1).describe("PromQL expression to evaluate"),
|
|
8
10
|
time: z
|
|
9
11
|
.string()
|
|
@@ -20,7 +22,7 @@ export function register(server) {
|
|
|
20
22
|
try {
|
|
21
23
|
const encoded = encodeURIComponent(args.query);
|
|
22
24
|
const timeParam = args.time ? `&time=${encodeURIComponent(args.time)}` : "";
|
|
23
|
-
const output = await execSSH(`curl -sf 'http://localhost:${port}/api/v1/query?query=${encoded}${timeParam}'
|
|
25
|
+
const output = await execSSH(`curl -sf 'http://localhost:${port}/api/v1/query?query=${encoded}${timeParam}'`, args.node);
|
|
24
26
|
return { content: [{ type: "text", text: output }] };
|
|
25
27
|
}
|
|
26
28
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prometheusQuery.js","sourceRoot":"","sources":["../../src/tools/prometheusQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"prometheusQuery.js","sourceRoot":"","sources":["../../src/tools/prometheusQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,YAAY,CAAC;AAElC,MAAM,WAAW,GAAG;IAClB,GAAG,SAAS;IACZ,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAClE,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kEAAkE,CAAC;CAChF,CAAC;AAEF,SAAS,OAAO;IACd,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IACrD,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,6DAA6D,EAC7D,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,8BAA8B,IAAI,uBAAuB,OAAO,GAAG,SAAS,GAAG,EAC/E,IAAI,CAAC,IAAI,CACV,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,aAAa,CAClB,IAAI,KAAK,CACP,mBAAmB,YAAY,YAAY,IAAI,mBAAmB;wBAChE,0DAA0D,CAC7D,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceHealth.d.ts","sourceRoot":"","sources":["../../src/tools/serviceHealth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"serviceHealth.d.ts","sourceRoot":"","sources":["../../src/tools/serviceHealth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+BhD"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
3
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
3
4
|
const inputSchema = {
|
|
5
|
+
...nodeParam,
|
|
4
6
|
service: z
|
|
5
7
|
.string()
|
|
6
8
|
.optional()
|
|
@@ -10,8 +12,8 @@ export function register(server) {
|
|
|
10
12
|
server.tool("homelab_serviceHealth", "Check Docker container health status on the Pi", inputSchema, async (args) => {
|
|
11
13
|
try {
|
|
12
14
|
const filter = args.service ? `--filter "name=${args.service}"` : "";
|
|
13
|
-
const ps = await execSSH(`docker ps ${filter} --format "table {{.Names}}\\t{{.Status}}\\t{{.Ports}}"
|
|
14
|
-
const unhealthy = await execSSH(`docker ps ${filter} --filter "health=unhealthy" --format "{{.Names}}"
|
|
15
|
+
const ps = await execSSH(`docker ps ${filter} --format "table {{.Names}}\\t{{.Status}}\\t{{.Ports}}"`, args.node);
|
|
16
|
+
const unhealthy = await execSSH(`docker ps ${filter} --filter "health=unhealthy" --format "{{.Names}}"`, args.node);
|
|
15
17
|
let text = ps || "No containers found.";
|
|
16
18
|
if (unhealthy) {
|
|
17
19
|
text += `\n\nUnhealthy containers: ${unhealthy}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceHealth.js","sourceRoot":"","sources":["../../src/tools/serviceHealth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"serviceHealth.js","sourceRoot":"","sources":["../../src/tools/serviceHealth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,WAAW,GAAG;IAClB,GAAG,SAAS;IACZ,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mDAAmD,CAAC;CACjE,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,gDAAgD,EAChD,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,aAAa,MAAM,yDAAyD,EAC5E,IAAI,CAAC,IAAI,CACV,CAAC;YAEF,MAAM,SAAS,GAAG,MAAM,OAAO,CAC7B,aAAa,MAAM,oDAAoD,EACvE,IAAI,CAAC,IAAI,CACV,CAAC;YAEF,IAAI,IAAI,GAAG,EAAE,IAAI,sBAAsB,CAAC;YACxC,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,IAAI,6BAA6B,SAAS,EAAE,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,6BAA6B,CAAC;YACxC,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceLogs.d.ts","sourceRoot":"","sources":["../../src/tools/serviceLogs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"serviceLogs.d.ts","sourceRoot":"","sources":["../../src/tools/serviceLogs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuBhD"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
3
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
3
4
|
const inputSchema = {
|
|
5
|
+
...nodeParam,
|
|
4
6
|
service: z.string().min(1).describe("Container name to get logs from"),
|
|
5
7
|
lines: z
|
|
6
8
|
.number()
|
|
@@ -13,7 +15,7 @@ const inputSchema = {
|
|
|
13
15
|
export function register(server) {
|
|
14
16
|
server.tool("homelab_serviceLogs", "Tail recent logs from a Docker container on the Pi", inputSchema, async (args) => {
|
|
15
17
|
try {
|
|
16
|
-
const output = await execSSH(`docker logs --tail ${args.lines} ${args.service} 2>&1
|
|
18
|
+
const output = await execSSH(`docker logs --tail ${args.lines} ${args.service} 2>&1`, args.node);
|
|
17
19
|
return {
|
|
18
20
|
content: [{
|
|
19
21
|
type: "text",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceLogs.js","sourceRoot":"","sources":["../../src/tools/serviceLogs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"serviceLogs.js","sourceRoot":"","sources":["../../src/tools/serviceLogs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,WAAW,GAAG;IAClB,GAAG,SAAS;IACZ,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACtE,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,sCAAsC,CAAC;CACpD,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,oDAAoD,EACpD,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,sBAAsB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,OAAO,EACvD,IAAI,CAAC,IAAI,CACV,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,MAAM,IAAI,qBAAqB,IAAI,CAAC,OAAO,GAAG;qBACrD,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceRestart.d.ts","sourceRoot":"","sources":["../../src/tools/serviceRestart.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"serviceRestart.d.ts","sourceRoot":"","sources":["../../src/tools/serviceRestart.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwBhD"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
3
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
3
4
|
const inputSchema = {
|
|
5
|
+
...nodeParam,
|
|
4
6
|
service: z.string().min(1).describe("Container name to restart"),
|
|
5
7
|
};
|
|
6
8
|
export function register(server) {
|
|
7
9
|
server.tool("homelab_serviceRestart", "Restart a Docker container on the Pi", inputSchema, async (args) => {
|
|
8
10
|
try {
|
|
9
|
-
await execSSH(`docker restart ${args.service}
|
|
10
|
-
const status = await execSSH(`docker ps --filter "name=${args.service}" --format "{{.Names}}\\t{{.Status}}"
|
|
11
|
+
await execSSH(`docker restart ${args.service}`, args.node);
|
|
12
|
+
const status = await execSSH(`docker ps --filter "name=${args.service}" --format "{{.Names}}\\t{{.Status}}"`, args.node);
|
|
11
13
|
return {
|
|
12
14
|
content: [{
|
|
13
15
|
type: "text",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceRestart.js","sourceRoot":"","sources":["../../src/tools/serviceRestart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"serviceRestart.js","sourceRoot":"","sources":["../../src/tools/serviceRestart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,WAAW,GAAG;IAClB,GAAG,SAAS;IACZ,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;CACjE,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,sCAAsC,EACtC,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,kBAAkB,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,4BAA4B,IAAI,CAAC,OAAO,uCAAuC,EAC/E,IAAI,CAAC,IAAI,CACV,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,aAAa,IAAI,CAAC,OAAO,MAAM,MAAM,EAAE;qBAC9C,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speedtestResults.d.ts","sourceRoot":"","sources":["../../src/tools/speedtestResults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"speedtestResults.d.ts","sourceRoot":"","sources":["../../src/tools/speedtestResults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6BhD"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
3
3
|
import { CommandFailedError } from "../utils/errors.js";
|
|
4
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
4
5
|
const DEFAULT_PORT = 8765;
|
|
5
6
|
const SERVICE_NAME = "Speedtest Tracker";
|
|
6
7
|
const inputSchema = {
|
|
8
|
+
...nodeParam,
|
|
7
9
|
count: z
|
|
8
10
|
.number()
|
|
9
11
|
.int()
|
|
@@ -20,7 +22,7 @@ export function register(server) {
|
|
|
20
22
|
server.tool("homelab_speedtestResults", "Get recent speedtest results from Speedtest Tracker", inputSchema, async (args) => {
|
|
21
23
|
const port = getPort();
|
|
22
24
|
try {
|
|
23
|
-
const output = await execSSH(`curl -sf 'http://localhost:${port}/api/speedtest/latest?limit=${args.count}'
|
|
25
|
+
const output = await execSSH(`curl -sf 'http://localhost:${port}/api/speedtest/latest?limit=${args.count}'`, args.node);
|
|
24
26
|
return { content: [{ type: "text", text: output }] };
|
|
25
27
|
}
|
|
26
28
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speedtestResults.js","sourceRoot":"","sources":["../../src/tools/speedtestResults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"speedtestResults.js","sourceRoot":"","sources":["../../src/tools/speedtestResults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC,MAAM,WAAW,GAAG;IAClB,GAAG,SAAS;IACZ,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,8CAA8C,CAAC;CAC5D,CAAC;AAEF,SAAS,OAAO;IACd,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACpD,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,qDAAqD,EACrD,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,8BAA8B,IAAI,+BAA+B,IAAI,CAAC,KAAK,GAAG,EAC9E,IAAI,CAAC,IAAI,CACV,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,aAAa,CAClB,IAAI,KAAK,CACP,wBAAwB,YAAY,YAAY,IAAI,mBAAmB;wBACrE,yDAAyD,CAC5D,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sshTest.d.ts","sourceRoot":"","sources":["../../src/tools/sshTest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"sshTest.d.ts","sourceRoot":"","sources":["../../src/tools/sshTest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4BhD"}
|
package/dist/tools/sshTest.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
2
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
2
3
|
export function register(server) {
|
|
3
|
-
server.tool("homelab_sshTest", "Test SSH connectivity to the Raspberry Pi", {}, async () => {
|
|
4
|
+
server.tool("homelab_sshTest", "Test SSH connectivity to the Raspberry Pi", { ...nodeParam }, async (args) => {
|
|
4
5
|
try {
|
|
5
6
|
const host = process.env.HOMELAB_PI_HOST || "raspi5.local";
|
|
6
7
|
const user = process.env.HOMELAB_PI_USER || "tmhs";
|
|
7
|
-
const output = await execSSH("echo ok && hostname && uptime -p");
|
|
8
|
+
const output = await execSSH("echo ok && hostname && uptime -p", args.node);
|
|
8
9
|
const lines = output.split("\n");
|
|
9
10
|
return {
|
|
10
11
|
content: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sshTest.js","sourceRoot":"","sources":["../../src/tools/sshTest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"sshTest.js","sourceRoot":"","sources":["../../src/tools/sshTest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,2CAA2C,EAC3C,EAAE,GAAG,SAAS,EAAE,EAChB,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,cAAc,CAAC;YAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC;YAEnD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,kCAAkC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEjC,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACJ,qBAAqB,IAAI,IAAI,IAAI,MAAM;4BACvC,aAAa,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE;4BACpC,WAAW,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE;yBACnC,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"systemdServices.d.ts","sourceRoot":"","sources":["../../src/tools/systemdServices.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"systemdServices.d.ts","sourceRoot":"","sources":["../../src/tools/systemdServices.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiBhD"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { execSSH, errorResponse } from "../utils/ssh-api.js";
|
|
3
|
+
import { nodeParam } from "../utils/node-param.js";
|
|
3
4
|
const inputSchema = {
|
|
5
|
+
...nodeParam,
|
|
4
6
|
unit: z
|
|
5
7
|
.string()
|
|
6
8
|
.optional()
|
|
@@ -16,7 +18,7 @@ export function register(server) {
|
|
|
16
18
|
const cmd = args.unit
|
|
17
19
|
? `systemctl status '${args.unit}' --no-pager 2>&1`
|
|
18
20
|
: `systemctl list-units --type=${args.type || "service"} --no-pager 2>&1`;
|
|
19
|
-
const output = await execSSH(cmd);
|
|
21
|
+
const output = await execSSH(cmd, args.node);
|
|
20
22
|
return { content: [{ type: "text", text: output }] };
|
|
21
23
|
}
|
|
22
24
|
catch (error) {
|