What's new
Internal hardening from the post-v0.11.0 review. No user-facing behavior change except one nice-to-have:
tailscale_pingnow rejects malformed hostnames (leading/trailing hyphen, consecutive dots, empty labels, labels > 63 chars) at the schema layer with a clearInvalid ping targeterror, instead of lettingtailscale pingexit non-zero with a less helpful message. Valid hostnames and IPs (including IPv6) are unaffected.
Refactor + test coverage
- The
TAILSCALE_LOCAL_CLI=1|truegate was previously inlined in two places inindex.ts(registering the tool group + driving thelocal-cli=onbanner suffix). Extracted to a singleisLocalCliEnabled(env)predicate inserver-wiring.ts. - 8 new contract tests pin the gate's exact-string handling: matches
'1'and'true'only; rejects'TRUE'/'True'/'yes'/'on'/'enabled'/'0'/'false'/ empty / unset. A typo'd refactor of the gate would now fail tests instead of silently shipping.
Install
npx -y @yawlabs/tailscale-mcp@0.11.1
927 unit tests pass; lint clean.