mcp-xray-pilot 0.10.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 (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +502 -0
  3. package/data/docs/_index.json +533 -0
  4. package/data/docs/basic__api.md +148 -0
  5. package/data/docs/basic__dns.md +366 -0
  6. package/data/docs/basic__fakedns.md +202 -0
  7. package/data/docs/basic__geodata.md +64 -0
  8. package/data/docs/basic__inbound.md +159 -0
  9. package/data/docs/basic__index.md +136 -0
  10. package/data/docs/basic__log.md +67 -0
  11. package/data/docs/basic__metrics.md +262 -0
  12. package/data/docs/basic__observatory.md +115 -0
  13. package/data/docs/basic__outbound.md +164 -0
  14. package/data/docs/basic__policy.md +140 -0
  15. package/data/docs/basic__reverse.md +268 -0
  16. package/data/docs/basic__routing.md +474 -0
  17. package/data/docs/basic__stats.md +61 -0
  18. package/data/docs/basic__transport.md +1283 -0
  19. package/data/docs/features__features_browser_dialer.md +61 -0
  20. package/data/docs/features__features_env.md +66 -0
  21. package/data/docs/features__features_fallback.md +110 -0
  22. package/data/docs/features__features_index.md +17 -0
  23. package/data/docs/features__features_multiple.md +144 -0
  24. package/data/docs/features__features_xtls.md +13 -0
  25. package/data/docs/inbounds__inbounds_dokodemo.md +11 -0
  26. package/data/docs/inbounds__inbounds_http.md +80 -0
  27. package/data/docs/inbounds__inbounds_hysteria.md +60 -0
  28. package/data/docs/inbounds__inbounds_index.md +22 -0
  29. package/data/docs/inbounds__inbounds_shadowsocks.md +118 -0
  30. package/data/docs/inbounds__inbounds_socks.md +87 -0
  31. package/data/docs/inbounds__inbounds_trojan.md +78 -0
  32. package/data/docs/inbounds__inbounds_tun.md +47 -0
  33. package/data/docs/inbounds__inbounds_tunnel.md +86 -0
  34. package/data/docs/inbounds__inbounds_vless.md +135 -0
  35. package/data/docs/inbounds__inbounds_vmess.md +95 -0
  36. package/data/docs/inbounds__inbounds_wireguard.md +78 -0
  37. package/data/docs/outbounds__outbounds_blackhole.md +42 -0
  38. package/data/docs/outbounds__outbounds_dns.md +97 -0
  39. package/data/docs/outbounds__outbounds_freedom.md +170 -0
  40. package/data/docs/outbounds__outbounds_http.md +70 -0
  41. package/data/docs/outbounds__outbounds_hysteria.md +39 -0
  42. package/data/docs/outbounds__outbounds_index.md +24 -0
  43. package/data/docs/outbounds__outbounds_loopback.md +65 -0
  44. package/data/docs/outbounds__outbounds_shadowsocks.md +105 -0
  45. package/data/docs/outbounds__outbounds_socks.md +58 -0
  46. package/data/docs/outbounds__outbounds_trojan.md +49 -0
  47. package/data/docs/outbounds__outbounds_vless.md +122 -0
  48. package/data/docs/outbounds__outbounds_vmess.md +76 -0
  49. package/data/docs/outbounds__outbounds_wireguard.md +141 -0
  50. package/data/docs/transports__transports_grpc.md +137 -0
  51. package/data/docs/transports__transports_h2.md +11 -0
  52. package/data/docs/transports__transports_http.md +11 -0
  53. package/data/docs/transports__transports_httpupgrade.md +61 -0
  54. package/data/docs/transports__transports_hysteria.md +110 -0
  55. package/data/docs/transports__transports_index.md +19 -0
  56. package/data/docs/transports__transports_mkcp.md +125 -0
  57. package/data/docs/transports__transports_quic.md +11 -0
  58. package/data/docs/transports__transports_raw.md +156 -0
  59. package/data/docs/transports__transports_splithttp.md +11 -0
  60. package/data/docs/transports__transports_tcp.md +11 -0
  61. package/data/docs/transports__transports_websocket.md +75 -0
  62. package/data/docs/transports__transports_xhttp.md +11 -0
  63. package/dist/data/compatibility.js +170 -0
  64. package/dist/data/compatibility.js.map +1 -0
  65. package/dist/data/geocatalogue.js +191 -0
  66. package/dist/data/geocatalogue.js.map +1 -0
  67. package/dist/docs.js +339 -0
  68. package/dist/docs.js.map +1 -0
  69. package/dist/handlers.js +217 -0
  70. package/dist/handlers.js.map +1 -0
  71. package/dist/index.js +66 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/lint.js +737 -0
  74. package/dist/lint.js.map +1 -0
  75. package/dist/schemas/protocols/blackhole.js +16 -0
  76. package/dist/schemas/protocols/blackhole.js.map +1 -0
  77. package/dist/schemas/protocols/common.js +32 -0
  78. package/dist/schemas/protocols/common.js.map +1 -0
  79. package/dist/schemas/protocols/dns.js +14 -0
  80. package/dist/schemas/protocols/dns.js.map +1 -0
  81. package/dist/schemas/protocols/dokodemo.js +17 -0
  82. package/dist/schemas/protocols/dokodemo.js.map +1 -0
  83. package/dist/schemas/protocols/freedom.js +45 -0
  84. package/dist/schemas/protocols/freedom.js.map +1 -0
  85. package/dist/schemas/protocols/http.js +38 -0
  86. package/dist/schemas/protocols/http.js.map +1 -0
  87. package/dist/schemas/protocols/hysteria.js +51 -0
  88. package/dist/schemas/protocols/hysteria.js.map +1 -0
  89. package/dist/schemas/protocols/index.js +50 -0
  90. package/dist/schemas/protocols/index.js.map +1 -0
  91. package/dist/schemas/protocols/loopback.js +11 -0
  92. package/dist/schemas/protocols/loopback.js.map +1 -0
  93. package/dist/schemas/protocols/shadowsocks.js +60 -0
  94. package/dist/schemas/protocols/shadowsocks.js.map +1 -0
  95. package/dist/schemas/protocols/socks.js +42 -0
  96. package/dist/schemas/protocols/socks.js.map +1 -0
  97. package/dist/schemas/protocols/trojan.js +34 -0
  98. package/dist/schemas/protocols/trojan.js.map +1 -0
  99. package/dist/schemas/protocols/tun.js +19 -0
  100. package/dist/schemas/protocols/tun.js.map +1 -0
  101. package/dist/schemas/protocols/vless.js +44 -0
  102. package/dist/schemas/protocols/vless.js.map +1 -0
  103. package/dist/schemas/protocols/vmess.js +48 -0
  104. package/dist/schemas/protocols/vmess.js.map +1 -0
  105. package/dist/schemas/protocols/wireguard.js +34 -0
  106. package/dist/schemas/protocols/wireguard.js.map +1 -0
  107. package/dist/schemas/security/index.js +16 -0
  108. package/dist/schemas/security/index.js.map +1 -0
  109. package/dist/schemas/security/reality.js +35 -0
  110. package/dist/schemas/security/reality.js.map +1 -0
  111. package/dist/schemas/security/tls.js +46 -0
  112. package/dist/schemas/security/tls.js.map +1 -0
  113. package/dist/schemas/security/xtls.js +17 -0
  114. package/dist/schemas/security/xtls.js.map +1 -0
  115. package/dist/schemas/transports/grpc.js +18 -0
  116. package/dist/schemas/transports/grpc.js.map +1 -0
  117. package/dist/schemas/transports/httpupgrade.js +14 -0
  118. package/dist/schemas/transports/httpupgrade.js.map +1 -0
  119. package/dist/schemas/transports/hysteria.js +25 -0
  120. package/dist/schemas/transports/hysteria.js.map +1 -0
  121. package/dist/schemas/transports/index.js +32 -0
  122. package/dist/schemas/transports/index.js.map +1 -0
  123. package/dist/schemas/transports/mkcp.js +34 -0
  124. package/dist/schemas/transports/mkcp.js.map +1 -0
  125. package/dist/schemas/transports/raw.js +19 -0
  126. package/dist/schemas/transports/raw.js.map +1 -0
  127. package/dist/schemas/transports/websocket.js +15 -0
  128. package/dist/schemas/transports/websocket.js.map +1 -0
  129. package/dist/schemas/transports/xhttp.js +34 -0
  130. package/dist/schemas/transports/xhttp.js.map +1 -0
  131. package/dist/search.js +78 -0
  132. package/dist/search.js.map +1 -0
  133. package/dist/state.js +87 -0
  134. package/dist/state.js.map +1 -0
  135. package/dist/tools.js +274 -0
  136. package/dist/tools.js.map +1 -0
  137. package/dist/tools_impl/diff.js +55 -0
  138. package/dist/tools_impl/diff.js.map +1 -0
  139. package/dist/tools_impl/github.js +416 -0
  140. package/dist/tools_impl/github.js.map +1 -0
  141. package/dist/tools_impl/merge.js +181 -0
  142. package/dist/tools_impl/merge.js.map +1 -0
  143. package/dist/tools_impl/refresh.js +46 -0
  144. package/dist/tools_impl/refresh.js.map +1 -0
  145. package/dist/tools_impl/suggest.js +169 -0
  146. package/dist/tools_impl/suggest.js.map +1 -0
  147. package/dist/types.js +10 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/utils.js +81 -0
  150. package/dist/utils.js.map +1 -0
  151. package/dist/validate.js +408 -0
  152. package/dist/validate.js.map +1 -0
  153. package/package.json +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/tools_impl/refresh.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAyC,MAAM,YAAY,CAAC;AAGhF,MAAM,YAAY,GAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAClE,MAAM,gBAAgB,GAAe;IACnC,OAAO;IACP,UAAU;IACV,UAAU;IACV,WAAW;IACX,YAAY;CACb,CAAC;AASF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAiB;IAChD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAiB,CAAC;IACtD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,kBAAkB,IAAI,CAAC,KAAK,uBAAuB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7E,CAAC;IACJ,CAAC;IACD,IAAI,QAA8B,CAAC;IACnC,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAoB,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,CAAC,QAAQ,uBAAuB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvF,CAAC;QACJ,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC,QAAoB,CAAC;IACvC,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;IAC7C,IACE,OAAO,YAAY,KAAK,QAAQ;QAChC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC9B,YAAY,GAAG,CAAC;QAChB,YAAY,GAAG,GAAG,EAClB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,WAAW,CAAC;QACjB,KAAK;QACL,QAAQ;QACR,YAAY;QACZ,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ;KAC1B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,169 @@
1
+ /*
2
+ * xray_suggest_alternative — pick a sane protocol+transport+security stack.
3
+ *
4
+ * Goal-driven. Each goal hard-codes the recipe that works in 2025-26 reality.
5
+ * If `current_config` is provided we also flag what's wrong with it.
6
+ */
7
+ import { lintConfig } from "../lint.js";
8
+ const RECIPES = {
9
+ "anti-dpi-russia": {
10
+ protocol: "vless",
11
+ transport: "xhttp",
12
+ security: "reality",
13
+ flow: "",
14
+ extras: {
15
+ "realitySettings.serverNames[0]": "yandex.com (or any RU CDN you actually visit)",
16
+ "realitySettings.shortIds": '["", "abcd"] — empty + one custom for client choice',
17
+ "xhttpSettings.mode": "auto",
18
+ "domainStrategy": "IPIfNonMatch",
19
+ },
20
+ reasoning: [
21
+ "VLESS+REALITY+xhttp survives 2024-2026 RKN/TSPU active probing.",
22
+ "REALITY hides the SNI behind a real Russian-friendly host.",
23
+ "xhttp multiplexing dodges per-connection rate limits.",
24
+ ],
25
+ warnings: [
26
+ "Vision flow does NOT work with xhttp — leave flow empty.",
27
+ "Verify the chosen serverName actually resolves from a Russian residential IP, not just from the VPS.",
28
+ ],
29
+ },
30
+ "anti-dpi-iran": {
31
+ protocol: "vless",
32
+ transport: "ws",
33
+ security: "tls",
34
+ extras: {
35
+ "tlsSettings.serverName": "your real domain (must have a valid Let's Encrypt cert)",
36
+ "wsSettings.path": "/something-not-obvious",
37
+ "wsSettings.host": "match the cert SAN",
38
+ },
39
+ reasoning: [
40
+ "Iran's DPI fingerprints REALITY signatures aggressively in 2025.",
41
+ "Plain TLS+WS behind a CDN-fronted domain remains the safest bet.",
42
+ ],
43
+ warnings: [
44
+ "Avoid Cloudflare for the cert if you also use CF as upstream — circular routing.",
45
+ ],
46
+ },
47
+ "anti-dpi-china": {
48
+ protocol: "vless",
49
+ transport: "xhttp",
50
+ security: "reality",
51
+ extras: {
52
+ "realitySettings.serverNames[0]": "a domain whose IP is allowed in CN",
53
+ "realitySettings.fingerprint": "chrome",
54
+ },
55
+ reasoning: [
56
+ "GFW does not yet (2025) actively probe REALITY when target SNI is a real CN-friendly host.",
57
+ "TLS-1.3 fingerprint must look like a real browser.",
58
+ ],
59
+ warnings: [
60
+ "Test from inside CN — VPS-side traceroute is meaningless.",
61
+ ],
62
+ },
63
+ "low-latency": {
64
+ protocol: "vless",
65
+ transport: "raw",
66
+ security: "reality",
67
+ flow: "xtls-rprx-vision",
68
+ extras: {
69
+ "realitySettings.fingerprint": "chrome",
70
+ },
71
+ reasoning: [
72
+ "raw + vision = zero post-handshake protocol overhead.",
73
+ "Single TCP connection per session, no multiplex re-fragmentation cost.",
74
+ ],
75
+ warnings: [
76
+ "vision flow only works with raw/tcp transport.",
77
+ ],
78
+ },
79
+ "mobile-battery": {
80
+ protocol: "shadowsocks",
81
+ transport: "raw",
82
+ security: "none",
83
+ extras: {
84
+ "method": "2022-blake3-aes-128-gcm",
85
+ },
86
+ reasoning: [
87
+ "Shadowsocks-2022 AEAD is light on CPU — best Wh/MB on Android.",
88
+ "No TLS handshake on every connection.",
89
+ ],
90
+ warnings: [
91
+ "SS-2022 is detectable by sophisticated DPI; use only where DPI is lazy (most non-RU/CN/IR networks).",
92
+ ],
93
+ },
94
+ "high-throughput": {
95
+ protocol: "hysteria2",
96
+ transport: "hysteria",
97
+ security: "tls",
98
+ extras: {
99
+ "bandwidth.up": "200 mbps",
100
+ "bandwidth.down": "1 gbps",
101
+ },
102
+ reasoning: [
103
+ "Hysteria2 over QUIC saturates lossy links faster than TCP-based transports.",
104
+ ],
105
+ warnings: [
106
+ "Battery drain on phones; heavy on the CPU.",
107
+ "UDP often de-prioritised — measure before deploying widely.",
108
+ ],
109
+ },
110
+ "stealth-cdn": {
111
+ protocol: "trojan",
112
+ transport: "ws",
113
+ security: "tls",
114
+ extras: {
115
+ "wsSettings.path": "/api/health",
116
+ "tlsSettings.serverName": "your CDN-fronted domain",
117
+ },
118
+ reasoning: [
119
+ "Trojan over WS+TLS behind a real CDN looks like vanilla HTTPS to inspectors.",
120
+ ],
121
+ warnings: [
122
+ "Some CDNs (CF free tier) throttle WebSocket idle connections.",
123
+ ],
124
+ },
125
+ "simple-getting-started": {
126
+ protocol: "vless",
127
+ transport: "raw",
128
+ security: "tls",
129
+ extras: {
130
+ "tlsSettings.serverName": "your domain (with cert)",
131
+ },
132
+ reasoning: [
133
+ "Simplest stack that still gives you encryption + auth.",
134
+ "Migrate to REALITY/xhttp once you understand the moving parts.",
135
+ ],
136
+ warnings: [],
137
+ },
138
+ };
139
+ export function suggestAlternative(goal, currentConfig) {
140
+ const r = RECIPES[goal];
141
+ if (!r) {
142
+ throw new Error(`unknown goal "${goal}". Known: ${Object.keys(RECIPES).join(", ")}`);
143
+ }
144
+ const result = {
145
+ goal,
146
+ recommendation: {
147
+ protocol: r.protocol,
148
+ transport: r.transport,
149
+ security: r.security,
150
+ flow: r.flow,
151
+ extras: r.extras,
152
+ },
153
+ reasoning: r.reasoning,
154
+ warnings: r.warnings,
155
+ };
156
+ if (currentConfig) {
157
+ try {
158
+ const lr = lintConfig(currentConfig);
159
+ const errs = lr.issues.filter((i) => i.severity === "error");
160
+ result.current_config_issues = errs.map((i) => `[${i.severity}] ${i.id} @ ${i.where ?? "?"}: ${i.message}`);
161
+ }
162
+ catch (e) {
163
+ result.current_config_issues = [`could not lint current_config: ${e.message}`];
164
+ }
165
+ }
166
+ return result;
167
+ }
168
+ export const SUPPORTED_GOALS = Object.keys(RECIPES);
169
+ //# sourceMappingURL=suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/tools_impl/suggest.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,10 @@
1
+ /*
2
+ * Shared types for the mcp-xray-pilot server.
3
+ *
4
+ * Topic — one cached docs page from xtls.github.io
5
+ * FetchResult — result of online/offline retrieval
6
+ * Validation* — structural-validate output
7
+ * Lint* — best-practice lint output
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
package/dist/utils.js ADDED
@@ -0,0 +1,81 @@
1
+ /*
2
+ * Small helpers shared across modules:
3
+ * - buildFrontmatter()/parseFrontmatter() — YAML frontmatter for cached docs.
4
+ * - fileNameFor()/slugify()/snippet() — self-explanatory.
5
+ *
6
+ * Note: HTML→markdown conversion was removed in v0.2 — docs are now fetched
7
+ * as raw markdown from XTLS/Xray-docs-next.
8
+ */
9
+ export function slugify(s) {
10
+ return s
11
+ .toLowerCase()
12
+ .replace(/[^a-z0-9]+/g, "-")
13
+ .replace(/^-+|-+$/g, "");
14
+ }
15
+ /* Compose the final on-disk filename for a TopicMeta. */
16
+ export function fileNameFor(category, slug) {
17
+ return `${category}__${slug.replace(/\//g, "_")}.md`;
18
+ }
19
+ export function buildFrontmatter(meta) {
20
+ const lines = [
21
+ "---",
22
+ `url: ${meta.url}`,
23
+ ];
24
+ if (meta.source_url)
25
+ lines.push(`source_url: ${meta.source_url}`);
26
+ lines.push(`title: ${escapeYaml(meta.title)}`, `category: ${meta.category}`, `slug: ${meta.slug}`, `fetched_at: ${meta.fetched_at}`, "---", "");
27
+ return lines.join("\n");
28
+ }
29
+ export function parseFrontmatter(raw) {
30
+ if (!raw.startsWith("---"))
31
+ return { meta: {}, body: raw };
32
+ const end = raw.indexOf("\n---", 3);
33
+ if (end < 0)
34
+ return { meta: {}, body: raw };
35
+ const block = raw.slice(3, end).trim();
36
+ const body = raw.slice(end + 4).replace(/^\n+/, "");
37
+ const meta = {};
38
+ for (const line of block.split(/\r?\n/)) {
39
+ const m = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*):\s*(.*)$/);
40
+ if (m)
41
+ meta[m[1]] = unquoteYaml(m[2]);
42
+ }
43
+ return { meta: meta, body };
44
+ }
45
+ function escapeYaml(s) {
46
+ if (/[:#\n"']/.test(s))
47
+ return JSON.stringify(s);
48
+ return s;
49
+ }
50
+ function unquoteYaml(s) {
51
+ if (s.length >= 2 && s.startsWith('"') && s.endsWith('"')) {
52
+ try {
53
+ return JSON.parse(s);
54
+ }
55
+ catch {
56
+ return s.slice(1, -1);
57
+ }
58
+ }
59
+ return s;
60
+ }
61
+ /* Build a ~maxLen-char excerpt around the first occurrence of `query`. */
62
+ export function snippet(text, query, maxLen = 240) {
63
+ if (!text)
64
+ return "";
65
+ const lower = text.toLowerCase();
66
+ const q = query.toLowerCase();
67
+ const idx = q ? lower.indexOf(q) : -1;
68
+ let start = 0;
69
+ let end = Math.min(text.length, maxLen);
70
+ if (idx >= 0) {
71
+ start = Math.max(0, idx - Math.floor(maxLen / 3));
72
+ end = Math.min(text.length, start + maxLen);
73
+ }
74
+ let s = text.slice(start, end).replace(/\s+/g, " ").trim();
75
+ if (start > 0)
76
+ s = "…" + s;
77
+ if (end < text.length)
78
+ s = s + "…";
79
+ return s;
80
+ }
81
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}