@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 CHANGED
@@ -5,7 +5,7 @@
5
5
  [![GitHub stars](https://img.shields.io/github/stars/YawLabs/tailscale-mcp)](https://github.com/YawLabs/tailscale-mcp/stargazers)
6
6
  [![CI](https://github.com/YawLabs/tailscale-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/YawLabs/tailscale-mcp/actions/workflows/ci.yml) [![Release](https://github.com/YawLabs/tailscale-mcp/actions/workflows/release.yml/badge.svg)](https://github.com/YawLabs/tailscale-mcp/actions/workflows/release.yml) [![Integration](https://github.com/YawLabs/tailscale-mcp/actions/workflows/integration.yml/badge.svg)](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 727 tests and a nightly integration run against a real tailnet.
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. A skill is usually 50 lines of README without tests, and if the vendor changes output format nothing catches it.
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
- - **727 tests** (178 suites, `node --test`) covering every tool's input validation, API shape, and error handling. Run `npm test` to see them pass locally.
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`** (≈22 tools) — `status`, `devices`, `audit`. Observe the tailnet, read the audit log.
124
- - **`core`** (≈49 tools) — adds `acl`, `dns`, `keys`, `users`. The day-to-day admin surface.
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.1 ready (21 tools, profile=core, readonly)
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 (727 tests)
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 && (!res.rawBody || !res.rawBody.trim())) {
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.2" : (await null).createRequire(import.meta.url)("../package.json").version;
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 (\u224849 tools) or =minimal (\u224822) to load a smaller tool surface. See README."
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yawlabs/tailscale-mcp",
3
- "version": "0.8.2",
3
+ "version": "0.8.4",
4
4
  "description": "Tailscale MCP server for managing your tailnet from AI assistants",
5
5
  "license": "MIT",
6
6
  "author": "YawLabs <contact@yaw.sh>",