By jmagar
Tailscale network management via MCP — query devices, ACL, DNS, users, and API keys from Claude
This plugin requires configuration values that are prompted when the plugin is enabled. Sensitive values are stored in your system keychain.
no_authRun the rustscale MCP server without bearer-token auth. Only safe when the server is bound to loopback (127.x.x.x) or an upstream gateway enforces auth before traffic reaches it.
${user_config.no_auth}api_tokenOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
Bearer token for MCP HTTP authentication, sent as `Authorization: Bearer <token>` on every request. Generate one with `openssl rand -hex 32` or `just gen-token`. The same token must be set as TAILSCALE_MCP_TOKEN on the server side.
${user_config.api_token}auth_modeServer auth mode. bearer keeps the static API token only. oauth enables Google OAuth/JWT for clients like Codex while the generated API token is still accepted for this Claude Code plugin connection. OAuth mode requires public_url, google_client_id, google_client_secret, and auth_admin_email.
${user_config.auth_mode}public_urlPublic base URL for OAuth issuer/resource metadata, e.g. https://tailscale.example.com. Required when auth_mode=oauth. Leave blank to derive from an https server_url.
${user_config.public_url}server_urlBase URL the MCP client connects to. Keep the default http://localhost:7575 when running the server locally. Set to a remote URL (e.g. http://myhost:7575 or https://tailscale.example.com) when connecting to a server on another machine. Do NOT include a trailing /mcp path — the plugin appends it.
${user_config.server_url}use_dockerDeployment method. True: run via the bundled docker compose stack (containerized, easier to upgrade). False: run the binary directly via a systemd user service. Both produce identical rustscale behavior.
${user_config.use_docker}auth_admin_emailBootstrap allowed Google account for OAuth mode. The server refuses to start OAuth without an allowlisted account.
${user_config.auth_admin_email}google_client_idGoogle OAuth client ID used when auth_mode=oauth. Create a Web application OAuth client in Google Cloud Console.
${user_config.google_client_id}allow_destructiveEnables the delete_device action on the server side. Even with this enabled, the caller must also pass confirm=true. Off by default to prevent accidental device deletion.
${user_config.allow_destructive}tailscale_api_keyTailscale API key for the REST API. Create one at https://login.tailscale.com/admin/settings/keys. Stored as TAILSCALE_API_KEY in the plugin env file.
${user_config.tailscale_api_key}tailscale_tailnetTailnet to query. Use "-" for personal accounts, or your org domain (e.g. example.com) for organization accounts.
${user_config.tailscale_tailnet}google_client_secretGoogle OAuth client secret used when auth_mode=oauth. Stored in the plugin env file with mode 600.
${user_config.google_client_secret}rustscale is a Rust binary named tailscale that bridges Claude (and any MCP client) to the Tailscale REST API via the Model Context Protocol.
It exposes a single MCP tool called tailscale with an action parameter. Actions cover reading device/network state, authorizing devices, and (with explicit opt-in) deleting devices.
Every Tailscale account belongs to a tailnet — the private network that connects all your devices. The tailnet identifier is either:
"-" — personal accounts (default)"example.com" — organization accounts (your org's domain)Set it once via TAILSCALE_TAILNET; all API paths are scoped to it automatically (/api/v2/tailnet/<tailnet>/...).
Go to https://login.tailscale.com/admin/settings/keys and create an API key.
export TAILSCALE_API_KEY="tskey-api-..."
export TAILSCALE_TAILNET="-" # personal, or "example.com" for orgs
export TAILSCALE_MCP_TOKEN="$(openssl rand -hex 32)"
tailscale mcp
Add to claude_desktop_config.json:
{
"mcpServers": {
"tailscale": {
"command": "/path/to/tailscale",
"args": ["mcp"],
"env": {
"TAILSCALE_API_KEY": "tskey-api-...",
"TAILSCALE_TAILNET": "-"
}
}
}
}
tailscale serve
The server starts on 0.0.0.0:7575. Connect your MCP client to http://localhost:7575/mcp with Authorization: Bearer <your-token>.
All actions are dispatched via the single tailscale MCP tool with an action string argument.
| Action | Parameters | Description |
|---|---|---|
devices | — | List all devices in the tailnet |
device | id (required) | Single device details |
device_routes | id (required) | Subnet routes for a device |
keys | — | API keys in the tailnet |
acl | — | ACL policy (JSON format) |
dns | — | DNS nameservers, search paths, and MagicDNS preferences (aggregated) |
users | — | Users in the tailnet |
| Action | Parameters | Description |
|---|---|---|
authorize_device | id (required) | Approve a device for the tailnet |
| Action | Parameters | Description |
|---|---|---|
delete_device | id (required), confirm=true | Permanently remove a device |
Destructive actions require both conditions:
TAILSCALE_ALLOW_DESTRUCTIVE=true set on the serverconfirm=true passed in the tool call arguments| Action | Description |
|---|---|
help | Built-in action documentation |
The id parameter accepts either the stable node ID (e.g. n1234abc) or the legacy numeric device ID. Use action=devices to list all devices with their IDs.
The binary also works as a direct CLI against your tailnet:
tailscale devices [--json]
tailscale device <id> [--json]
tailscale routes <device-id> [--json]
tailscale keys [--json]
tailscale acl [--json]
tailscale dns [--json]
tailscale users [--json]
tailscale authorize <device-id> [--json]
tailscale delete-device <device-id> --confirm [--json]
All commands print pretty-printed JSON.
Set TAILSCALE_MCP_TOKEN to a static secret. MCP clients authenticate with Authorization: Bearer <token>.
TAILSCALE_MCP_TOKEN="$(openssl rand -hex 32)" tailscale serve
Set TAILSCALE_MCP_AUTH_MODE=oauth. The server runs a full OAuth 2.0 / PKCE flow and issues JWTs with scopes tailscale:read, tailscale:write, and tailscale:admin.
TAILSCALE_MCP_AUTH_MODE=oauth \
TAILSCALE_MCP_PUBLIC_URL=https://tailscale.example.com \
TAILSCALE_MCP_GOOGLE_CLIENT_ID=... \
TAILSCALE_MCP_GOOGLE_CLIENT_SECRET=... \
TAILSCALE_MCP_AUTH_ADMIN_EMAIL=admin@example.com \
tailscale serve
Binding to 127.* or setting TAILSCALE_MCP_NO_AUTH=true disables all auth. Suitable for local development only.
| Mode | Command | MCP endpoint |
|---|---|---|
| stdio | tailscale mcp | stdin / stdout |
| Streamable HTTP | tailscale serve | http://<host>:<port>/mcp |
Query, monitor, and manage Unraid servers via GraphQL API through MCP tools. Supports system info, Docker, VMs, array/parity, notifications, plugins, rclone, and live telemetry.
Core homelab agents, commands, and setup/health skills for self-hosted service management. Includes interactive credential setup wizard and unified service health dashboard.
UniFi network management via MCP tools. Monitor devices, clients, network health, firewall rules, and perform management operations.
Gotify push notifications and management via MCP tools with HTTP fallback. Sends alerts for long-running tasks, plan completions, and blocked states.
Agents, commands, skills, and scripts for scaffolding, reviewing, aligning, and deploying homelab MCP server plugins. Includes canonical Python, TypeScript, and Rust server templates.
npx claudepluginhub jmagar/dendrite --plugin tailscalePermanent coding companion for Claude Code — survives any update. MCP-based terminal pet with ASCII art, stats, reactions, and personality.
Feature development with code-architect/explorer/reviewer agents, CLAUDE.md audit and session learnings, and Agent Skills creation with eval benchmarking from Anthropic.
Production-grade engineering skills for AI coding agents — covering the full software development lifecycle from spec to ship.
Intelligent draw.io diagramming plugin with AI-powered diagram generation, multi-platform embedding (GitHub, Confluence, Azure DevOps, Notion, Teams, Harness), conditional formatting, live data binding, and MCP server integration for programmatic diagram creation and management.
Memory compression system for Claude Code - persist context across sessions