# io.github.YawLabs/tailscale-mcp (npm · @yawlabs/tailscale-mcp)

Tailscale MCP server for managing your tailnet from AI assistants

- Trust score: 71/100 (medium)
- Change this week: −7
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-04

## Components

- npm · `@yawlabs/tailscale-mcp`: 71/100 (this document), [markdown](https://verifymcp.io/servers/yawlabs-tailscale-mcp/yawlabs-tailscale-mcp.md), [page](https://verifymcp.io/servers/yawlabs-tailscale-mcp/yawlabs-tailscale-mcp)

## Channel facts

- Registry: `npm`
- Package: `@yawlabs/tailscale-mcp`
- Version: `0.13.3`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-04.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - No production dependencies, so there is no dependency health to assess.
- **Provenance & Transparency**: 19/100
  - Repository check failed: no source repository is declared.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 13 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 88/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Tool/resource definitions use about 6773 tokens (~72/item across 93 items; 89 tools + 4 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 30/100
  - Stability observed for 9 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add yawlabs-tailscale-mcp -- npx -y @yawlabs/tailscale-mcp
```

### Codex

```bash
codex mcp add yawlabs-tailscale-mcp -- npx -y @yawlabs/tailscale-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "yawlabs-tailscale-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@yawlabs/tailscale-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add yawlabs-tailscale-mcp --command npx --arg -y --arg @yawlabs/tailscale-mcp
```

### Hermes

```yaml
mcp_servers:
  yawlabs-tailscale-mcp:
    command: "npx"
    args: ["-y", "@yawlabs/tailscale-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "yawlabs-tailscale-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@yawlabs/tailscale-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-04 (score 71, +1)

- [functional regression] Security disclosure: fail → unverified

### 2026-08-03 (score 70, +4)

- [functional improvement] Stability: unverified → 0.27

### 2026-08-02 (score 66, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-07-31 (score 51, −9)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 60, −18)

- [security regression] Malware scan: pass → unverified

### 2026-07-27 (score 78, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 78)

First indexed and scored.

## MCP tools (89)

### `tailscale_status` (~41 tokens)

Check that the Tailscale API connection is working. Returns your tailnet name, device count, and confirms authentication is valid. Use this to verify setup.

### `tailscale_list_devices` (~193 tokens)

List all devices in your tailnet with their status, IP addresses, OS, and last seen time.

Input parameters:

- `fields` (string): Comma-separated list of fields to include. Omit for all fields. Valid fields: addresses, advertisedRoutes, authorized, blocksIncomingConnections, clientConnectivity, clientVersion, connectedToControl…
- `filters` (object): Server-side filters as key-value pairs. Filter by any top-level device property (e.g. { isEphemeral: 'true', os: 'linux', tags: 'tag:prod' }). Multiple filters are ANDed together.

### `tailscale_get_device` (~43 tokens)

Get detailed information about a specific device by its ID.

Input parameters:

- `deviceId` (string, required): The device ID (numeric id or nodeId, NOT the nodeKey)

### `tailscale_authorize_device` (~33 tokens)

Authorize a device that is pending authorization.

Input parameters:

- `deviceId` (string, required): The device ID to authorize

### `tailscale_deauthorize_device` (~51 tokens)

Deauthorize a device, immediately removing its access to the tailnet. The device will need to be re-authorized to reconnect.

Input parameters:

- `deviceId` (string, required): The device ID to deauthorize

### `tailscale_delete_device` (~47 tokens)

Permanently remove a device from the tailnet. This is irreversible — the device must re-authenticate to rejoin.

Input parameters:

- `deviceId` (string, required): The device ID to delete

### `tailscale_rename_device` (~56 tokens)

Set the name of a device in the tailnet.

Input parameters:

- `deviceId` (string, required): The device ID to rename
- `name` (string, required): The new name for the device (FQDN within your tailnet)

### `tailscale_expire_device` (~38 tokens)

Expire a device's key, forcing it to re-authenticate.

Input parameters:

- `deviceId` (string, required): The device ID to expire

### `tailscale_get_device_routes` (~35 tokens)

Get the subnet routes a device advertises and which are enabled.

Input parameters:

- `deviceId` (string, required): The device ID

### `tailscale_set_device_routes` (~94 tokens)

Set the enabled subnet routes for a device. Replaces all currently enabled routes — pass the full list of routes you want enabled.

Input parameters:

- `deviceId` (string, required): The device ID
- `routes` (array, required): Full list of CIDR routes to enable (e.g. ['10.0.0.0/24', '192.168.1.0/24']). Replaces existing enabled routes.

### `tailscale_get_device_posture_attributes` (~39 tokens)

Get all posture attributes for a device, including custom and system-managed attributes.

Input parameters:

- `deviceId` (string, required): The device ID

### `tailscale_set_device_posture_attribute` (~143 tokens)

Set a custom posture attribute on a device. Creates or updates the attribute. Attribute keys must start with 'custom:'. Useful for compliance tracking, JIT access, and custom security policies.

Input parameters:

- `attributeKey` (string, required): The attribute key (must start with 'custom:', e.g. 'custom:lastAuditDate')
- `deviceId` (string, required): The device ID
- `expiry` (string): Optional expiry time in RFC3339 format (e.g. '2026-12-01T00:00:00Z'). Attribute is automatically removed after expiry.
- `value` (required): The attribute value (string, number, or boolean)

### `tailscale_delete_device_posture_attribute` (~59 tokens)

Delete a custom posture attribute from a device. This is irreversible.

Input parameters:

- `attributeKey` (string, required): The attribute key to delete (e.g. 'custom:lastAuditDate')
- `deviceId` (string, required): The device ID

### `tailscale_set_device_tags` (~76 tokens)

Set ACL tags on a device. Replaces all existing tags — pass the full list of tags you want applied.

Input parameters:

- `deviceId` (string, required): The device ID
- `tags` (array, required): Full list of ACL tags (e.g. ['tag:server', 'tag:production']). Replaces all existing tags.

### `tailscale_set_device_ip` (~65 tokens)

Set the Tailscale IPv4 address for a device.

Input parameters:

- `deviceId` (string, required): The device ID
- `ipv4` (string, required): The new Tailscale IPv4 address for the device (e.g. '100.64.0.1')

### `tailscale_update_device_key` (~64 tokens)

Update a device's key settings, such as disabling key expiry. Useful for servers that should never need to re-authenticate.

Input parameters:

- `deviceId` (string, required): The device ID
- `keyExpiryDisabled` (boolean, required): Whether to disable key expiry for this device

### `tailscale_set_devices_authorized` (~134 tokens)

Authorize or deauthorize multiple devices in one call. Each device's POST runs in parallel; per-device errors are returned alongside the successes so a partial failure doesn't lose the work that succeeded. On partial failure the call still returns success (ok) with data: { authorized, succeeded, failed } -- inspect data.failed for the per-device errors. Common use: authorize a batch of newly-enrolled CI hosts, or deauthorize a group of devices flagged by a security review.

Input parameters:

- `authorized` (boolean, required): true to authorize, false to deauthorize
- `deviceIds` (array, required): Device IDs to update

### `tailscale_batch_update_posture_attributes` (~159 tokens)

Batch update custom posture attributes across multiple devices. Each attribute key must start with 'custom:'. Uses JSON Merge Patch semantics — pass null as the attribute config to delete.

Input parameters:

- `comment` (string): Optional comment added to the audit log explaining why attributes are being set (max 200 chars)
- `nodes` (object, required): Map of device ID to attribute config map (e.g. { "12345": { "custom:compliant": { "value": "true" } }, "67890": { "custom:compliant": { "value": false, "expiry": "2026-12-01T00:00:00Z" } } }). Pass n…

### `tailscale_get_acl` (~60 tokens)

Get the current ACL policy for your tailnet. Returns the raw policy text with original formatting preserved, including comments and trailing commas (HuJSON). Also returns an ETag — you must pass it to tailscale_update_acl to safely update the policy.

### `tailscale_update_acl` (~134 tokens)

Update the ACL policy for your tailnet. Accepts the full policy as a string to preserve formatting, comments, and trailing commas (HuJSON). You MUST pass the ETag from tailscale_get_acl to prevent overwriting concurrent changes. Always get the current ACL first, make targeted edits to the text, and pass the full modified text back.

Input parameters:

- `etag` (string, required): The ETag from tailscale_get_acl. Required to prevent concurrent edit conflicts.
- `policy` (string, required): The full ACL policy text. Preserve existing formatting, comments, and structure. Only modify the specific parts that need to change.

### `tailscale_validate_acl` (~44 tokens)

Validate an ACL policy without applying it. Returns any errors found, or confirms the policy is valid.

Input parameters:

- `policy` (string, required): The full ACL policy text to validate

### `tailscale_preview_acl` (~107 tokens)

Preview the ACL rules that would apply to a specific user or IP address if a proposed policy were applied.

Input parameters:

- `policy` (string, required): The proposed ACL policy text to preview
- `previewFor` (string, required): The user email (for type 'user') or IP:port (for type 'ipport') to preview rules for
- `type` (string, required): Preview type: 'user' to see rules for a user, 'ipport' to see rules for an IP

### `tailscale_get_nameservers` (~22 tokens)

Get the DNS nameservers configured for your tailnet.

### `tailscale_set_nameservers` (~62 tokens)

Set the DNS nameservers for your tailnet. Replaces all existing nameservers.

Input parameters:

- `dns` (array, required): List of DNS server IP addresses (e.g. ['8.8.8.8', '1.1.1.1'])

### `tailscale_get_search_paths` (~22 tokens)

Get the DNS search paths configured for your tailnet.

### `tailscale_set_search_paths` (~53 tokens)

Set the DNS search paths for your tailnet. Replaces all existing search paths.

Input parameters:

- `searchPaths` (array, required): List of DNS search domains (e.g. ['example.com', 'internal.corp'])

### `tailscale_get_split_dns` (~21 tokens)

Get the split DNS configuration for your tailnet.

### `tailscale_set_split_dns` (~78 tokens)

Set split DNS configuration. Maps domains to specific nameservers. Replaces the entire split DNS configuration.

Input parameters:

- `splitDns` (object, required): Map of domain to nameserver list (e.g. { "corp.example.com": ["10.0.0.1"], "internal.dev": ["10.0.0.2"] })

### `tailscale_get_dns_preferences` (~26 tokens)

Get DNS preferences for your tailnet, including whether MagicDNS is enabled.

### `tailscale_set_dns_preferences` (~40 tokens)

Set DNS preferences for your tailnet, such as enabling or disabling MagicDNS.

Input parameters:

- `magicDNS` (boolean, required): Whether to enable MagicDNS

### `tailscale_update_split_dns` (~95 tokens)

Partially update split DNS configuration. Merges the provided domains with the existing config — only the specified domains are changed, others are untouched. Set a domain's nameservers to an empty array to remove it.

Input parameters:

- `splitDns` (object, required): Map of domain to nameserver list to merge (e.g. { "new.example.com": ["10.0.0.3"] }). Only specified domains are changed.

### `tailscale_get_dns_configuration` (~40 tokens)

Get the unified DNS configuration for your tailnet, including nameservers, search paths, split DNS, and MagicDNS preference in a single call.

### `tailscale_set_dns_configuration` (~101 tokens)

Set the unified DNS configuration for your tailnet in a single call. Replaces all DNS settings (nameservers, search paths, split DNS, MagicDNS preference).

Input parameters:

- `dns` (array): List of DNS server IP addresses
- `magicDNS` (boolean): Whether to enable MagicDNS
- `searchPaths` (array): List of DNS search domains
- `splitDns` (object): Map of domain to nameserver list for split DNS

### `tailscale_list_keys` (~67 tokens)

List keys in your tailnet. By default lists auth keys only. Set 'all' to true to include OAuth clients and federated identities.

Input parameters:

- `all` (boolean): When true, returns all key types (auth keys, OAuth clients, federated identities). Default: false

### `tailscale_get_key` (~50 tokens)

Get details for a specific key (auth key, OAuth client, or federated identity).

Input parameters:

- `keyId` (string, required): The key ID (auth key, OAuth client, or federated identity)

### `tailscale_create_key` (~495 tokens)

Create a new key in your tailnet. Supports auth keys (for adding devices), OAuth clients (for programmatic API access), and federated identities (for OIDC-based CI/CD access). Returns the key value — save it immediately, as it cannot be retrieved again.

SECURITY: the response body contains a long-lived credential verbatim. MCP clients commonly persist tool responses to logs and conversation transcripts; treat this response as sensitive (do not commit it, avoid re-sharing it in unrelated chat history).

Examples:
\- Auth key: {keyType:'auth', reusable:true, tags:['tag:ci']}
\- OAuth client: {keyType:'client', scopes:['devices:read','dns']}
\- Federated (GitHub Actions): {keyType:'federated', scopes:['devices:read'], issuer:'https://token.actions.githubusercontent.com', subject:'repo:my-org/my-repo:*'}

Input parameters:

- `audience` (string): (federated only) Expected audience claim
- `customClaimRules` (object): (federated only) Custom claim mapping rules
- `description` (string): Description for this key (max 50 chars, alphanumeric/hyphens/spaces)
- `ephemeral` (boolean): (auth only) Whether devices using this key are ephemeral (default: false)
- `expirySeconds` (number): (auth only) Key expiry in seconds (default: 90 days)
- `issuer` (string): (federated only) OIDC issuer URL (e.g. 'https://token.actions.githubusercontent.com')
- `keyType` (string): Key type: 'auth' (default) for device auth keys, 'client' for OAuth clients, 'federated' for OIDC federation
- `preauthorized` (boolean): (auth only) Whether devices are pre-authorized (default: false)
- `reusable` (boolean): (auth only) Whether the key can be used more than once (default: false)
- `scopes` (array): (client/federated) OAuth scopes to grant (e.g. ['devices:read', 'dns', 'acl'])
- `subject` (string): (federated only) Expected subject claim, supports * wildcards
- `tags` (array): ACL tags (must start with 'tag:'). Required for client/federated if scopes include 'devices:core' or 'auth_keys'

### `tailscale_delete_key` (~86 tokens)

Delete a key (auth key, OAuth client, or federated identity). This is irreversible. For auth keys, devices already authenticated are unaffected but no new devices can use it. For OAuth clients and federated identities, any integrations using them lose access immediately.

Input parameters:

- `keyId` (string, required): The key ID to delete (auth key, OAuth client, or federated identity)

### `tailscale_update_key` (~225 tokens)

Update an existing key. Supported fields depend on the key type: all key types accept 'description'; OAuth clients and federated identities additionally accept 'scopes' and 'tags'; federated identities additionally accept 'issuer', 'subject', 'audience', and 'customClaimRules'. For auth keys, pass only 'description' — the Tailscale API will reject other fields.

Input parameters:

- `audience` (string): (federated only) Updated audience claim
- `customClaimRules` (object): (federated only) Updated custom claim rules
- `description` (string): Updated description (max 50 chars, alphanumeric/hyphens/spaces)
- `issuer` (string): (federated only) Updated OIDC issuer URL
- `keyId` (string, required): The key ID to update
- `scopes` (array): (client/federated) Updated OAuth scopes
- `subject` (string): (federated only) Updated subject claim pattern
- `tags` (array): Updated ACL tags (must start with 'tag:')

### `tailscale_list_users` (~62 tokens)

List all users in your tailnet.

Input parameters:

- `role` (string): Filter by user role
- `type` (string): Filter by user type: 'member' (direct members), 'shared' (shared-in users), or 'all' (default)

### `tailscale_get_user` (~28 tokens)

Get details for a specific user.

Input parameters:

- `userId` (string, required): The user ID

### `tailscale_approve_user` (~38 tokens)

Approve a pending user, granting them access to the tailnet.

Input parameters:

- `userId` (string, required): The user ID to approve

### `tailscale_suspend_user` (~52 tokens)

Suspend a user, immediately revoking their access to the tailnet. Their devices will be disconnected. Can be reversed with tailscale_restore_user.

Input parameters:

- `userId` (string, required): The user ID to suspend

### `tailscale_restore_user` (~40 tokens)

Restore a previously suspended user, re-granting them access to the tailnet.

Input parameters:

- `userId` (string, required): The user ID to restore

### `tailscale_update_user_role` (~43 tokens)

Update a user's role in the tailnet.

Input parameters:

- `role` (string, required): The new role to assign
- `userId` (string, required): The user ID

### `tailscale_delete_user` (~45 tokens)

Delete a user from the tailnet. This is irreversible — the user and all their devices will be removed.

Input parameters:

- `userId` (string, required): The user ID to delete

### `tailscale_get_tailnet_settings` (~29 tokens)

Get your tailnet settings (device approval, key expiry, HTTPS certificates, etc.).

### `tailscale_update_tailnet_settings` (~236 tokens)

Update tailnet settings (device approval, auto-updates, key expiry, HTTPS certificates, network flow logging, regional routing, posture identity collection).

Input parameters:

- `aclsExternalLink` (string): URL to the external ACL management system (shown in the admin console)
- `aclsExternallyManagedOn` (boolean): Whether ACLs are externally managed (e.g. via GitOps)
- `devicesApprovalOn` (boolean): Whether device approval is required
- `devicesAutoUpdatesOn` (boolean): Whether auto-updates are enabled
- `devicesKeyDurationDays` (number): Key expiry duration in days
- `httpsEnabled` (boolean): Whether HTTPS certificates are enabled (for tailscale serve/funnel)
- `networkFlowLoggingOn` (boolean): Whether network flow logging is enabled
- `postureIdentityCollectionOn` (boolean): Whether posture identity collection is enabled
- `regionalRoutingOn` (boolean): Whether regional routing is enabled
- `usersApprovalOn` (boolean): Whether user approval is required
- `usersRoleAllowedToJoinExternalTailnets` (string): Which user roles can join external tailnets

### `tailscale_get_contacts` (~24 tokens)

Get the tailnet contact information (security, support, admin emails).

### `tailscale_set_contacts` (~103 tokens)

Update tailnet contact information. Each provided contact type (account/support/security) is PATCHed in parallel; per-type errors are returned alongside the successes so a partial failure doesn't lose the work that succeeded. On partial failure the response is data: { applied, failed } -- inspect data.failed for per-type error details.

Input parameters:

- `account` (object): Account contact email
- `security` (object): Security contact email
- `support` (object): Support contact email

### `tailscale_resend_contact_verification` (~39 tokens)

Resend the verification email for a tailnet contact.

Input parameters:

- `contactType` (string, required): The contact type to resend verification for

### `tailscale_list_webhooks` (~21 tokens)

List all webhooks configured for your tailnet.

### `tailscale_get_webhook` (~29 tokens)

Get details for a specific webhook.

Input parameters:

- `webhookId` (string, required): The webhook ID

### `tailscale_create_webhook` (~100 tokens)

Create a new webhook. The response includes the webhook's signing secret -- this is the only opportunity to capture it; save it immediately.

SECURITY: the response body contains the secret verbatim. MCP clients commonly persist tool responses to logs and conversation transcripts; treat this response as sensitive.

Input parameters:

- `endpointUrl` (string, required): The HTTPS URL to send webhook events to
- `subscriptions` (array, required): Event types to subscribe to (at least one)

### `tailscale_update_webhook` (~70 tokens)

Update an existing webhook's endpoint URL and/or subscriptions.

Input parameters:

- `endpointUrl` (string): New HTTPS URL to send webhook events to
- `subscriptions` (array): Updated list of event types to subscribe to (at least one)
- `webhookId` (string, required): The webhook ID to update

### `tailscale_delete_webhook` (~39 tokens)

Delete a webhook. This is irreversible — the webhook secret cannot be recovered.

Input parameters:

- `webhookId` (string, required): The webhook ID to delete

### `tailscale_rotate_webhook_secret` (~87 tokens)

Rotate a webhook's secret. Returns the new secret — save it immediately, as it cannot be retrieved again. The old secret is immediately invalidated.

SECURITY: the response body contains the secret verbatim. MCP clients commonly persist tool responses to logs and conversation transcripts; treat this response as sensitive.

Input parameters:

- `webhookId` (string, required): The webhook ID whose secret to rotate

### `tailscale_test_webhook` (~42 tokens)

Send a test event to a webhook endpoint to verify it is configured correctly and receiving events.

Input parameters:

- `webhookId` (string, required): The webhook ID to test

### `tailscale_list_posture_integrations` (~24 tokens)

List all device posture integrations configured for your tailnet.

### `tailscale_get_posture_integration` (~34 tokens)

Get details for a specific device posture integration.

Input parameters:

- `integrationId` (string, required): The posture integration ID

### `tailscale_create_posture_integration` (~210 tokens)

Create a new device posture integration.

Input parameters:

- `clientId` (string): Client ID for the provider (Intune: application UUID; Falcon/Jamf Pro: client id; Kandji/Kolide/Sentinel One: leave blank)
- `clientSecret` (string, required): The secret (auth key, token, etc.) used to authenticate with the provider. SENSITIVE: passed straight to Tailscale and not echoed back, but MCP clients may log the input value you supply.
- `cloudId` (string): Identifies which of the provider's clouds to integrate with. Falcon: us-1|us-2|eu-1|us-gov; Intune: global|us-gov; Jamf Pro/Kandji/Sentinel One: FQDN of your subdomain; Kolide: leave blank.
- `provider` (string, required): The posture provider
- `tenantId` (string): Microsoft Intune directory (tenant) ID. Other providers leave blank.

### `tailscale_update_posture_integration` (~136 tokens)

Update an existing posture integration's credentials or configuration.

Input parameters:

- `clientId` (string): Updated client ID for the provider
- `clientSecret` (string): Updated client secret for the provider (omit to retain the existing secret). SENSITIVE: passed straight to Tailscale and not echoed back, but MCP clients may log the input value you supply.
- `cloudId` (string): Updated cloud identifier (e.g. 'us-1', 'global', or provider FQDN)
- `integrationId` (string, required): The posture integration ID to update
- `tenantId` (string): Updated tenant ID

### `tailscale_delete_posture_integration` (~36 tokens)

Delete a posture integration. This is irreversible.

Input parameters:

- `integrationId` (string, required): The posture integration ID to delete

### `tailscale_get_audit_log` (~86 tokens)

Get the tailnet audit/configuration log. Shows who changed what and when — useful for troubleshooting and compliance.

Input parameters:

- `end` (string): End time in RFC3339 format. Defaults to now.
- `start` (string, required): Start time in RFC3339 format (e.g. '2026-04-01T00:00:00Z'). Required.

### `tailscale_get_network_flow_logs` (~94 tokens)

Get network traffic flow logs showing connections between devices. Shows source/destination nodes, timestamps, and traffic metadata — useful for security monitoring and debugging connectivity.

Input parameters:

- `end` (string): End time in RFC3339 format. Defaults to now.
- `start` (string, required): Start time in RFC3339 format (e.g. '2026-04-01T00:00:00Z'). Required.

### `tailscale_list_device_invites` (~36 tokens)

List all device invites for a specific device.

Input parameters:

- `deviceId` (string, required): The device ID to list invites for

### `tailscale_create_device_invite` (~107 tokens)

Create a device share invitation that allows an external user to access a specific device in your tailnet.

Input parameters:

- `allowExitNode` (boolean): Whether the invited device can be used as an exit node (default: false)
- `deviceId` (string, required): The device ID to create an invite for
- `email` (string): Email address to send the invite to
- `multiUse` (boolean): Whether the invite can be used more than once (default: false)

### `tailscale_get_device_invite` (~32 tokens)

Get details for a specific device invite.

Input parameters:

- `inviteId` (string, required): The device invite ID

### `tailscale_delete_device_invite` (~42 tokens)

Delete a device invite. This is irreversible — the invite link will stop working.

Input parameters:

- `inviteId` (string, required): The device invite ID to delete

### `tailscale_accept_device_invite` (~38 tokens)

Accept a device share invitation using the invite URL or code.

Input parameters:

- `invite` (string, required): The device invite URL or invite code

### `tailscale_list_user_invites` (~21 tokens)

List all user invites for your tailnet.

### `tailscale_create_user_invite` (~58 tokens)

Create a new user invite that allows someone to join your tailnet.

Input parameters:

- `email` (string): Email address to send the invite to
- `role` (string): Role to assign to the invited user (default: member)

### `tailscale_get_user_invite` (~32 tokens)

Get details for a specific user invite.

Input parameters:

- `inviteId` (string, required): The user invite ID

### `tailscale_delete_user_invite` (~42 tokens)

Delete a user invite. This is irreversible — the invite link will stop working.

Input parameters:

- `inviteId` (string, required): The user invite ID to delete

### `tailscale_resend_device_invite` (~34 tokens)

Resend a device invite email.

Input parameters:

- `inviteId` (string, required): The device invite ID to resend

### `tailscale_resend_user_invite` (~34 tokens)

Resend a user invite email.

Input parameters:

- `inviteId` (string, required): The user invite ID to resend

### `tailscale_list_services` (~91 tokens)

List all Tailscale Services in your tailnet. Services provide stable MagicDNS names and virtual IPs, decoupled from individual devices. Note: services are created implicitly when a node first advertises one (`tailscale up --advertise-services=svc:name`); there is no API endpoint to create a service from this MCP. Use the update/delete/approval tools here once the service exists.

### `tailscale_get_service` (~43 tokens)

Get details for a specific Tailscale Service, including its MagicDNS name, virtual IP, and configuration.

Input parameters:

- `serviceName` (string, required): The service name

### `tailscale_update_service` (~77 tokens)

Update a Tailscale Service's configuration.

Input parameters:

- `autoApproveHosts` (boolean): Whether to auto-approve devices that want to host this service
- `ports` (array): Ports the service listens on
- `serviceName` (string, required): The service name to update
- `tags` (array): ACL tags for the service

### `tailscale_delete_service` (~47 tokens)

Delete a Tailscale Service. This is irreversible — the service's MagicDNS name and virtual IP will be released.

Input parameters:

- `serviceName` (string, required): The service name to delete

### `tailscale_list_service_hosts` (~32 tokens)

List devices hosting a specific Tailscale Service.

Input parameters:

- `serviceName` (string, required): The service name

### `tailscale_get_service_device_approval` (~50 tokens)

Get the approval status of a specific device for a Tailscale Service.

Input parameters:

- `deviceId` (string, required): The device ID
- `serviceName` (string, required): The service name

### `tailscale_set_service_device_approval` (~69 tokens)

Approve or reject a device to host a Tailscale Service.

Input parameters:

- `approved` (boolean, required): Whether to approve (true) or reject (false) the device
- `deviceId` (string, required): The device ID
- `serviceName` (string, required): The service name

### `tailscale_list_log_stream_configs` (~66 tokens)

List all log streaming configurations for your tailnet. Fetches both 'configuration' (audit) and 'network' (flow) log stream configs. Log streaming sends logs to external destinations like Axiom, Datadog, Splunk, Elasticsearch, or S3.

### `tailscale_get_log_stream_config` (~49 tokens)

Get the log streaming configuration for a specific log type.

Input parameters:

- `logType` (string, required): The log type: 'configuration' for audit logs, 'network' for network flow logs

### `tailscale_set_log_stream_config` (~522 tokens)

Set the log streaming configuration for a specific log type. Configures where logs are sent (e.g. Axiom, Datadog, Splunk, Elasticsearch, S3).

Per-destination required fields:
\- splunk / elastic / panther / cribl / datadog / axiom: url + token (user optional)
\- s3: s3Bucket + s3Region + s3AuthenticationType, plus either (s3AccessKeyId + s3SecretAccessKey) for 'accesskey' auth or s3RoleArn for 'rolearn' auth. Call tailscale_create_aws_external_id first when using 'rolearn'.

Input parameters:

- `compressionFormat` (string): Compression algorithm for log uploads. Defaults to 'none'.
- `destinationType` (string, required): The log streaming destination type
- `logType` (string, required): The log type: 'configuration' for audit logs, 'network' for network flow logs
- `s3AccessKeyId` (string): (s3 only) AWS access key id. Required when s3AuthenticationType is 'accesskey'.
- `s3AuthenticationType` (string): (s3 only) Authentication mode. Required when destinationType is 's3'. Tailscale recommends 'rolearn'.
- `s3Bucket` (string): (s3 only) S3 bucket name. Required when destinationType is 's3'.
- `s3KeyPrefix` (string): (s3 only) Optional prefix prepended to the auto-generated S3 object key.
- `s3Region` (string): (s3 only) AWS region of the S3 bucket. Required when destinationType is 's3'.
- `s3RoleArn` (string): (s3 only) IAM role ARN that Tailscale will assume. Required when s3AuthenticationType is 'rolearn'.
- `s3SecretAccessKey` (string): (s3 only) AWS secret access key. Required when s3AuthenticationType is 'accesskey'. SENSITIVE: see the token field's note about MCP client logging.
- `token` (string): Authentication token or API key for the destination. SENSITIVE: passed straight to Tailscale and not echoed back, but MCP clients may log the input value you supply.
- `uploadPeriodMinutes` (integer): Minutes to wait between uploads (1-1440). Optional.
- `url` (string): Destination URL (required for non-s3 destinations)
- `user` (string): Username for the destination (if required)

### `tailscale_delete_log_stream_config` (~49 tokens)

Delete a log streaming configuration. Logs will stop being sent to the configured destination.

Input parameters:

- `logType` (string, required): The log type to stop streaming: 'configuration' or 'network'

### `tailscale_get_log_stream_status` (~58 tokens)

Get the status of log streaming for a specific log type. Shows whether logs are being delivered successfully.

Input parameters:

- `logType` (string, required): The log type: 'configuration' for audit logs, 'network' for network flow logs

### `tailscale_create_aws_external_id` (~46 tokens)

Create or get an AWS external ID for your tailnet. Used when configuring log streaming to S3 — the external ID is included in the IAM role trust policy.

### `tailscale_validate_aws_trust_policy` (~77 tokens)

Validate that an AWS IAM role trust policy is correctly configured with the Tailscale external ID. Use this after setting up the IAM role for S3 log streaming.

Input parameters:

- `externalId` (string, required): The AWS external ID to validate
- `roleArn` (string, required): The AWS IAM role ARN to validate against

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/yawlabs-tailscale-mcp/yawlabs-tailscale-mcp#diagnostics

## Score history

- 2026-08-04: 71
- 2026-08-03: 70
- 2026-08-02: 66
- 2026-08-01: 51
- 2026-07-31: 51
- 2026-07-30: 60
- 2026-07-28: 78
- 2026-07-27: 78
- 2026-07-26: 78

## Links

- npm package: https://www.npmjs.com/package/@yawlabs/tailscale-mcp
- Socket report: https://socket.dev/npm/package/@yawlabs/tailscale-mcp
- Changelog RSS feed: https://verifymcp.io/servers/yawlabs-tailscale-mcp/yawlabs-tailscale-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/yawlabs-tailscale-mcp/yawlabs-tailscale-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/yawlabs-tailscale-mcp/yawlabs-tailscale-mcp
