@yawlabs/tailscale-mcp 0.12.3 → 0.12.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 -5
- package/dist/index.js +7 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
|
|
10
10
|
Built and maintained by [Yaw Labs](https://yaw.sh).
|
|
11
11
|
|
|
12
|
-
[](yaw://install?name=Tailscale&command=npx&args=-y%2C%40yawlabs%2Ftailscale-mcp&description=Manage%20your%20Tailscale%20tailnet%20-%20devices%2C%20ACLs%2C%20DNS%2C%20keys&source=https%3A%2F%2Fgithub.com%2FYawLabs%2Ftailscale-mcp)
|
|
13
13
|
|
|
14
|
-
One click adds this to your
|
|
14
|
+
One click adds this to your local Yaw MCP config so it's available in every Yaw Terminal session. Or install manually below.
|
|
15
15
|
|
|
16
16
|
## What's the point if the API already exists?
|
|
17
17
|
|
|
@@ -72,7 +72,7 @@ macOS / Linux / WSL:
|
|
|
72
72
|
"mcpServers": {
|
|
73
73
|
"tailscale": {
|
|
74
74
|
"command": "npx",
|
|
75
|
-
"args": ["-y", "@yawlabs/tailscale-mcp"]
|
|
75
|
+
"args": ["-y", "@yawlabs/tailscale-mcp@latest"]
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
}
|
|
@@ -85,7 +85,7 @@ Windows:
|
|
|
85
85
|
"mcpServers": {
|
|
86
86
|
"tailscale": {
|
|
87
87
|
"command": "cmd",
|
|
88
|
-
"args": ["/c", "npx", "-y", "@yawlabs/tailscale-mcp"]
|
|
88
|
+
"args": ["/c", "npx", "-y", "@yawlabs/tailscale-mcp@latest"]
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
}
|
|
@@ -457,7 +457,7 @@ MCP Resources expose read-only data clients can browse without a tool call.
|
|
|
457
457
|
For the simple "deploy ACL from git on merge" workflow, you don't need an MCP server or an agent — use the built-in CLI:
|
|
458
458
|
|
|
459
459
|
```bash
|
|
460
|
-
npx @yawlabs/tailscale-mcp deploy-acl tailscale/acl.json
|
|
460
|
+
npx -y @yawlabs/tailscale-mcp@latest deploy-acl tailscale/acl.json
|
|
461
461
|
```
|
|
462
462
|
|
|
463
463
|
Handles ETag fetching, validation, and deployment in one command. Works in any CI system. Set `TAILSCALE_API_KEY` and `TAILSCALE_TAILNET` as env vars.
|
package/dist/index.js
CHANGED
|
@@ -31188,7 +31188,8 @@ async function apiRequest(method, path, body, options) {
|
|
|
31188
31188
|
if (res.status !== 429 || attempt === MAX_429_RETRIES || !isRetryable) break;
|
|
31189
31189
|
const delay = compute429DelayMs(res.headers.get("retry-after"), attempt);
|
|
31190
31190
|
const elapsed2 = Date.now() - startedAt;
|
|
31191
|
-
|
|
31191
|
+
const nextAttemptBudgetMs = requestBudgetMs - elapsed2 - delay;
|
|
31192
|
+
if (nextAttemptBudgetMs <= 0) {
|
|
31192
31193
|
debugLog(` -> 429 (attempt ${attempt + 1}), giving up: budget exhausted (${elapsed2}ms + ${delay}ms)`);
|
|
31193
31194
|
break;
|
|
31194
31195
|
}
|
|
@@ -32689,7 +32690,7 @@ async function runTailscaleCli(args, options = {}) {
|
|
|
32689
32690
|
}
|
|
32690
32691
|
|
|
32691
32692
|
// src/tools/local-cli.ts
|
|
32692
|
-
var HOSTNAME_LABEL = /^[a-zA-Z0-
|
|
32693
|
+
var HOSTNAME_LABEL = /^[a-zA-Z0-9]([a-zA-Z0-9_-]*[a-zA-Z0-9])?$/;
|
|
32693
32694
|
function isValidPingTarget(s) {
|
|
32694
32695
|
if (s.length === 0 || s.length > 253) return false;
|
|
32695
32696
|
if (net2.isIP(s)) return true;
|
|
@@ -33520,6 +33521,7 @@ function getAllowedWebhookEvents() {
|
|
|
33520
33521
|
const extras = raw.split(",").map((s) => s.trim()).filter(Boolean);
|
|
33521
33522
|
return /* @__PURE__ */ new Set([...STATIC_WEBHOOK_EVENT_TYPES, ...extras]);
|
|
33522
33523
|
}
|
|
33524
|
+
var endpointUrlSchema = external_exports.string().url().refine((u) => u.startsWith("https://"), "endpointUrl must use https://");
|
|
33523
33525
|
var webhookSubscriptionsSchema = external_exports.array(external_exports.string()).min(1).superRefine((arr, ctx) => {
|
|
33524
33526
|
const allowed = getAllowedWebhookEvents();
|
|
33525
33527
|
let knownEventsList = null;
|
|
@@ -33583,7 +33585,7 @@ var webhookTools = [
|
|
|
33583
33585
|
openWorldHint: true
|
|
33584
33586
|
},
|
|
33585
33587
|
inputSchema: external_exports.object({
|
|
33586
|
-
endpointUrl:
|
|
33588
|
+
endpointUrl: endpointUrlSchema.describe("The HTTPS URL to send webhook events to"),
|
|
33587
33589
|
subscriptions: webhookSubscriptionsSchema.describe("Event types to subscribe to (at least one)")
|
|
33588
33590
|
}),
|
|
33589
33591
|
handler: async (input) => {
|
|
@@ -33605,7 +33607,7 @@ var webhookTools = [
|
|
|
33605
33607
|
},
|
|
33606
33608
|
inputSchema: external_exports.object({
|
|
33607
33609
|
webhookId: external_exports.string().describe("The webhook ID to update"),
|
|
33608
|
-
endpointUrl:
|
|
33610
|
+
endpointUrl: endpointUrlSchema.optional().describe("New HTTPS URL to send webhook events to"),
|
|
33609
33611
|
subscriptions: webhookSubscriptionsSchema.optional().describe("Updated list of event types to subscribe to (at least one)")
|
|
33610
33612
|
}),
|
|
33611
33613
|
handler: async (input) => {
|
|
@@ -33674,7 +33676,7 @@ var webhookTools = [
|
|
|
33674
33676
|
];
|
|
33675
33677
|
|
|
33676
33678
|
// src/index.ts
|
|
33677
|
-
var version2 = true ? "0.12.
|
|
33679
|
+
var version2 = true ? "0.12.5" : (await null).createRequire(import.meta.url)("../package.json").version;
|
|
33678
33680
|
var subcommand = process.argv[2];
|
|
33679
33681
|
if (subcommand === "deploy-acl") {
|
|
33680
33682
|
const filePath = process.argv[3];
|