@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.
Files changed (163) hide show
  1. package/README.md +10 -1
  2. package/dist/index.js +15 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/tools/adguardFilters.d.ts.map +1 -1
  5. package/dist/tools/adguardFilters.js +3 -2
  6. package/dist/tools/adguardFilters.js.map +1 -1
  7. package/dist/tools/adguardQueryLog.d.ts.map +1 -1
  8. package/dist/tools/adguardQueryLog.js +3 -1
  9. package/dist/tools/adguardQueryLog.js.map +1 -1
  10. package/dist/tools/adguardStats.d.ts.map +1 -1
  11. package/dist/tools/adguardStats.js +3 -2
  12. package/dist/tools/adguardStats.js.map +1 -1
  13. package/dist/tools/alertList.d.ts.map +1 -1
  14. package/dist/tools/alertList.js +3 -1
  15. package/dist/tools/alertList.js.map +1 -1
  16. package/dist/tools/aptHistory.d.ts.map +1 -1
  17. package/dist/tools/aptHistory.js +3 -1
  18. package/dist/tools/aptHistory.js.map +1 -1
  19. package/dist/tools/aptUpdate.d.ts.map +1 -1
  20. package/dist/tools/aptUpdate.js +3 -1
  21. package/dist/tools/aptUpdate.js.map +1 -1
  22. package/dist/tools/aptUpgradable.d.ts.map +1 -1
  23. package/dist/tools/aptUpgradable.js +4 -3
  24. package/dist/tools/aptUpgradable.js.map +1 -1
  25. package/dist/tools/backupDiff.d.ts.map +1 -1
  26. package/dist/tools/backupDiff.js +3 -1
  27. package/dist/tools/backupDiff.js.map +1 -1
  28. package/dist/tools/backupList.d.ts.map +1 -1
  29. package/dist/tools/backupList.js +3 -1
  30. package/dist/tools/backupList.js.map +1 -1
  31. package/dist/tools/backupRestore.d.ts.map +1 -1
  32. package/dist/tools/backupRestore.js +3 -1
  33. package/dist/tools/backupRestore.js.map +1 -1
  34. package/dist/tools/backupRun.d.ts.map +1 -1
  35. package/dist/tools/backupRun.js +3 -1
  36. package/dist/tools/backupRun.js.map +1 -1
  37. package/dist/tools/backupStatus.d.ts.map +1 -1
  38. package/dist/tools/backupStatus.js +3 -1
  39. package/dist/tools/backupStatus.js.map +1 -1
  40. package/dist/tools/certCheck.d.ts +3 -0
  41. package/dist/tools/certCheck.d.ts.map +1 -0
  42. package/dist/tools/certCheck.js +31 -0
  43. package/dist/tools/certCheck.js.map +1 -0
  44. package/dist/tools/certList.d.ts +3 -0
  45. package/dist/tools/certList.d.ts.map +1 -0
  46. package/dist/tools/certList.js +40 -0
  47. package/dist/tools/certList.js.map +1 -0
  48. package/dist/tools/certRenew.d.ts +3 -0
  49. package/dist/tools/certRenew.d.ts.map +1 -0
  50. package/dist/tools/certRenew.js +47 -0
  51. package/dist/tools/certRenew.js.map +1 -0
  52. package/dist/tools/composeDown.d.ts.map +1 -1
  53. package/dist/tools/composeDown.js +3 -1
  54. package/dist/tools/composeDown.js.map +1 -1
  55. package/dist/tools/composePs.d.ts.map +1 -1
  56. package/dist/tools/composePs.js +3 -2
  57. package/dist/tools/composePs.js.map +1 -1
  58. package/dist/tools/composePull.d.ts.map +1 -1
  59. package/dist/tools/composePull.js +3 -1
  60. package/dist/tools/composePull.js.map +1 -1
  61. package/dist/tools/composeUp.d.ts.map +1 -1
  62. package/dist/tools/composeUp.js +3 -1
  63. package/dist/tools/composeUp.js.map +1 -1
  64. package/dist/tools/containerScan.d.ts.map +1 -1
  65. package/dist/tools/containerScan.js +4 -2
  66. package/dist/tools/containerScan.js.map +1 -1
  67. package/dist/tools/diskUsage.d.ts.map +1 -1
  68. package/dist/tools/diskUsage.js +3 -1
  69. package/dist/tools/diskUsage.js.map +1 -1
  70. package/dist/tools/fail2banStatus.d.ts.map +1 -1
  71. package/dist/tools/fail2banStatus.js +3 -1
  72. package/dist/tools/fail2banStatus.js.map +1 -1
  73. package/dist/tools/grafanaSnapshot.d.ts.map +1 -1
  74. package/dist/tools/grafanaSnapshot.js +3 -1
  75. package/dist/tools/grafanaSnapshot.js.map +1 -1
  76. package/dist/tools/inventorySync.d.ts +3 -0
  77. package/dist/tools/inventorySync.d.ts.map +1 -0
  78. package/dist/tools/inventorySync.js +36 -0
  79. package/dist/tools/inventorySync.js.map +1 -0
  80. package/dist/tools/journalLogs.d.ts.map +1 -1
  81. package/dist/tools/journalLogs.js +3 -1
  82. package/dist/tools/journalLogs.js.map +1 -1
  83. package/dist/tools/kernelInfo.d.ts.map +1 -1
  84. package/dist/tools/kernelInfo.js +4 -3
  85. package/dist/tools/kernelInfo.js.map +1 -1
  86. package/dist/tools/logSearch.d.ts.map +1 -1
  87. package/dist/tools/logSearch.js +3 -1
  88. package/dist/tools/logSearch.js.map +1 -1
  89. package/dist/tools/networkInfo.d.ts.map +1 -1
  90. package/dist/tools/networkInfo.js +3 -2
  91. package/dist/tools/networkInfo.js.map +1 -1
  92. package/dist/tools/nodeExec.d.ts +3 -0
  93. package/dist/tools/nodeExec.d.ts.map +1 -0
  94. package/dist/tools/nodeExec.js +34 -0
  95. package/dist/tools/nodeExec.js.map +1 -0
  96. package/dist/tools/nodeList.d.ts +3 -0
  97. package/dist/tools/nodeList.d.ts.map +1 -0
  98. package/dist/tools/nodeList.js +24 -0
  99. package/dist/tools/nodeList.js.map +1 -0
  100. package/dist/tools/nodeStatus.d.ts +3 -0
  101. package/dist/tools/nodeStatus.d.ts.map +1 -0
  102. package/dist/tools/nodeStatus.js +30 -0
  103. package/dist/tools/nodeStatus.js.map +1 -0
  104. package/dist/tools/npmCerts.d.ts.map +1 -1
  105. package/dist/tools/npmCerts.js +6 -5
  106. package/dist/tools/npmCerts.js.map +1 -1
  107. package/dist/tools/npmProxyHosts.d.ts.map +1 -1
  108. package/dist/tools/npmProxyHosts.js +6 -5
  109. package/dist/tools/npmProxyHosts.js.map +1 -1
  110. package/dist/tools/ntfySend.d.ts.map +1 -1
  111. package/dist/tools/ntfySend.js +3 -1
  112. package/dist/tools/ntfySend.js.map +1 -1
  113. package/dist/tools/ntfyTopics.d.ts.map +1 -1
  114. package/dist/tools/ntfyTopics.js +3 -1
  115. package/dist/tools/ntfyTopics.js.map +1 -1
  116. package/dist/tools/openPorts.d.ts.map +1 -1
  117. package/dist/tools/openPorts.js +3 -2
  118. package/dist/tools/openPorts.js.map +1 -1
  119. package/dist/tools/piReboot.d.ts.map +1 -1
  120. package/dist/tools/piReboot.js +5 -3
  121. package/dist/tools/piReboot.js.map +1 -1
  122. package/dist/tools/piStatus.d.ts.map +1 -1
  123. package/dist/tools/piStatus.js +3 -2
  124. package/dist/tools/piStatus.js.map +1 -1
  125. package/dist/tools/prometheusQuery.d.ts.map +1 -1
  126. package/dist/tools/prometheusQuery.js +3 -1
  127. package/dist/tools/prometheusQuery.js.map +1 -1
  128. package/dist/tools/serviceHealth.d.ts.map +1 -1
  129. package/dist/tools/serviceHealth.js +4 -2
  130. package/dist/tools/serviceHealth.js.map +1 -1
  131. package/dist/tools/serviceLogs.d.ts.map +1 -1
  132. package/dist/tools/serviceLogs.js +3 -1
  133. package/dist/tools/serviceLogs.js.map +1 -1
  134. package/dist/tools/serviceRestart.d.ts.map +1 -1
  135. package/dist/tools/serviceRestart.js +4 -2
  136. package/dist/tools/serviceRestart.js.map +1 -1
  137. package/dist/tools/speedtestResults.d.ts.map +1 -1
  138. package/dist/tools/speedtestResults.js +3 -1
  139. package/dist/tools/speedtestResults.js.map +1 -1
  140. package/dist/tools/sshTest.d.ts.map +1 -1
  141. package/dist/tools/sshTest.js +3 -2
  142. package/dist/tools/sshTest.js.map +1 -1
  143. package/dist/tools/systemdServices.d.ts.map +1 -1
  144. package/dist/tools/systemdServices.js +3 -1
  145. package/dist/tools/systemdServices.js.map +1 -1
  146. package/dist/tools/ufwStatus.d.ts.map +1 -1
  147. package/dist/tools/ufwStatus.js +3 -2
  148. package/dist/tools/ufwStatus.js.map +1 -1
  149. package/dist/tools/uptimeKumaStatus.d.ts.map +1 -1
  150. package/dist/tools/uptimeKumaStatus.js +3 -2
  151. package/dist/tools/uptimeKumaStatus.js.map +1 -1
  152. package/dist/tools/volumeBackup.d.ts.map +1 -1
  153. package/dist/tools/volumeBackup.js +3 -1
  154. package/dist/tools/volumeBackup.js.map +1 -1
  155. package/dist/utils/node-param.d.ts +5 -0
  156. package/dist/utils/node-param.d.ts.map +1 -0
  157. package/dist/utils/node-param.js +8 -0
  158. package/dist/utils/node-param.js.map +1 -0
  159. package/dist/utils/ssh-api.d.ts +12 -1
  160. package/dist/utils/ssh-api.d.ts.map +1 -1
  161. package/dist/utils/ssh-api.js +50 -7
  162. package/dist/utils/ssh-api.js.map +1 -1
  163. 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,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=nodeStatus.d.ts.map
@@ -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;AA8BzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8ChD"}
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"}
@@ -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;AAExD,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;IACrC,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,CAC1D,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,EACF,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,sCAAsC,KAAK,IAAI;gBAC7C,qBAAqB,IAAI,0BAA0B,CACtD,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
+ {"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;AA8BzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8ChD"}
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;AAExD,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;IACrC,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,CAC1D,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,EACF,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,sCAAsC,KAAK,IAAI;gBAC7C,qBAAqB,IAAI,yBAAyB,CACrD,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
+ {"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;AAmCzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+BhD"}
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"}
@@ -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":"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"}
1
+ {"version":3,"file":"ntfySend.js","sourceRoot":"","sources":["../../src/tools/ntfySend.ts"],"names":[],"mappings":"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"}
@@ -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;AAwBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2BhD"}
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"}
@@ -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;AAExD,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B,MAAM,WAAW,GAAG;IAClB,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,CAAC,CAAC;YAClC,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
+ {"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;AAGzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAchD"}
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"}
@@ -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;AAE7D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,wDAAwD,EACxD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;YACnD,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
+ {"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;AASzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsChD"}
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"}
@@ -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;AAE7D,MAAM,WAAW,GAAG;IAClB,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,CAAC,qDAAqD,CAAC,CAAC;YACxF,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,CAAC,CAAC;YAC1C,QAAQ,IAAI,mBAAmB,MAAM,IAAI,CAAC;YAC1C,QAAQ,IAAI,wBAAwB,CAAC;YAErC,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC;YAErC,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
+ {"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;AAGzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8BhD"}
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"}
@@ -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,EACF,KAAK,IAAI,EAAE;QACT,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,CAAC,CAAC;YAEhB,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
+ {"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;AAoBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8BhD"}
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;AAExD,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,YAAY,CAAC;AAElC,MAAM,WAAW,GAAG;IAClB,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,CAChF,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
+ {"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;AAUzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6BhD"}
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;AAE7D,MAAM,WAAW,GAAG;IAClB,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,CAC7E,CAAC;YAEF,MAAM,SAAS,GAAG,MAAM,OAAO,CAC7B,aAAa,MAAM,oDAAoD,CACxE,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
+ {"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;AAczE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsBhD"}
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;AAE7D,MAAM,WAAW,GAAG;IAClB,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,CACxD,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
+ {"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;AAOzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuBhD"}
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;AAE7D,MAAM,WAAW,GAAG;IAClB,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,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,4BAA4B,IAAI,CAAC,OAAO,uCAAuC,CAChF,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
+ {"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;AAsBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4BhD"}
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;AAExD,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC,MAAM,WAAW,GAAG;IAClB,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,CAC/E,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
+ {"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;AAGzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4BhD"}
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"}
@@ -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;AAE7D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,2CAA2C,EAC3C,EAAE,EACF,KAAK,IAAI,EAAE;QACT,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,CAAC,CAAC;YACjE,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
+ {"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;AAczE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiBhD"}
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) {