@yawlabs/tailscale-mcp 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/api.d.ts +2 -0
- package/dist/api.js +8 -1
- package/dist/api.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/tools/devices.d.ts +4 -4
- package/dist/tools/devices.js +19 -19
- package/dist/tools/devices.js.map +1 -1
- package/dist/tools/dns.d.ts +3 -3
- package/dist/tools/dns.js +3 -3
- package/dist/tools/dns.js.map +1 -1
- package/dist/tools/keys.d.ts +2 -2
- package/dist/tools/keys.js +5 -5
- package/dist/tools/keys.js.map +1 -1
- package/dist/tools/posture.d.ts +2 -2
- package/dist/tools/posture.js +5 -5
- package/dist/tools/posture.js.map +1 -1
- package/dist/tools/users.d.ts +1 -1
- package/dist/tools/users.js +7 -7
- package/dist/tools/users.js.map +1 -1
- package/dist/tools/webhooks.js +4 -4
- package/dist/tools/webhooks.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -211,6 +211,10 @@ The server checks for an API key first, then falls back to OAuth. If neither is
|
|
|
211
211
|
|
|
212
212
|
</details>
|
|
213
213
|
|
|
214
|
+
## Requirements
|
|
215
|
+
|
|
216
|
+
- Node.js 18 or higher
|
|
217
|
+
|
|
214
218
|
## Contributing
|
|
215
219
|
|
|
216
220
|
Contributions are welcome. Please [open an issue](https://github.com/YawLabs/tailscale-mcp/issues) to discuss what you'd like to change before submitting a PR.
|
|
@@ -222,6 +226,7 @@ git clone https://github.com/YawLabs/tailscale-mcp.git
|
|
|
222
226
|
cd tailscale-mcp
|
|
223
227
|
npm install
|
|
224
228
|
npm run build
|
|
229
|
+
npm test
|
|
225
230
|
```
|
|
226
231
|
|
|
227
232
|
Test against your own tailnet by setting `TAILSCALE_API_KEY` and running:
|
package/dist/api.d.ts
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Tailscale API client with API key and OAuth authentication.
|
|
3
3
|
*/
|
|
4
4
|
export declare function getTailnet(): string;
|
|
5
|
+
/** URL-encode a path segment to prevent path traversal. */
|
|
6
|
+
export declare function encPath(segment: string): string;
|
|
5
7
|
export interface ApiResponse<T = unknown> {
|
|
6
8
|
ok: boolean;
|
|
7
9
|
status: number;
|
package/dist/api.js
CHANGED
|
@@ -12,7 +12,10 @@ function getConfig() {
|
|
|
12
12
|
const tailnet = process.env.TAILSCALE_TAILNET || "-";
|
|
13
13
|
if (!apiKey && !(oauthClientId && oauthClientSecret)) {
|
|
14
14
|
throw new Error("No Tailscale credentials configured. " +
|
|
15
|
-
"Set TAILSCALE_API_KEY, or set TAILSCALE_OAUTH_CLIENT_ID and TAILSCALE_OAUTH_CLIENT_SECRET.");
|
|
15
|
+
"Set TAILSCALE_API_KEY, or set both TAILSCALE_OAUTH_CLIENT_ID and TAILSCALE_OAUTH_CLIENT_SECRET.");
|
|
16
|
+
}
|
|
17
|
+
if (apiKey && apiKey.trim() === "") {
|
|
18
|
+
throw new Error("TAILSCALE_API_KEY is set but empty. Provide a valid API key.");
|
|
16
19
|
}
|
|
17
20
|
return { apiKey, oauthClientId, oauthClientSecret, tailnet };
|
|
18
21
|
}
|
|
@@ -64,6 +67,10 @@ async function getAuthHeader() {
|
|
|
64
67
|
export function getTailnet() {
|
|
65
68
|
return process.env.TAILSCALE_TAILNET || "-";
|
|
66
69
|
}
|
|
70
|
+
/** URL-encode a path segment to prevent path traversal. */
|
|
71
|
+
export function encPath(segment) {
|
|
72
|
+
return encodeURIComponent(segment);
|
|
73
|
+
}
|
|
67
74
|
export async function apiRequest(method, path, body, options) {
|
|
68
75
|
const auth = await getAuthHeader();
|
|
69
76
|
const headers = {
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AACpD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAOlC,IAAI,UAAU,GAAsB,IAAI,CAAC;AACzC,IAAI,mBAAmB,GAA2B,IAAI,CAAC;AAEvD,SAAS,SAAS;IAChB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAC5D,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;IACpE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC;IAErD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,aAAa,IAAI,iBAAiB,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CACb,uCAAuC;YACrC,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -27,7 +27,7 @@ const allTools = [
|
|
|
27
27
|
];
|
|
28
28
|
const server = new McpServer({
|
|
29
29
|
name: "@yawlabs/tailscale-mcp",
|
|
30
|
-
version: "0.1.
|
|
30
|
+
version: "0.1.5",
|
|
31
31
|
});
|
|
32
32
|
for (const tool of allTools) {
|
|
33
33
|
server.tool(tool.name, tool.description, tool.inputSchema.shape, async (input) => {
|
package/dist/tools/devices.d.ts
CHANGED
|
@@ -109,7 +109,7 @@ export declare const deviceTools: readonly [{
|
|
|
109
109
|
}) => Promise<import("../api.js").ApiResponse<unknown>>;
|
|
110
110
|
}, {
|
|
111
111
|
readonly name: "tailscale_set_device_routes";
|
|
112
|
-
readonly description: "
|
|
112
|
+
readonly description: "Set the enabled subnet routes for a device. Replaces all currently enabled routes — pass the full list of routes you want enabled.";
|
|
113
113
|
readonly inputSchema: z.ZodObject<{
|
|
114
114
|
deviceId: z.ZodString;
|
|
115
115
|
routes: z.ZodArray<z.ZodString, "many">;
|
|
@@ -139,7 +139,7 @@ export declare const deviceTools: readonly [{
|
|
|
139
139
|
}) => Promise<import("../api.js").ApiResponse<unknown>>;
|
|
140
140
|
}, {
|
|
141
141
|
readonly name: "tailscale_set_device_posture_attribute";
|
|
142
|
-
readonly description: "Set a custom posture attribute on a device. Attribute keys must start with 'custom:'. Useful for compliance tracking, JIT access, and custom security policies.";
|
|
142
|
+
readonly description: "Set a custom posture attribute on a device. Creates or updates the attribute. Attribute keys must start with 'custom:'. Useful for compliance tracking, JIT access, and custom security policies.";
|
|
143
143
|
readonly inputSchema: z.ZodObject<{
|
|
144
144
|
deviceId: z.ZodString;
|
|
145
145
|
attributeKey: z.ZodString;
|
|
@@ -164,7 +164,7 @@ export declare const deviceTools: readonly [{
|
|
|
164
164
|
}) => Promise<import("../api.js").ApiResponse<unknown>>;
|
|
165
165
|
}, {
|
|
166
166
|
readonly name: "tailscale_delete_device_posture_attribute";
|
|
167
|
-
readonly description: "Delete a custom posture attribute from a device.";
|
|
167
|
+
readonly description: "Delete a custom posture attribute from a device. This is irreversible.";
|
|
168
168
|
readonly inputSchema: z.ZodObject<{
|
|
169
169
|
deviceId: z.ZodString;
|
|
170
170
|
attributeKey: z.ZodString;
|
|
@@ -181,7 +181,7 @@ export declare const deviceTools: readonly [{
|
|
|
181
181
|
}) => Promise<import("../api.js").ApiResponse<unknown>>;
|
|
182
182
|
}, {
|
|
183
183
|
readonly name: "tailscale_set_device_tags";
|
|
184
|
-
readonly description: "Set ACL tags on a device. Replaces all existing tags.";
|
|
184
|
+
readonly description: "Set ACL tags on a device. Replaces all existing tags — pass the full list of tags you want applied.";
|
|
185
185
|
readonly inputSchema: z.ZodObject<{
|
|
186
186
|
deviceId: z.ZodString;
|
|
187
187
|
tags: z.ZodArray<z.ZodString, "many">;
|
package/dist/tools/devices.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { apiGet, apiPost, apiDelete, getTailnet } from "../api.js";
|
|
2
|
+
import { apiGet, apiPost, apiDelete, getTailnet, encPath } from "../api.js";
|
|
3
3
|
export const deviceTools = [
|
|
4
4
|
{
|
|
5
5
|
name: "tailscale_list_devices",
|
|
@@ -22,7 +22,7 @@ export const deviceTools = [
|
|
|
22
22
|
deviceId: z.string().describe("The device ID (numeric or nodekey format)"),
|
|
23
23
|
}),
|
|
24
24
|
handler: async (input) => {
|
|
25
|
-
return apiGet(`/device/${input.deviceId}`);
|
|
25
|
+
return apiGet(`/device/${encPath(input.deviceId)}`);
|
|
26
26
|
},
|
|
27
27
|
},
|
|
28
28
|
{
|
|
@@ -32,7 +32,7 @@ export const deviceTools = [
|
|
|
32
32
|
deviceId: z.string().describe("The device ID to authorize"),
|
|
33
33
|
}),
|
|
34
34
|
handler: async (input) => {
|
|
35
|
-
return apiPost(`/device/${input.deviceId}/authorized`, { authorized: true });
|
|
35
|
+
return apiPost(`/device/${encPath(input.deviceId)}/authorized`, { authorized: true });
|
|
36
36
|
},
|
|
37
37
|
},
|
|
38
38
|
{
|
|
@@ -42,7 +42,7 @@ export const deviceTools = [
|
|
|
42
42
|
deviceId: z.string().describe("The device ID to deauthorize"),
|
|
43
43
|
}),
|
|
44
44
|
handler: async (input) => {
|
|
45
|
-
return apiPost(`/device/${input.deviceId}/authorized`, { authorized: false });
|
|
45
|
+
return apiPost(`/device/${encPath(input.deviceId)}/authorized`, { authorized: false });
|
|
46
46
|
},
|
|
47
47
|
},
|
|
48
48
|
{
|
|
@@ -52,7 +52,7 @@ export const deviceTools = [
|
|
|
52
52
|
deviceId: z.string().describe("The device ID to delete"),
|
|
53
53
|
}),
|
|
54
54
|
handler: async (input) => {
|
|
55
|
-
return apiDelete(`/device/${input.deviceId}`);
|
|
55
|
+
return apiDelete(`/device/${encPath(input.deviceId)}`);
|
|
56
56
|
},
|
|
57
57
|
},
|
|
58
58
|
{
|
|
@@ -63,7 +63,7 @@ export const deviceTools = [
|
|
|
63
63
|
name: z.string().describe("The new name for the device (FQDN within your tailnet)"),
|
|
64
64
|
}),
|
|
65
65
|
handler: async (input) => {
|
|
66
|
-
return apiPost(`/device/${input.deviceId}/name`, { name: input.name });
|
|
66
|
+
return apiPost(`/device/${encPath(input.deviceId)}/name`, { name: input.name });
|
|
67
67
|
},
|
|
68
68
|
},
|
|
69
69
|
{
|
|
@@ -73,7 +73,7 @@ export const deviceTools = [
|
|
|
73
73
|
deviceId: z.string().describe("The device ID to expire"),
|
|
74
74
|
}),
|
|
75
75
|
handler: async (input) => {
|
|
76
|
-
return apiPost(`/device/${input.deviceId}/expire`);
|
|
76
|
+
return apiPost(`/device/${encPath(input.deviceId)}/expire`);
|
|
77
77
|
},
|
|
78
78
|
},
|
|
79
79
|
{
|
|
@@ -83,18 +83,18 @@ export const deviceTools = [
|
|
|
83
83
|
deviceId: z.string().describe("The device ID"),
|
|
84
84
|
}),
|
|
85
85
|
handler: async (input) => {
|
|
86
|
-
return apiGet(`/device/${input.deviceId}/routes`);
|
|
86
|
+
return apiGet(`/device/${encPath(input.deviceId)}/routes`);
|
|
87
87
|
},
|
|
88
88
|
},
|
|
89
89
|
{
|
|
90
90
|
name: "tailscale_set_device_routes",
|
|
91
|
-
description: "
|
|
91
|
+
description: "Set the enabled subnet routes for a device. Replaces all currently enabled routes — pass the full list of routes you want enabled.",
|
|
92
92
|
inputSchema: z.object({
|
|
93
93
|
deviceId: z.string().describe("The device ID"),
|
|
94
|
-
routes: z.array(z.string()).describe("
|
|
94
|
+
routes: z.array(z.string()).describe("Full list of CIDR routes to enable (e.g. ['10.0.0.0/24', '192.168.1.0/24']). Replaces existing enabled routes."),
|
|
95
95
|
}),
|
|
96
96
|
handler: async (input) => {
|
|
97
|
-
return apiPost(`/device/${input.deviceId}/routes`, { routes: input.routes });
|
|
97
|
+
return apiPost(`/device/${encPath(input.deviceId)}/routes`, { routes: input.routes });
|
|
98
98
|
},
|
|
99
99
|
},
|
|
100
100
|
{
|
|
@@ -104,12 +104,12 @@ export const deviceTools = [
|
|
|
104
104
|
deviceId: z.string().describe("The device ID"),
|
|
105
105
|
}),
|
|
106
106
|
handler: async (input) => {
|
|
107
|
-
return apiGet(`/device/${input.deviceId}/attributes`);
|
|
107
|
+
return apiGet(`/device/${encPath(input.deviceId)}/attributes`);
|
|
108
108
|
},
|
|
109
109
|
},
|
|
110
110
|
{
|
|
111
111
|
name: "tailscale_set_device_posture_attribute",
|
|
112
|
-
description: "Set a custom posture attribute on a device. Attribute keys must start with 'custom:'. Useful for compliance tracking, JIT access, and custom security policies.",
|
|
112
|
+
description: "Set a custom posture attribute on a device. Creates or updates the attribute. Attribute keys must start with 'custom:'. Useful for compliance tracking, JIT access, and custom security policies.",
|
|
113
113
|
inputSchema: z.object({
|
|
114
114
|
deviceId: z.string().describe("The device ID"),
|
|
115
115
|
attributeKey: z.string().describe("The attribute key (must start with 'custom:', e.g. 'custom:lastAuditDate')"),
|
|
@@ -120,29 +120,29 @@ export const deviceTools = [
|
|
|
120
120
|
const body = { value: input.value };
|
|
121
121
|
if (input.expiry !== undefined)
|
|
122
122
|
body.expiry = input.expiry;
|
|
123
|
-
return apiPost(`/device/${input.deviceId}/attributes/${input.attributeKey}`, body);
|
|
123
|
+
return apiPost(`/device/${encPath(input.deviceId)}/attributes/${encPath(input.attributeKey)}`, body);
|
|
124
124
|
},
|
|
125
125
|
},
|
|
126
126
|
{
|
|
127
127
|
name: "tailscale_delete_device_posture_attribute",
|
|
128
|
-
description: "Delete a custom posture attribute from a device.",
|
|
128
|
+
description: "Delete a custom posture attribute from a device. This is irreversible.",
|
|
129
129
|
inputSchema: z.object({
|
|
130
130
|
deviceId: z.string().describe("The device ID"),
|
|
131
131
|
attributeKey: z.string().describe("The attribute key to delete (e.g. 'custom:lastAuditDate')"),
|
|
132
132
|
}),
|
|
133
133
|
handler: async (input) => {
|
|
134
|
-
return apiDelete(`/device/${input.deviceId}/attributes/${input.attributeKey}`);
|
|
134
|
+
return apiDelete(`/device/${encPath(input.deviceId)}/attributes/${encPath(input.attributeKey)}`);
|
|
135
135
|
},
|
|
136
136
|
},
|
|
137
137
|
{
|
|
138
138
|
name: "tailscale_set_device_tags",
|
|
139
|
-
description: "Set ACL tags on a device. Replaces all existing tags.",
|
|
139
|
+
description: "Set ACL tags on a device. Replaces all existing tags — pass the full list of tags you want applied.",
|
|
140
140
|
inputSchema: z.object({
|
|
141
141
|
deviceId: z.string().describe("The device ID"),
|
|
142
|
-
tags: z.array(z.string()).describe("
|
|
142
|
+
tags: z.array(z.string()).describe("Full list of ACL tags (e.g. ['tag:server', 'tag:production']). Replaces all existing tags."),
|
|
143
143
|
}),
|
|
144
144
|
handler: async (input) => {
|
|
145
|
-
return apiPost(`/device/${input.deviceId}/tags`, { tags: input.tags });
|
|
145
|
+
return apiPost(`/device/${encPath(input.deviceId)}/tags`, { tags: input.tags });
|
|
146
146
|
},
|
|
147
147
|
},
|
|
148
148
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/tools/devices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/tools/devices.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/dns.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export declare const dnsTools: readonly [{
|
|
|
6
6
|
readonly handler: () => Promise<import("../api.js").ApiResponse<unknown>>;
|
|
7
7
|
}, {
|
|
8
8
|
readonly name: "tailscale_set_nameservers";
|
|
9
|
-
readonly description: "Set the DNS nameservers for your tailnet.";
|
|
9
|
+
readonly description: "Set the DNS nameservers for your tailnet. Replaces all existing nameservers.";
|
|
10
10
|
readonly inputSchema: z.ZodObject<{
|
|
11
11
|
dns: z.ZodArray<z.ZodString, "many">;
|
|
12
12
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -24,7 +24,7 @@ export declare const dnsTools: readonly [{
|
|
|
24
24
|
readonly handler: () => Promise<import("../api.js").ApiResponse<unknown>>;
|
|
25
25
|
}, {
|
|
26
26
|
readonly name: "tailscale_set_search_paths";
|
|
27
|
-
readonly description: "Set the DNS search paths for your tailnet.";
|
|
27
|
+
readonly description: "Set the DNS search paths for your tailnet. Replaces all existing search paths.";
|
|
28
28
|
readonly inputSchema: z.ZodObject<{
|
|
29
29
|
searchPaths: z.ZodArray<z.ZodString, "many">;
|
|
30
30
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -42,7 +42,7 @@ export declare const dnsTools: readonly [{
|
|
|
42
42
|
readonly handler: () => Promise<import("../api.js").ApiResponse<unknown>>;
|
|
43
43
|
}, {
|
|
44
44
|
readonly name: "tailscale_set_split_dns";
|
|
45
|
-
readonly description: "Set split DNS configuration. Maps domains to specific nameservers.";
|
|
45
|
+
readonly description: "Set split DNS configuration. Maps domains to specific nameservers. Replaces the entire split DNS configuration.";
|
|
46
46
|
readonly inputSchema: z.ZodObject<{
|
|
47
47
|
splitDns: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString, "many">>;
|
|
48
48
|
}, "strip", z.ZodTypeAny, {
|
package/dist/tools/dns.js
CHANGED
|
@@ -11,7 +11,7 @@ export const dnsTools = [
|
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
name: "tailscale_set_nameservers",
|
|
14
|
-
description: "Set the DNS nameservers for your tailnet.",
|
|
14
|
+
description: "Set the DNS nameservers for your tailnet. Replaces all existing nameservers.",
|
|
15
15
|
inputSchema: z.object({
|
|
16
16
|
dns: z.array(z.string()).describe("List of DNS server IP addresses (e.g. ['8.8.8.8', '1.1.1.1'])"),
|
|
17
17
|
}),
|
|
@@ -29,7 +29,7 @@ export const dnsTools = [
|
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
name: "tailscale_set_search_paths",
|
|
32
|
-
description: "Set the DNS search paths for your tailnet.",
|
|
32
|
+
description: "Set the DNS search paths for your tailnet. Replaces all existing search paths.",
|
|
33
33
|
inputSchema: z.object({
|
|
34
34
|
searchPaths: z.array(z.string()).describe("List of DNS search domains (e.g. ['example.com', 'internal.corp'])"),
|
|
35
35
|
}),
|
|
@@ -49,7 +49,7 @@ export const dnsTools = [
|
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
name: "tailscale_set_split_dns",
|
|
52
|
-
description: "Set split DNS configuration. Maps domains to specific nameservers.",
|
|
52
|
+
description: "Set split DNS configuration. Maps domains to specific nameservers. Replaces the entire split DNS configuration.",
|
|
53
53
|
inputSchema: z.object({
|
|
54
54
|
splitDns: z
|
|
55
55
|
.record(z.string(), z.array(z.string()))
|
package/dist/tools/dns.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dns.js","sourceRoot":"","sources":["../../src/tools/dns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB;QACE,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,sDAAsD;QACnE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO,MAAM,CAAC,YAAY,UAAU,EAAE,kBAAkB,CAAC,CAAC;QAC5D,CAAC;KACF;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"dns.js","sourceRoot":"","sources":["../../src/tools/dns.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/keys.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export declare const keyTools: readonly [{
|
|
|
19
19
|
}) => Promise<import("../api.js").ApiResponse<unknown>>;
|
|
20
20
|
}, {
|
|
21
21
|
readonly name: "tailscale_create_key";
|
|
22
|
-
readonly description: "Create a new auth key for adding devices to your tailnet.";
|
|
22
|
+
readonly description: "Create a new auth key for adding devices to your tailnet. Returns the key value — save it immediately, as it cannot be retrieved again.";
|
|
23
23
|
readonly inputSchema: z.ZodObject<{
|
|
24
24
|
reusable: z.ZodOptional<z.ZodBoolean>;
|
|
25
25
|
ephemeral: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -52,7 +52,7 @@ export declare const keyTools: readonly [{
|
|
|
52
52
|
}) => Promise<import("../api.js").ApiResponse<unknown>>;
|
|
53
53
|
}, {
|
|
54
54
|
readonly name: "tailscale_delete_key";
|
|
55
|
-
readonly description: "Delete an auth key.";
|
|
55
|
+
readonly description: "Delete an auth key. This is irreversible — devices already authenticated with this key are unaffected, but no new devices can use it.";
|
|
56
56
|
readonly inputSchema: z.ZodObject<{
|
|
57
57
|
keyId: z.ZodString;
|
|
58
58
|
}, "strip", z.ZodTypeAny, {
|
package/dist/tools/keys.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { apiGet, apiPost, apiDelete, getTailnet } from "../api.js";
|
|
2
|
+
import { apiGet, apiPost, apiDelete, getTailnet, encPath } from "../api.js";
|
|
3
3
|
export const keyTools = [
|
|
4
4
|
{
|
|
5
5
|
name: "tailscale_list_keys",
|
|
@@ -16,12 +16,12 @@ export const keyTools = [
|
|
|
16
16
|
keyId: z.string().describe("The auth key ID"),
|
|
17
17
|
}),
|
|
18
18
|
handler: async (input) => {
|
|
19
|
-
return apiGet(`/tailnet/${getTailnet()}/keys/${input.keyId}`);
|
|
19
|
+
return apiGet(`/tailnet/${getTailnet()}/keys/${encPath(input.keyId)}`);
|
|
20
20
|
},
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
name: "tailscale_create_key",
|
|
24
|
-
description: "Create a new auth key for adding devices to your tailnet.",
|
|
24
|
+
description: "Create a new auth key for adding devices to your tailnet. Returns the key value — save it immediately, as it cannot be retrieved again.",
|
|
25
25
|
inputSchema: z.object({
|
|
26
26
|
reusable: z.boolean().optional().describe("Whether the key can be used more than once (default: false)"),
|
|
27
27
|
ephemeral: z.boolean().optional().describe("Whether devices using this key are ephemeral (default: false)"),
|
|
@@ -52,12 +52,12 @@ export const keyTools = [
|
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
54
|
name: "tailscale_delete_key",
|
|
55
|
-
description: "Delete an auth key.",
|
|
55
|
+
description: "Delete an auth key. This is irreversible — devices already authenticated with this key are unaffected, but no new devices can use it.",
|
|
56
56
|
inputSchema: z.object({
|
|
57
57
|
keyId: z.string().describe("The auth key ID to delete"),
|
|
58
58
|
}),
|
|
59
59
|
handler: async (input) => {
|
|
60
|
-
return apiDelete(`/tailnet/${getTailnet()}/keys/${input.keyId}`);
|
|
60
|
+
return apiDelete(`/tailnet/${getTailnet()}/keys/${encPath(input.keyId)}`);
|
|
61
61
|
},
|
|
62
62
|
},
|
|
63
63
|
];
|
package/dist/tools/keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/tools/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/tools/keys.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/posture.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export declare const postureTools: readonly [{
|
|
|
6
6
|
readonly handler: () => Promise<import("../api.js").ApiResponse<unknown>>;
|
|
7
7
|
}, {
|
|
8
8
|
readonly name: "tailscale_get_posture_integration";
|
|
9
|
-
readonly description: "Get details for a specific posture integration.";
|
|
9
|
+
readonly description: "Get details for a specific device posture integration.";
|
|
10
10
|
readonly inputSchema: z.ZodObject<{
|
|
11
11
|
integrationId: z.ZodString;
|
|
12
12
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -48,7 +48,7 @@ export declare const postureTools: readonly [{
|
|
|
48
48
|
}) => Promise<import("../api.js").ApiResponse<unknown>>;
|
|
49
49
|
}, {
|
|
50
50
|
readonly name: "tailscale_delete_posture_integration";
|
|
51
|
-
readonly description: "Delete a posture integration.";
|
|
51
|
+
readonly description: "Delete a posture integration. This is irreversible.";
|
|
52
52
|
readonly inputSchema: z.ZodObject<{
|
|
53
53
|
integrationId: z.ZodString;
|
|
54
54
|
}, "strip", z.ZodTypeAny, {
|
package/dist/tools/posture.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { apiGet, apiPost, apiDelete, getTailnet } from "../api.js";
|
|
2
|
+
import { apiGet, apiPost, apiDelete, getTailnet, encPath } from "../api.js";
|
|
3
3
|
export const postureTools = [
|
|
4
4
|
{
|
|
5
5
|
name: "tailscale_list_posture_integrations",
|
|
@@ -11,12 +11,12 @@ export const postureTools = [
|
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
name: "tailscale_get_posture_integration",
|
|
14
|
-
description: "Get details for a specific posture integration.",
|
|
14
|
+
description: "Get details for a specific device posture integration.",
|
|
15
15
|
inputSchema: z.object({
|
|
16
16
|
integrationId: z.string().describe("The posture integration ID"),
|
|
17
17
|
}),
|
|
18
18
|
handler: async (input) => {
|
|
19
|
-
return apiGet(`/tailnet/${getTailnet()}/posture/integrations/${input.integrationId}`);
|
|
19
|
+
return apiGet(`/tailnet/${getTailnet()}/posture/integrations/${encPath(input.integrationId)}`);
|
|
20
20
|
},
|
|
21
21
|
},
|
|
22
22
|
{
|
|
@@ -35,12 +35,12 @@ export const postureTools = [
|
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
name: "tailscale_delete_posture_integration",
|
|
38
|
-
description: "Delete a posture integration.",
|
|
38
|
+
description: "Delete a posture integration. This is irreversible.",
|
|
39
39
|
inputSchema: z.object({
|
|
40
40
|
integrationId: z.string().describe("The posture integration ID to delete"),
|
|
41
41
|
}),
|
|
42
42
|
handler: async (input) => {
|
|
43
|
-
return apiDelete(`/tailnet/${getTailnet()}/posture/integrations/${input.integrationId}`);
|
|
43
|
+
return apiDelete(`/tailnet/${getTailnet()}/posture/integrations/${encPath(input.integrationId)}`);
|
|
44
44
|
},
|
|
45
45
|
},
|
|
46
46
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posture.js","sourceRoot":"","sources":["../../src/tools/posture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"posture.js","sourceRoot":"","sources":["../../src/tools/posture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE5E,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;QACE,IAAI,EAAE,qCAAqC;QAC3C,WAAW,EAAE,mEAAmE;QAChF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO,MAAM,CAAC,YAAY,UAAU,EAAE,uBAAuB,CAAC,CAAC;QACjE,CAAC;KACF;IACD;QACE,IAAI,EAAE,mCAAmC;QACzC,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;SACjE,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAAgC,EAAE,EAAE;YAClD,OAAO,MAAM,CACX,YAAY,UAAU,EAAE,yBAAyB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAChF,CAAC;QACJ,CAAC;KACF;IACD;QACE,IAAI,EAAE,sCAAsC;QAC5C,WAAW,EAAE,0CAA0C;QACvD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;YACnG,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;YACrE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;YAC7E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;YACvF,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;SAC5F,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAMf,EAAE,EAAE;YACH,OAAO,OAAO,CACZ,YAAY,UAAU,EAAE,uBAAuB,EAC/C,KAAK,CACN,CAAC;QACJ,CAAC;KACF;IACD;QACE,IAAI,EAAE,sCAAsC;QAC5C,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;SAC3E,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAAgC,EAAE,EAAE;YAClD,OAAO,SAAS,CACd,YAAY,UAAU,EAAE,yBAAyB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAChF,CAAC;QACJ,CAAC;KACF;CACO,CAAC"}
|
package/dist/tools/users.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ export declare const userTools: readonly [{
|
|
|
32
32
|
}) => Promise<import("../api.js").ApiResponse<unknown>>;
|
|
33
33
|
}, {
|
|
34
34
|
readonly name: "tailscale_suspend_user";
|
|
35
|
-
readonly description: "Suspend a user, immediately revoking their access to the tailnet. Their devices will be disconnected.";
|
|
35
|
+
readonly description: "Suspend a user, immediately revoking their access to the tailnet. Their devices will be disconnected. Can be reversed with tailscale_restore_user.";
|
|
36
36
|
readonly inputSchema: z.ZodObject<{
|
|
37
37
|
userId: z.ZodString;
|
|
38
38
|
}, "strip", z.ZodTypeAny, {
|
package/dist/tools/users.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { apiGet, apiPost, apiPatch, getTailnet } from "../api.js";
|
|
2
|
+
import { apiGet, apiPost, apiPatch, getTailnet, encPath } from "../api.js";
|
|
3
3
|
export const userTools = [
|
|
4
4
|
{
|
|
5
5
|
name: "tailscale_list_users",
|
|
@@ -16,7 +16,7 @@ export const userTools = [
|
|
|
16
16
|
userId: z.string().describe("The user ID"),
|
|
17
17
|
}),
|
|
18
18
|
handler: async (input) => {
|
|
19
|
-
return apiGet(`/users/${input.userId}`);
|
|
19
|
+
return apiGet(`/users/${encPath(input.userId)}`);
|
|
20
20
|
},
|
|
21
21
|
},
|
|
22
22
|
{
|
|
@@ -26,17 +26,17 @@ export const userTools = [
|
|
|
26
26
|
userId: z.string().describe("The user ID to approve"),
|
|
27
27
|
}),
|
|
28
28
|
handler: async (input) => {
|
|
29
|
-
return apiPost(`/users/${input.userId}/approve`);
|
|
29
|
+
return apiPost(`/users/${encPath(input.userId)}/approve`);
|
|
30
30
|
},
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
name: "tailscale_suspend_user",
|
|
34
|
-
description: "Suspend a user, immediately revoking their access to the tailnet. Their devices will be disconnected.",
|
|
34
|
+
description: "Suspend a user, immediately revoking their access to the tailnet. Their devices will be disconnected. Can be reversed with tailscale_restore_user.",
|
|
35
35
|
inputSchema: z.object({
|
|
36
36
|
userId: z.string().describe("The user ID to suspend"),
|
|
37
37
|
}),
|
|
38
38
|
handler: async (input) => {
|
|
39
|
-
return apiPost(`/users/${input.userId}/suspend`);
|
|
39
|
+
return apiPost(`/users/${encPath(input.userId)}/suspend`);
|
|
40
40
|
},
|
|
41
41
|
},
|
|
42
42
|
{
|
|
@@ -46,7 +46,7 @@ export const userTools = [
|
|
|
46
46
|
userId: z.string().describe("The user ID to restore"),
|
|
47
47
|
}),
|
|
48
48
|
handler: async (input) => {
|
|
49
|
-
return apiPost(`/users/${input.userId}/restore`);
|
|
49
|
+
return apiPost(`/users/${encPath(input.userId)}/restore`);
|
|
50
50
|
},
|
|
51
51
|
},
|
|
52
52
|
{
|
|
@@ -58,7 +58,7 @@ export const userTools = [
|
|
|
58
58
|
.describe("The new role to assign"),
|
|
59
59
|
}),
|
|
60
60
|
handler: async (input) => {
|
|
61
|
-
return apiPatch(`/users/${input.userId}/role`, { role: input.role });
|
|
61
|
+
return apiPatch(`/users/${encPath(input.userId)}/role`, { role: input.role });
|
|
62
62
|
},
|
|
63
63
|
},
|
|
64
64
|
];
|
package/dist/tools/users.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE3E,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,iCAAiC;QAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO,MAAM,CAAC,YAAY,UAAU,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;KACF;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,kCAAkC;QAC/C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;SAC3C,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAAyB,EAAE,EAAE;YAC3C,OAAO,MAAM,CAAC,UAAU,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,8DAA8D;QAC3E,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;SACtD,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAAyB,EAAE,EAAE;YAC3C,OAAO,OAAO,CAAC,UAAU,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5D,CAAC;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,oJAAoJ;QACjK,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;SACtD,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAAyB,EAAE,EAAE;YAC3C,OAAO,OAAO,CAAC,UAAU,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5D,CAAC;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,8EAA8E;QAC3F,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;SACtD,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAAyB,EAAE,EAAE;YAC3C,OAAO,OAAO,CAAC,UAAU,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5D,CAAC;KACF;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,sCAAsC;QACnD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC1C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;iBAChG,QAAQ,CAAC,wBAAwB,CAAC;SACtC,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAAuC,EAAE,EAAE;YACzD,OAAO,QAAQ,CAAC,UAAU,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAChF,CAAC;KACF;CACO,CAAC"}
|
package/dist/tools/webhooks.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { apiGet, apiPost, apiPatch, apiDelete, getTailnet } from "../api.js";
|
|
2
|
+
import { apiGet, apiPost, apiPatch, apiDelete, getTailnet, encPath } from "../api.js";
|
|
3
3
|
export const webhookTools = [
|
|
4
4
|
{
|
|
5
5
|
name: "tailscale_list_webhooks",
|
|
@@ -16,7 +16,7 @@ export const webhookTools = [
|
|
|
16
16
|
webhookId: z.string().describe("The webhook ID"),
|
|
17
17
|
}),
|
|
18
18
|
handler: async (input) => {
|
|
19
|
-
return apiGet(`/webhooks/${input.webhookId}`);
|
|
19
|
+
return apiGet(`/webhooks/${encPath(input.webhookId)}`);
|
|
20
20
|
},
|
|
21
21
|
},
|
|
22
22
|
{
|
|
@@ -52,7 +52,7 @@ export const webhookTools = [
|
|
|
52
52
|
body.endpointUrl = input.endpointUrl;
|
|
53
53
|
if (input.subscriptions !== undefined)
|
|
54
54
|
body.subscriptions = input.subscriptions;
|
|
55
|
-
return apiPatch(`/webhooks/${input.webhookId}`, body);
|
|
55
|
+
return apiPatch(`/webhooks/${encPath(input.webhookId)}`, body);
|
|
56
56
|
},
|
|
57
57
|
},
|
|
58
58
|
{
|
|
@@ -62,7 +62,7 @@ export const webhookTools = [
|
|
|
62
62
|
webhookId: z.string().describe("The webhook ID to delete"),
|
|
63
63
|
}),
|
|
64
64
|
handler: async (input) => {
|
|
65
|
-
return apiDelete(`/webhooks/${input.webhookId}`);
|
|
65
|
+
return apiDelete(`/webhooks/${encPath(input.webhookId)}`);
|
|
66
66
|
},
|
|
67
67
|
},
|
|
68
68
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"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"}
|