zapret2-mcp 0.3.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 (76) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/LICENSE +21 -0
  3. package/README.md +238 -0
  4. package/build/executor/docker.d.ts +7 -0
  5. package/build/executor/docker.js +22 -0
  6. package/build/executor/docker.js.map +1 -0
  7. package/build/executor/factory.d.ts +2 -0
  8. package/build/executor/factory.js +27 -0
  9. package/build/executor/factory.js.map +1 -0
  10. package/build/executor/index.d.ts +6 -0
  11. package/build/executor/index.js +5 -0
  12. package/build/executor/index.js.map +1 -0
  13. package/build/executor/local.d.ts +5 -0
  14. package/build/executor/local.js +17 -0
  15. package/build/executor/local.js.map +1 -0
  16. package/build/executor/ssh.d.ts +13 -0
  17. package/build/executor/ssh.js +33 -0
  18. package/build/executor/ssh.js.map +1 -0
  19. package/build/executor/types.d.ts +8 -0
  20. package/build/executor/types.js +2 -0
  21. package/build/executor/types.js.map +1 -0
  22. package/build/executorInstance.d.ts +3 -0
  23. package/build/executorInstance.js +11 -0
  24. package/build/executorInstance.js.map +1 -0
  25. package/build/index.d.ts +2 -0
  26. package/build/index.js +75 -0
  27. package/build/index.js.map +1 -0
  28. package/build/logStore.d.ts +12 -0
  29. package/build/logStore.js +76 -0
  30. package/build/logStore.js.map +1 -0
  31. package/build/prompts.d.ts +2 -0
  32. package/build/prompts.js +156 -0
  33. package/build/prompts.js.map +1 -0
  34. package/build/resources.d.ts +2 -0
  35. package/build/resources.js +41 -0
  36. package/build/resources.js.map +1 -0
  37. package/build/tools/checkPrerequisites.d.ts +19 -0
  38. package/build/tools/checkPrerequisites.js +116 -0
  39. package/build/tools/checkPrerequisites.js.map +1 -0
  40. package/build/tools/configureDns.d.ts +35 -0
  41. package/build/tools/configureDns.js +106 -0
  42. package/build/tools/configureDns.js.map +1 -0
  43. package/build/tools/createSystemdService.d.ts +27 -0
  44. package/build/tools/createSystemdService.js +74 -0
  45. package/build/tools/createSystemdService.js.map +1 -0
  46. package/build/tools/detectSystem.d.ts +19 -0
  47. package/build/tools/detectSystem.js +89 -0
  48. package/build/tools/detectSystem.js.map +1 -0
  49. package/build/tools/getConfig.d.ts +27 -0
  50. package/build/tools/getConfig.js +30 -0
  51. package/build/tools/getConfig.js.map +1 -0
  52. package/build/tools/getStatus.d.ts +19 -0
  53. package/build/tools/getStatus.js +35 -0
  54. package/build/tools/getStatus.js.map +1 -0
  55. package/build/tools/installZapret.d.ts +31 -0
  56. package/build/tools/installZapret.js +84 -0
  57. package/build/tools/installZapret.js.map +1 -0
  58. package/build/tools/restartService.d.ts +19 -0
  59. package/build/tools/restartService.js +24 -0
  60. package/build/tools/restartService.js.map +1 -0
  61. package/build/tools/runBlockcheck.d.ts +31 -0
  62. package/build/tools/runBlockcheck.js +44 -0
  63. package/build/tools/runBlockcheck.js.map +1 -0
  64. package/build/tools/startService.d.ts +19 -0
  65. package/build/tools/startService.js +24 -0
  66. package/build/tools/startService.js.map +1 -0
  67. package/build/tools/stopService.d.ts +19 -0
  68. package/build/tools/stopService.js +24 -0
  69. package/build/tools/stopService.js.map +1 -0
  70. package/build/tools/updateConfig.d.ts +31 -0
  71. package/build/tools/updateConfig.js +50 -0
  72. package/build/tools/updateConfig.js.map +1 -0
  73. package/build/tools/verifyBypass.d.ts +31 -0
  74. package/build/tools/verifyBypass.js +62 -0
  75. package/build/tools/verifyBypass.js.map +1 -0
  76. package/package.json +64 -0
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ import { getExecutor } from "../executorInstance.js";
3
+ import { saveLog } from "../logStore.js";
4
+ export const stopServiceTool = {
5
+ name: "stopService",
6
+ description: "Stop zapret2 service (nfqws2 daemon). Logs saved to resources. Required before runBlockcheck.",
7
+ schema: z.object({}),
8
+ handler: async () => {
9
+ try {
10
+ const { stdout, stderr } = await getExecutor().exec("/opt/zapret2/init.d/sysv/zapret2 stop");
11
+ const output = (stdout + stderr).trim() || "Service stopped";
12
+ saveLog("service", output, { action: "stop" });
13
+ return { content: [{ type: "text", text: output }] };
14
+ }
15
+ catch (err) {
16
+ const e = err;
17
+ return {
18
+ content: [{ type: "text", text: `Error: ${(e.stdout || "") + (e.stderr || "") || e.error?.message || "unknown error"}` }],
19
+ isError: true,
20
+ };
21
+ }
22
+ },
23
+ };
24
+ //# sourceMappingURL=stopService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stopService.js","sourceRoot":"","sources":["../../src/tools/stopService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,+FAA+F;IAC5G,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YAC7F,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,iBAAiB,CAAC;YAC7D,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBAClI,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ export declare const updateConfigTool: {
3
+ name: string;
4
+ description: string;
5
+ schema: z.ZodObject<{
6
+ key: z.ZodString;
7
+ value: z.ZodString;
8
+ }, "strip", z.ZodTypeAny, {
9
+ value: string;
10
+ key: string;
11
+ }, {
12
+ value: string;
13
+ key: string;
14
+ }>;
15
+ handler: (args: {
16
+ key: string;
17
+ value: string;
18
+ }) => Promise<{
19
+ content: {
20
+ type: "text";
21
+ text: string;
22
+ }[];
23
+ isError: boolean;
24
+ } | {
25
+ content: {
26
+ type: "text";
27
+ text: string;
28
+ }[];
29
+ isError?: undefined;
30
+ }>;
31
+ };
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ import { getExecutor } from "../executorInstance.js";
3
+ import { saveLog } from "../logStore.js";
4
+ export const updateConfigTool = {
5
+ name: "updateConfig",
6
+ description: "Update a parameter in zapret2 config (/opt/zapret2/config). Replaces the value of an existing key. Config snapshot saved to resources before change. Restart service to apply.",
7
+ schema: z.object({
8
+ key: z.string().describe("Config key to update (e.g. NFQWS2_ENABLE, NFQWS2_OPT)"),
9
+ value: z.string().describe("New value for the key"),
10
+ }),
11
+ handler: async (args) => {
12
+ const { key, value } = args;
13
+ const safeKey = key.replace(/[^A-Za-z0-9_]/g, "");
14
+ if (safeKey !== key) {
15
+ return {
16
+ content: [{ type: "text", text: "Error: key must contain only alphanumeric characters and underscores" }],
17
+ isError: true,
18
+ };
19
+ }
20
+ const b64Value = Buffer.from(value).toString("base64");
21
+ try {
22
+ // Snapshot config before change
23
+ const { stdout: configSnapshot } = await getExecutor().exec("cat /opt/zapret2/config");
24
+ saveLog("config", configSnapshot, { key: safeKey, value });
25
+ const script = `
26
+ VALUE=$(printf '%s' '${b64Value}' | base64 -d)
27
+ export VALUE
28
+ if grep -qE '^${safeKey}=' /opt/zapret2/config; then
29
+ awk -v key="${safeKey}" 'BEGIN{val=ENVIRON["VALUE"]} $0 ~ "^" key "=" {print key "=" val; next} {print}' /opt/zapret2/config > /opt/zapret2/config.tmp && mv /opt/zapret2/config.tmp /opt/zapret2/config
30
+ echo "Updated ${safeKey}:"
31
+ grep -E '^${safeKey}=' /opt/zapret2/config
32
+ else
33
+ printf '%s=%s\\n' '${safeKey}' "$VALUE" >> /opt/zapret2/config
34
+ echo "Added ${safeKey}:"
35
+ grep -E '^${safeKey}=' /opt/zapret2/config
36
+ fi
37
+ `;
38
+ const { stdout } = await getExecutor().exec(script);
39
+ return { content: [{ type: "text", text: stdout.trim() }] };
40
+ }
41
+ catch (err) {
42
+ const e = err;
43
+ return {
44
+ content: [{ type: "text", text: `Error: ${e.stderr || e.error?.message || "unknown error"}` }],
45
+ isError: true,
46
+ };
47
+ }
48
+ },
49
+ };
50
+ //# sourceMappingURL=updateConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateConfig.js","sourceRoot":"","sources":["../../src/tools/updateConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,gLAAgL;IAC7L,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;QACjF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KACpD,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAoC,EAAE,EAAE;QACtD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAE5B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,sEAAsE,EAAE,CAAC;gBAClH,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEvD,IAAI,CAAC;YACH,gCAAgC;YAChC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACvF,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3D,MAAM,MAAM,GAAG;+BACU,QAAQ;;wBAEf,OAAO;wBACP,OAAO;0BACL,OAAO;sBACX,OAAO;;+BAEE,OAAO;wBACd,OAAO;sBACT,OAAO;;OAEtB,CAAC;YACF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACvG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ export declare const verifyBypassTool: {
3
+ name: string;
4
+ description: string;
5
+ schema: z.ZodObject<{
6
+ domain: z.ZodDefault<z.ZodString>;
7
+ timeout: z.ZodDefault<z.ZodNumber>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ domain: string;
10
+ timeout: number;
11
+ }, {
12
+ domain?: string | undefined;
13
+ timeout?: number | undefined;
14
+ }>;
15
+ handler: (args: {
16
+ domain?: string;
17
+ timeout?: number;
18
+ }) => Promise<{
19
+ content: {
20
+ type: "text";
21
+ text: string;
22
+ }[];
23
+ isError?: undefined;
24
+ } | {
25
+ content: {
26
+ type: "text";
27
+ text: string;
28
+ }[];
29
+ isError: boolean;
30
+ }>;
31
+ };
@@ -0,0 +1,62 @@
1
+ import { z } from "zod";
2
+ import { getExecutor } from "../executorInstance.js";
3
+ export const verifyBypassTool = {
4
+ name: "verifyBypass",
5
+ description: "Verify network connectivity: DNS resolution, HTTP request, and nfqws2 running status for a given domain. Use after startService or restartService to confirm zapret2 is working.",
6
+ schema: z.object({
7
+ domain: z.string().default("example.com").describe("Domain to verify bypass for (default: example.com)"),
8
+ timeout: z.number().default(10).describe("HTTP request timeout in seconds (default: 10)"),
9
+ }),
10
+ handler: async (args) => {
11
+ const domain = args.domain || "example.com";
12
+ const timeout = args.timeout || 10;
13
+ const script = `
14
+ DNS_RESOLVED="false"
15
+ DNS_IP=""
16
+ IP=$(nslookup "${domain}" 2>/dev/null | grep -A1 "Name:" | grep "Address:" | head -1 | awk '{print $2}')
17
+ if [ -z "$IP" ]; then
18
+ IP=$(getent hosts "${domain}" 2>/dev/null | awk '{print $1}' | head -1)
19
+ fi
20
+ if [ -n "$IP" ]; then
21
+ DNS_RESOLVED="true"
22
+ DNS_IP="$IP"
23
+ fi
24
+
25
+ HTTP_CODE="0"
26
+ CURL_EXIT="0"
27
+ if command -v curl >/dev/null 2>&1; then
28
+ HTTP_CODE=$(curl -sL -o /dev/null -w '%{http_code}' --max-time ${timeout} "https://${domain}/" 2>/dev/null || true)
29
+ CURL_EXIT=$?
30
+ if [ -z "$HTTP_CODE" ]; then HTTP_CODE="0"; fi
31
+ fi
32
+
33
+ ZAPRET_RUNNING="false"
34
+ if pgrep -x nfqws2 >/dev/null 2>&1; then
35
+ ZAPRET_RUNNING="true"
36
+ fi
37
+
38
+ cat <<EOJSON
39
+ {
40
+ "domain": "${domain}",
41
+ "dnsResolved": $DNS_RESOLVED,
42
+ "dnsIp": "$DNS_IP",
43
+ "httpCode": "$HTTP_CODE",
44
+ "curlExit": "$CURL_EXIT",
45
+ "zapretRunning": $ZAPRET_RUNNING
46
+ }
47
+ EOJSON
48
+ `;
49
+ try {
50
+ const { stdout } = await getExecutor().exec(script, (timeout + 5) * 1000);
51
+ return { content: [{ type: "text", text: stdout.trim() }] };
52
+ }
53
+ catch (err) {
54
+ const e = err;
55
+ return {
56
+ content: [{ type: "text", text: `Error: ${e.stderr || e.error?.message || "unknown error"}` }],
57
+ isError: true,
58
+ };
59
+ }
60
+ },
61
+ };
62
+ //# sourceMappingURL=verifyBypass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyBypass.js","sourceRoot":"","sources":["../../src/tools/verifyBypass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,kLAAkL;IAC/L,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,oDAAoD,CAAC;QACxG,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC;KAC1F,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAA2C,EAAE,EAAE;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QAEnC,MAAM,MAAM,GAAG;;;uBAGI,MAAM;;6BAEA,MAAM;;;;;;;;;;yEAUsC,OAAO,aAAa,MAAM;;;;;;;;;;;;eAYpF,MAAM;;;;;;;;KAQhB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA0D,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;gBACvG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "zapret2-mcp",
3
+ "version": "0.3.0",
4
+ "description": "MCP server for managing zapret2 network packet processing tool on OpenWrt routers and Linux desktops via Docker, SSH, or locally",
5
+ "license": "MIT",
6
+ "author": "Stanislav Zemlyakov",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/rcd27/zapret2-mcp.git"
10
+ },
11
+ "homepage": "https://github.com/rcd27/zapret2-mcp#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/rcd27/zapret2-mcp/issues"
14
+ },
15
+ "type": "module",
16
+ "main": "build/index.js",
17
+ "bin": {
18
+ "zapret2-mcp": "build/index.js"
19
+ },
20
+ "files": [
21
+ "build",
22
+ "README.md",
23
+ "LICENSE",
24
+ "CHANGELOG.md"
25
+ ],
26
+ "engines": {
27
+ "node": ">=18.0.0"
28
+ },
29
+ "keywords": [
30
+ "mcp",
31
+ "mcp-server",
32
+ "model-context-protocol",
33
+ "zapret",
34
+ "zapret2",
35
+ "network-tools",
36
+ "packet-processing",
37
+ "openwrt",
38
+ "nfqws",
39
+ "nfqws2",
40
+ "ai-agent",
41
+ "llm-tools"
42
+ ],
43
+ "scripts": {
44
+ "build": "tsc && chmod 755 build/index.js",
45
+ "start": "node build/index.js",
46
+ "prestart": "npm run build",
47
+ "dev": "npx @modelcontextprotocol/inspector node build/index.js",
48
+ "test": "vitest run",
49
+ "test:watch": "vitest",
50
+ "test:integration": "npm run build && vitest run --config vitest.integration.config.ts",
51
+ "test:coverage": "vitest run --coverage",
52
+ "prepublishOnly": "npm run build && npm test"
53
+ },
54
+ "dependencies": {
55
+ "@modelcontextprotocol/sdk": "^1.6.0",
56
+ "zod": "^3.24.0"
57
+ },
58
+ "devDependencies": {
59
+ "@types/node": "^22.0.0",
60
+ "@vitest/coverage-v8": "^4.0.18",
61
+ "typescript": "^5.7.0",
62
+ "vitest": "^4.0.18"
63
+ }
64
+ }