@yawlabs/tailscale-mcp 0.8.2 → 0.8.4
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 +7 -7
- package/dist/index.js +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
[](https://github.com/YawLabs/tailscale-mcp/stargazers)
|
|
6
6
|
[](https://github.com/YawLabs/tailscale-mcp/actions/workflows/ci.yml) [](https://github.com/YawLabs/tailscale-mcp/actions/workflows/release.yml) [](https://github.com/YawLabs/tailscale-mcp/actions/workflows/integration.yml)
|
|
7
7
|
|
|
8
|
-
**Ask your agent questions about your tailnet and have it act on the answers.** 99 tools + 4 resources covering the full [Tailscale v2 API](https://tailscale.com/api). Backed by
|
|
8
|
+
**Ask your agent questions about your tailnet and have it act on the answers.** 99 tools + 4 resources covering the full [Tailscale v2 API](https://tailscale.com/api). Backed by 735 tests and a nightly integration run against a real tailnet.
|
|
9
9
|
|
|
10
10
|
Built and maintained by [Yaw Labs](https://yaw.sh).
|
|
11
11
|
|
|
@@ -35,7 +35,7 @@ Reasonable question. Both have their place. Where this MCP is better:
|
|
|
35
35
|
- **Typed tool surface, not string parsing.** Every tool has a Zod-validated input schema and a structured response. No brittle `tailscale status --json | jq` pipelines that break when the schema evolves.
|
|
36
36
|
- **Cross-client, no user rewriting.** A Claude Code skill is tied to Claude Code. An MCP server works in Claude Code, Claude Desktop, Cursor, Windsurf, VS Code, and anything else that speaks MCP. Version bumps ship through `npx` — users don't re-author their skill when Tailscale adds an endpoint.
|
|
37
37
|
- **Safe-by-default writes.** Every tool declares `readOnlyHint` / `destructiveHint` / `idempotentHint` so clients can skip confirmation on reads and require it on mutations. A skill that shells out to the CLI can't express that.
|
|
38
|
-
- **Real tests.** 727 unit tests + an integration suite hitting a live tailnet on every tag.
|
|
38
|
+
- **Real tests.** 727 unit tests + an integration suite hitting a live tailnet on every tag. Most skills are short markdown prompts without their own test layer — if the vendor changes output format, nothing catches it for you.
|
|
39
39
|
|
|
40
40
|
If you already have a skill that covers your 10% of Tailscale workflows, great — keep it. The MCP is for the other 90%.
|
|
41
41
|
|
|
@@ -43,7 +43,7 @@ If you already have a skill that covers your 10% of Tailscale workflows, great
|
|
|
43
43
|
|
|
44
44
|
Fair critique from Reddit: a week-old repo claiming "actively maintained" with no visible tests is worth exactly zero trust. Here's what's actually verifiable:
|
|
45
45
|
|
|
46
|
-
- **
|
|
46
|
+
- **735 tests** (179 suites, `node --test`) covering every tool's input validation, API shape, and error handling. Run `npm test` to see them pass locally.
|
|
47
47
|
- **3 CI workflows** on GitHub Actions:
|
|
48
48
|
- [`ci.yml`](.github/workflows/ci.yml) — lint + typecheck + build + unit tests on every push and PR.
|
|
49
49
|
- [`integration.yml`](.github/workflows/integration.yml) — runs the full tool surface against a real tailnet.
|
|
@@ -120,8 +120,8 @@ That's it. Now ask your agent:
|
|
|
120
120
|
}
|
|
121
121
|
```
|
|
122
122
|
|
|
123
|
-
- **`minimal`** (
|
|
124
|
-
- **`core`** (
|
|
123
|
+
- **`minimal`** (19 tools) — `status`, `devices`, `audit`. Observe the tailnet, read the audit log.
|
|
124
|
+
- **`core`** (46 tools) — adds `acl`, `dns`, `keys`, `users`. The day-to-day admin surface.
|
|
125
125
|
- **`full`** (99 tools, default) — everything. Same as omitting the env var.
|
|
126
126
|
|
|
127
127
|
### Option 2: `TAILSCALE_TOOLS` (explicit group list)
|
|
@@ -158,7 +158,7 @@ Set to `1` or `true` to drop every tool without `readOnlyHint: true`. Stacks wit
|
|
|
158
158
|
The server logs the active filter to stderr on startup:
|
|
159
159
|
|
|
160
160
|
```
|
|
161
|
-
@yawlabs/tailscale-mcp v0.8.
|
|
161
|
+
@yawlabs/tailscale-mcp v0.8.3 ready (19 tools, profile=core, readonly)
|
|
162
162
|
```
|
|
163
163
|
|
|
164
164
|
If you don't set any filter, startup prints a tip pointing you at the profiles.
|
|
@@ -462,7 +462,7 @@ npm install
|
|
|
462
462
|
npm run lint # Biome check
|
|
463
463
|
npm run lint:fix # Auto-fix
|
|
464
464
|
npm run build # tsc + esbuild bundle
|
|
465
|
-
npm test # node --test (
|
|
465
|
+
npm test # node --test (735 tests)
|
|
466
466
|
```
|
|
467
467
|
|
|
468
468
|
For integration testing against your own tailnet: set `TAILSCALE_API_KEY` and run `node dist/index.js`.
|
package/dist/index.js
CHANGED
|
@@ -30435,7 +30435,7 @@ Pass this ETag to tailscale_update_acl when updating the policy.`
|
|
|
30435
30435
|
acceptRaw: true,
|
|
30436
30436
|
accept: "application/hujson"
|
|
30437
30437
|
});
|
|
30438
|
-
if (res.ok &&
|
|
30438
|
+
if (res.ok && !res.rawBody?.trim()) {
|
|
30439
30439
|
return { ...res, rawBody: "ACL policy is valid." };
|
|
30440
30440
|
}
|
|
30441
30441
|
return res;
|
|
@@ -32479,7 +32479,7 @@ var workloadIdentityTools = [
|
|
|
32479
32479
|
];
|
|
32480
32480
|
|
|
32481
32481
|
// src/index.ts
|
|
32482
|
-
var version2 = true ? "0.8.
|
|
32482
|
+
var version2 = true ? "0.8.4" : (await null).createRequire(import.meta.url)("../package.json").version;
|
|
32483
32483
|
var subcommand = process.argv[2];
|
|
32484
32484
|
if (subcommand === "deploy-acl") {
|
|
32485
32485
|
const filePath = process.argv[3];
|
|
@@ -32647,7 +32647,7 @@ console.error(
|
|
|
32647
32647
|
);
|
|
32648
32648
|
if (!filterSuffix) {
|
|
32649
32649
|
console.error(
|
|
32650
|
-
"@yawlabs/tailscale-mcp: tip \u2014 set TAILSCALE_PROFILE=core (
|
|
32650
|
+
"@yawlabs/tailscale-mcp: tip \u2014 set TAILSCALE_PROFILE=core (46 tools) or =minimal (19) to load a smaller tool surface. See README."
|
|
32651
32651
|
);
|
|
32652
32652
|
}
|
|
32653
32653
|
//# sourceMappingURL=index.js.map
|