@yawlabs/tailscale-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TAILSCALE_DEBUG | No | Set to '1' to enable debug logging | |
| TAILSCALE_TOOLS | No | Comma-separated tool groups to include | |
| TAILSCALE_BINARY | No | Absolute path to tailscale binary | |
| TAILSCALE_API_KEY | No | Tailscale API key (or use OAuth credentials) | |
| TAILSCALE_PROFILE | No | Preset filter: minimal, core, or full | |
| TAILSCALE_TAILNET | No | Tailnet to use (defaults to your default tailnet) | |
| TAILSCALE_READONLY | No | Set to '1' or 'true' to drop mutation tools | |
| TAILSCALE_LOCAL_CLI | No | Set to '1' to enable local CLI diagnostics | |
| TAILSCALE_MAX_CONCURRENT | No | Cap in-flight API requests at N | |
| TAILSCALE_OAUTH_CLIENT_ID | No | OAuth client ID | |
| TAILSCALE_REQUEST_BUDGET_MS | No | Total wall-clock budget per request in ms (default 90000) | |
| TAILSCALE_OAUTH_CLIENT_SECRET | No | OAuth client secret | |
| TAILSCALE_EXTRA_WEBHOOK_EVENTS | No | Comma-separated list of extra webhook event types to accept |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| tailscale_statusA | 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_devicesA | List all devices in your tailnet with their status, IP addresses, OS, and last seen time. |
| tailscale_get_deviceA | Get detailed information about a specific device by its ID. |
| tailscale_authorize_deviceA | Authorize a device that is pending authorization. |
| tailscale_deauthorize_deviceA | Deauthorize a device, immediately removing its access to the tailnet. The device will need to be re-authorized to reconnect. |
| tailscale_delete_deviceA | Permanently remove a device from the tailnet. This is irreversible — the device must re-authenticate to rejoin. |
| tailscale_rename_deviceA | Set the name of a device in the tailnet. |
| tailscale_expire_deviceA | Expire a device's key, forcing it to re-authenticate. |
| tailscale_get_device_routesA | Get the subnet routes a device advertises and which are enabled. |
| tailscale_set_device_routesA | Set the enabled subnet routes for a device. Replaces all currently enabled routes — pass the full list of routes you want enabled. |
| tailscale_get_device_posture_attributesA | Get all posture attributes for a device, including custom and system-managed attributes. |
| tailscale_set_device_posture_attributeA | 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. |
| tailscale_delete_device_posture_attributeA | Delete a custom posture attribute from a device. This is irreversible. |
| tailscale_set_device_tagsA | Set ACL tags on a device. Replaces all existing tags — pass the full list of tags you want applied. |
| tailscale_set_device_ipB | Set the Tailscale IPv4 address for a device. |
| tailscale_update_device_keyA | Update a device's key settings, such as disabling key expiry. Useful for servers that should never need to re-authenticate. |
| tailscale_set_devices_authorizedA | 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. |
| tailscale_batch_update_posture_attributesA | 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. |
| tailscale_get_aclA | 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_aclA | 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. |
| tailscale_validate_aclA | Validate an ACL policy without applying it. Returns any errors found, or confirms the policy is valid. |
| tailscale_preview_aclA | Preview the ACL rules that would apply to a specific user or IP address if a proposed policy were applied. |
| tailscale_get_nameserversA | Get the DNS nameservers configured for your tailnet. |
| tailscale_set_nameserversA | Set the DNS nameservers for your tailnet. Replaces all existing nameservers. |
| tailscale_get_search_pathsA | Get the DNS search paths configured for your tailnet. |
| tailscale_set_search_pathsA | Set the DNS search paths for your tailnet. Replaces all existing search paths. |
| tailscale_get_split_dnsA | Get the split DNS configuration for your tailnet. |
| tailscale_set_split_dnsA | Set split DNS configuration. Maps domains to specific nameservers. Replaces the entire split DNS configuration. |
| tailscale_get_dns_preferencesA | Get DNS preferences for your tailnet, including whether MagicDNS is enabled. |
| tailscale_set_dns_preferencesB | Set DNS preferences for your tailnet, such as enabling or disabling MagicDNS. |
| tailscale_update_split_dnsA | 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. |
| tailscale_get_dns_configurationA | Get the unified DNS configuration for your tailnet, including nameservers, search paths, split DNS, and MagicDNS preference in a single call. |
| tailscale_set_dns_configurationA | Set the unified DNS configuration for your tailnet in a single call. Replaces all DNS settings (nameservers, search paths, split DNS, MagicDNS preference). |
| tailscale_list_keysA | List keys in your tailnet. By default lists auth keys only. Set 'all' to true to include OAuth clients and federated identities. |
| tailscale_get_keyA | Get details for a specific key (auth key, OAuth client, or federated identity). |
| tailscale_create_keyA | 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:
|
| tailscale_delete_keyA | 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. |
| tailscale_update_keyA | 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. |
| tailscale_list_usersA | List all users in your tailnet. |
| tailscale_get_userA | Get details for a specific user. |
| tailscale_approve_userA | Approve a pending user, granting them access to the tailnet. |
| tailscale_suspend_userA | Suspend a user, immediately revoking their access to the tailnet. Their devices will be disconnected. Can be reversed with tailscale_restore_user. |
| tailscale_restore_userA | Restore a previously suspended user, re-granting them access to the tailnet. |
| tailscale_update_user_roleA | Update a user's role in the tailnet. |
| tailscale_delete_userA | Delete a user from the tailnet. This is irreversible — the user and all their devices will be removed. |
| tailscale_get_tailnet_settingsA | Get your tailnet settings (device approval, key expiry, HTTPS certificates, etc.). |
| tailscale_update_tailnet_settingsB | Update tailnet settings (device approval, auto-updates, key expiry, HTTPS certificates, network flow logging, regional routing, posture identity collection). |
| tailscale_get_contactsA | Get the tailnet contact information (security, support, admin emails). |
| tailscale_set_contactsA | 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. |
| tailscale_resend_contact_verificationA | Resend the verification email for a tailnet contact. |
| tailscale_list_webhooksA | List all webhooks configured for your tailnet. |
| tailscale_get_webhookA | Get details for a specific webhook. |
| tailscale_create_webhookA | 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. |
| tailscale_update_webhookB | Update an existing webhook's endpoint URL and/or subscriptions. |
| tailscale_delete_webhookA | Delete a webhook. This is irreversible — the webhook secret cannot be recovered. |
| tailscale_rotate_webhook_secretA | 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. |
| tailscale_test_webhookA | Send a test event to a webhook endpoint to verify it is configured correctly and receiving events. |
| tailscale_list_posture_integrationsA | List all device posture integrations configured for your tailnet. |
| tailscale_get_posture_integrationA | Get details for a specific device posture integration. |
| tailscale_create_posture_integrationA | Create a new device posture integration. |
| tailscale_update_posture_integrationA | Update an existing posture integration's credentials or configuration. |
| tailscale_delete_posture_integrationA | Delete a posture integration. This is irreversible. |
| tailscale_get_audit_logA | Get the tailnet audit/configuration log. Shows who changed what and when — useful for troubleshooting and compliance. |
| tailscale_get_network_flow_logsA | Get network traffic flow logs showing connections between devices. Shows source/destination nodes, timestamps, and traffic metadata — useful for security monitoring and debugging connectivity. |
| tailscale_list_device_invitesA | List all device invites for a specific device. |
| tailscale_create_device_inviteA | Create a device share invitation that allows an external user to access a specific device in your tailnet. |
| tailscale_get_device_inviteB | Get details for a specific device invite. |
| tailscale_delete_device_inviteA | Delete a device invite. This is irreversible — the invite link will stop working. |
| tailscale_accept_device_inviteB | Accept a device share invitation using the invite URL or code. |
| tailscale_list_user_invitesA | List all user invites for your tailnet. |
| tailscale_create_user_inviteB | Create a new user invite that allows someone to join your tailnet. |
| tailscale_get_user_inviteA | Get details for a specific user invite. |
| tailscale_delete_user_inviteA | Delete a user invite. This is irreversible — the invite link will stop working. |
| tailscale_resend_device_inviteB | Resend a device invite email. |
| tailscale_resend_user_inviteB | Resend a user invite email. |
| tailscale_list_servicesA | 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_get_serviceA | Get details for a specific Tailscale Service, including its MagicDNS name, virtual IP, and configuration. |
| tailscale_update_serviceB | Update a Tailscale Service's configuration. |
| tailscale_delete_serviceA | Delete a Tailscale Service. This is irreversible — the service's MagicDNS name and virtual IP will be released. |
| tailscale_list_service_hostsA | List devices hosting a specific Tailscale Service. |
| tailscale_get_service_device_approvalA | Get the approval status of a specific device for a Tailscale Service. |
| tailscale_set_service_device_approvalA | Approve or reject a device to host a Tailscale Service. |
| tailscale_list_log_stream_configsA | 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_configA | Get the log streaming configuration for a specific log type. |
| tailscale_set_log_stream_configA | 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:
|
| tailscale_delete_log_stream_configA | Delete a log streaming configuration. Logs will stop being sent to the configured destination. |
| tailscale_get_log_stream_statusA | Get the status of log streaming for a specific log type. Shows whether logs are being delivered successfully. |
| tailscale_create_aws_external_idA | 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_policyA | 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| tailnet-status | Current tailnet status including device count and settings |
| tailnet-devices | List of all devices in the tailnet with their status |
| tailnet-acl | Current ACL policy (HuJSON with comments preserved) |
| tailnet-dns | DNS configuration including nameservers, search paths, split DNS, and MagicDNS status |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/YawLabs/tailscale-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server