Skip to main content
Glama

TailscaleMCP

A FastMCP 2.13+ compliant server for managing Tailscale networks with persistent storage, modern Python tooling, and comprehensive CI/CD.

CI/CD Pipeline codecov PyPI version Python 3.10+ FastMCP 2.13+ License: MIT Persistent Storage Ruff

šŸš€ Features

  • šŸ”§ Portmanteau Tools: Consolidated tools following the database-mcp pattern to avoid tool explosion

    • tailscale_device: Comprehensive device management (list, authorize, rename, tag, SSH, search, stats, exit nodes, subnet routing, user management, auth keys)

    • tailscale_network: DNS and network management (MagicDNS, DNS records, resolution, policies, statistics)

    • tailscale_monitor: Monitoring and metrics (status, Prometheus metrics, topology, health reports, Grafana dashboards)

    • tailscale_file: File sharing via Taildrop (send, receive, transfer management, statistics) - Enhanced with real CLI integration

    • tailscale_funnel: Funnel operations for exposing local services to public internet (enable, disable, status, list, certificate info) - NEW

    • tailscale_security: Security and compliance (scanning, auditing, threat detection, policy management, alerting)

    • tailscale_automation: Workflow automation (workflows, scripts, batch operations, scheduling)

    • tailscale_backup: Backup and disaster recovery (backup creation, restoration, scheduling, testing)

    • tailscale_performance: Performance monitoring (latency, bandwidth, optimization, capacity planning)

    • tailscale_reporting: Advanced reporting (custom reports, analytics, scheduling, export)

    • tailscale_integration: Third-party integrations (webhooks, Slack, Discord, PagerDuty, Datadog)

  • šŸ“Š Comprehensive Monitoring Stack: Complete observability with Grafana, Prometheus, and Loki

    • Real-time dashboards for network visualization and device monitoring

    • Structured logging with JSON format for easy parsing and analysis

    • Prometheus metrics for performance monitoring and alerting

    • Log aggregation with Loki for centralized log analysis

    • Docker Compose setup for easy deployment and management

  • šŸ“ˆ Grafana Dashboards: 4 comprehensive dashboards for different monitoring needs

    • Network Overview: Device status, traffic, API performance

    • Logs Dashboard: Error analysis, log streams, security events

    • Device Activity: Activity heatmaps, geolocation, timelines

    • Comprehensive Monitoring: Combined overview of all metrics and logs

  • šŸ” Network Topology: Visual network topology and device relationships

  • ⚔ Prometheus Metrics: Export metrics for monitoring systems with custom metrics

  • šŸ„ Health Reports: Automated health analysis and recommendations

  • šŸ“ Structured Logging: JSON-formatted logs with rich context for Loki integration

  • Modern Tooling: FastMCP 2.13+ with persistent storage, Ruff, Pytest, structured logging

  • šŸ’¾ Persistent Storage: FastMCP 2.13+ DiskStore backend for funnels, transfers, and preferences (survives Claude Desktop and OS restarts)

    • Platform-aware storage locations (Windows: %APPDATA%, macOS: ~/Library/Application Support, Linux: ~/.local/share)

    • Encrypted by default with FernetEncryptionWrapper

    • See Storage Backends Documentation for details

  • Container Ready: Docker support with development and production images

  • CI/CD: Comprehensive GitHub Actions pipeline with security scanning

šŸŽÆ Usage

Portmanteau Tools

The TailscaleMCP server uses portmanteau tools following the database-mcp pattern to avoid tool explosion. Each tool combines multiple related operations:

Device Management (tailscale_device)

# List all devices
await tailscale_device(operation="list", online_only=True)

# Get device details
await tailscale_device(operation="get", device_id="device123")

# Authorize a device
await tailscale_device(operation="authorize", device_id="device123", authorize=True, reason="New employee")

# Rename device
await tailscale_device(operation="rename", device_id="device123", name="john-laptop")

# Add tags to device
await tailscale_device(operation="tag", device_id="device123", tags=["engineering", "laptop"])

# Enable SSH access
await tailscale_device(operation="ssh", device_id="device123", public_key="ssh-rsa...", key_name="john-key")

# Search devices
await tailscale_device(operation="search", search_query="engineering", search_fields=["name", "tags"])

# Enable exit node
await tailscale_device(operation="exit_node", device_id="device123", enable_exit_node=True, advertise_routes=["0.0.0.0/0"])

Network Management (tailscale_network)

# Get DNS configuration
await tailscale_network(operation="dns_config")

# Configure MagicDNS
await tailscale_network(operation="magic_dns", enabled=True, override_local_dns=False)

# Add DNS record
await tailscale_network(operation="dns_record", name="api.internal", record_type="A", value="100.64.0.1")

# Resolve hostname
await tailscale_network(operation="resolve", hostname="api.internal", record_type="A")

# Add search domain
await tailscale_network(operation="search_domain", domain="internal", enabled=True)

# Create network policy
await tailscale_network(operation="policy", policy_name="restrict-api", rules=[{"action": "accept", "src": ["engineering"], "dst": ["api:*"]}])

# Tailscale Services (TailVIPs) — Fall Update
# List services
await tailscale_network(operation="services_list")

# Get a service
await tailscale_network(operation="services_get", service_id="svc-123")

# Create a service
await tailscale_network(
    operation="services_create",
    service_payload={
        "name": "api-service",
        "tailvipIPv4": "100.101.102.103",
        "magicDNS": "api.tail",
        "endpoints": [
            {"deviceId": "device123", "port": 8080, "protocol": "tcp"}
        ],
        "tags": ["prod", "api"]
    }
)

# Update a service
await tailscale_network(
    operation="services_update",
    service_id="svc-123",
    service_payload={"tags": ["prod", "critical"]}
)

# Delete a service
await tailscale_network(operation="services_delete", service_id="svc-123")

Monitoring (tailscale_monitor)

# Get network status
await tailscale_monitor(operation="status")

# Get network metrics
await tailscale_monitor(operation="metrics")

# Get Prometheus metrics
await tailscale_monitor(operation="prometheus")

# Generate network topology
await tailscale_monitor(operation="topology")

# Get health report
await tailscale_monitor(operation="health")

# Create Grafana dashboard
await tailscale_monitor(operation="dashboard", grafana_url="http://grafana:3000", api_key="your-api-key")

# Export dashboard
await tailscale_monitor(operation="export", filename="tailscale-dashboard.json", dashboard_type="comprehensive")

File Sharing (tailscale_file)

# Send file via Taildrop
await tailscale_file(operation="send", file_path="/path/to/file.txt", recipient_device="device123", sender_device="device456")

# Receive file
await tailscale_file(operation="receive", transfer_id="transfer123", save_path="/downloads/")

# List active transfers
await tailscale_file(operation="list", status_filter="active")

# Cancel transfer
await tailscale_file(operation="cancel", transfer_id="transfer123")

# Get transfer status
await tailscale_file(operation="status", transfer_id="transfer123")

# Get Taildrop statistics
await tailscale_file(operation="stats")

Funnel Operations (tailscale_funnel) - NEW

# Enable Funnel for port 8080
await tailscale_funnel(operation="funnel_enable", port=8080)
# Returns public URL: https://your-device.tailnet-name.ts.net:8080

# Disable Funnel for port 8080
await tailscale_funnel(operation="funnel_disable", port=8080)

# Get Funnel status
await tailscale_funnel(operation="funnel_status")

# List all active Funnels
await tailscale_funnel(operation="funnel_list")

# Get certificate information
await tailscale_funnel(operation="funnel_certificate_info", port=8080)

Security Management (tailscale_security)

# Security vulnerability scan
await tailscale_security(operation="scan", scan_type="comprehensive")

# Compliance validation
await tailscale_security(operation="compliance", compliance_standard="SOC2")

# Device security audit
await tailscale_security(operation="audit", device_id="device123")

# Generate security report
await tailscale_security(operation="report")

# Monitor suspicious activity
await tailscale_security(operation="monitor")

# Block malicious IP
await tailscale_security(operation="block", ip_address="192.168.1.100", block_duration=3600)

# Quarantine compromised device
await tailscale_security(operation="quarantine", device_id="device123", quarantine_duration=24)

# Create security policy
await tailscale_security(operation="policy", policy_name="restrict-api", rules=[{"action": "accept", "src": ["engineering"], "dst": ["api:*"]}])

Automation (tailscale_automation)

# Create automation workflow
await tailscale_automation(operation="workflow_create", workflow_name="daily-backup", workflow_steps=[{"action": "backup", "target": "all"}])

# Execute workflow
await tailscale_automation(operation="workflow_execute", workflow_id="workflow123", execute_now=True)

# Schedule workflow
await tailscale_automation(operation="workflow_schedule", workflow_id="workflow123", schedule_cron="0 2 * * *")

# Execute custom script
await tailscale_automation(operation="script_execute", script_content="print('Hello Tailscale')", script_language="python")

# Batch operations
await tailscale_automation(operation="batch", batch_operations=[{"operation": "authorize", "device_id": "device123"}])

Backup & Recovery (tailscale_backup)

# Create configuration backup
await tailscale_backup(operation="backup_create", backup_name="daily-backup", backup_type="full")

# Restore from backup
await tailscale_backup(operation="backup_restore", backup_id="backup123")

# Schedule automated backups
await tailscale_backup(operation="backup_schedule", schedule_cron="0 2 * * *", retention_days=30)

# Test backup integrity
await tailscale_backup(operation="backup_test", backup_id="backup123")

# Create disaster recovery plan
await tailscale_backup(operation="recovery_plan")

Performance Monitoring (tailscale_performance)

# Measure network latency
await tailscale_performance(operation="latency", device_id="device123", measure_duration=60)

# Analyze bandwidth utilization
await tailscale_performance(operation="bandwidth", device_id="device123", measure_duration=300)

# Optimize routing performance
await tailscale_performance(operation="optimize", route_optimization=True)

# Establish performance baseline
await tailscale_performance(operation="baseline", baseline_name="production", baseline_duration=300)

# Predict capacity requirements
await tailscale_performance(operation="capacity", capacity_period="30d", scaling_factor=1.2)

# Get scaling recommendations
await tailscale_performance(operation="scaling", scaling_factor=1.5)

Advanced Reporting (tailscale_reporting)

# Generate usage analytics report
await tailscale_reporting(operation="usage", date_range="30d", include_charts=True)

# Create custom report
await tailscale_reporting(operation="custom", custom_fields=["device_count", "bandwidth_usage"], date_range="7d")

# Schedule automated reports
await tailscale_reporting(operation="schedule", schedule_cron="0 9 * * 1", email_recipients=["admin@company.com"])

# Export reports
await tailscale_reporting(operation="export", export_path="/reports/", report_format="pdf")

# Deep network analytics
await tailscale_reporting(operation="analytics", analytics_depth="comprehensive", date_range="90d")

# Security metrics
await tailscale_reporting(operation="security", date_range="30d", security_focus=True)

Third-Party Integrations (tailscale_integration)

# Create webhook endpoint
await tailscale_integration(operation="webhook_create", webhook_url="https://api.company.com/webhook", webhook_events=["device_connected", "device_disconnected"])

# Test webhook delivery
await tailscale_integration(operation="webhook_test", webhook_id="webhook123")

# Integrate with Slack
await tailscale_integration(operation="slack", slack_channel="#tailscale-alerts", api_key="slack-api-key")

# Integrate with Discord
await tailscale_integration(operation="discord", discord_webhook="https://discord.com/api/webhooks/...")

# Integrate with PagerDuty
await tailscale_integration(operation="pagerduty", pagerduty_key="pagerduty-integration-key")

# Integrate with Datadog
await tailscale_integration(operation="datadog", datadog_api_key="datadog-api-key", api_endpoint="https://api.datadoghq.com")

šŸ“¦ Installation

pip install tailscalemcp

From Source

git clone https://github.com/yourusername/tailscalemcp.git
cd tailscalemcp
pip install -e .

Using Docker

docker pull tailscalemcp:latest
docker run -p 8000:8000 tailscalemcp:latest

šŸ”§ Quick Start

Basic Usage

import asyncio
from tailscalemcp import TailscaleMCPServer

async def main():
    # Initialize the server
    server = TailscaleMCPServer(
        api_key="your_tailscale_api_key",
        tailnet="your_tailnet"
    )
    
    # Start the server
    await server.start()

if __name__ == "__main__":
    asyncio.run(main())

Using as Context Manager

import asyncio
from tailscalemcp import TailscaleMCPServer

async def main():
    async with TailscaleMCPServer() as server:
        # Server is automatically started
        devices = await server._list_devices_impl()
        print(f"Found {len(devices)} devices")

if __name__ == "__main__":
    asyncio.run(main())

šŸ“Š Monitoring Stack

Complete Observability Solution

The TailscaleMCP server includes a comprehensive monitoring stack with Grafana, Prometheus, and Loki for complete observability of your Tailscale network.

Features

  • šŸ“ˆ Real-time Dashboards: 4 comprehensive Grafana dashboards for different monitoring needs

  • šŸ“ Structured Logging: JSON-formatted logs with rich context for easy analysis

  • ⚔ Prometheus Metrics: Custom metrics for device activity, network traffic, and API performance

  • šŸ” Log Aggregation: Centralized log collection and analysis with Loki

  • 🐳 Docker Compose: Easy deployment and management of the entire monitoring stack

Quick Start with Monitoring

# Clone and setup
git clone https://github.com/sandraschi/tailscale-mcp.git
cd tailscale-mcp
cp env.example .env

# Edit .env with your Tailscale credentials
# TAILSCALE_API_KEY=your_api_key_here
# TAILSCALE_TAILNET=your_tailnet_name_here

# Start the complete monitoring stack
.\scripts\start-monitoring.ps1

# Access services:
# - Grafana: http://localhost:3000 (admin/admin)
# - Prometheus: http://localhost:9090
# - Loki: http://localhost:3100
# - MCP Server: http://localhost:8080

Available Dashboards

  1. Network Overview: Device status, network traffic, API performance metrics

  2. Logs Dashboard: Error analysis, log streams, security event monitoring

  3. Device Activity: Activity heatmaps, geolocation mapping, device timelines

  4. Comprehensive Monitoring: Combined overview of all metrics and logs

Monitoring Documentation

For detailed information about the monitoring stack, see:

General MCP Monitoring Standards

For comprehensive monitoring standards and reusable templates for all heavyweight MCP servers:

Specialized Monitoring Cases

For specialized monitoring documentation for specific use cases:

Mobile Monitoring Integration

For mobile monitoring solutions:

āš™ļø Configuration

Environment Variables

Variable

Description

Required

TAILSCALE_API_KEY

Your Tailscale API key

Yes

TAILSCALE_TAILNET

Your Tailnet name

Yes

LOG_LEVEL

Logging level (DEBUG, INFO, WARNING, ERROR)

No (default: INFO)

PROMETHEUS_PORT

Prometheus metrics port

No (default: 9091)

LOG_FILE

Log file path

No (default: logs/tailscale-mcp.log)

Example Configuration

export TAILSCALE_API_KEY="tskey-api-xxxxxxxxxxxxxxxxx"
export TAILSCALE_TAILNET="your-org.tailnet.ts.net"
export LOG_LEVEL="INFO"

Persistent Storage Configuration

TailscaleMCP uses DiskStore for persistent storage by default. Data is automatically stored in platform-appropriate directories:

  • Windows: %APPDATA%\Tailscale Network Controller MCP\

  • macOS: ~/Library/Application Support/Tailscale Network Controller MCP/

  • Linux: ~/.local/share/Tailscale Network Controller MCP/

Storage is encrypted by default and persists across:

  • āœ… Claude Desktop restarts

  • āœ… Operating system reboots

  • āœ… Server restarts

For more information about storage backends and configuration options, see Storage Backends Documentation.

šŸ“Š Grafana Dashboard Integration

TailscaleMCP includes comprehensive Grafana dashboard support inspired by the zydepoint/tailscale-dashboard project. You can create beautiful, interactive dashboards for monitoring your Tailscale network.

Dashboard Types

  • Comprehensive Dashboard: Complete network overview with device status, health scores, bandwidth usage, and historical trends

  • Network Topology Dashboard: Visual network topology with device relationships and connection maps

  • Security Dashboard: Security-focused monitoring with ACL overview, access patterns, and security alerts

Creating Dashboards

from tailscalemcp import TailscaleMCPServer

server = TailscaleMCPServer()

# Create comprehensive dashboard
dashboard = await server.create_grafana_dashboard("comprehensive")

# Export dashboard to file
await server.export_grafana_dashboard("comprehensive", "my_dashboard.json")

# Get dashboard summary
summary = await server.get_dashboard_summary("comprehensive")

Monitoring Features

  • Real-time Metrics: Device counts, health scores, bandwidth usage

  • Network Topology: Visual representation of device connections

  • Health Reports: Automated analysis with alerts and recommendations

  • Prometheus Integration: Export metrics for monitoring systems

Example Dashboard Demo

Run the included demo script to see all dashboard features:

python examples/grafana_dashboard_demo.py

This will create:

  • Comprehensive monitoring dashboard

  • Network topology visualization

  • Security monitoring dashboard

  • Prometheus metrics export

  • Deployment instructions

šŸ—ļø Modular Architecture

The TailscaleMCP server is built with a clean, modular architecture that separates concerns and makes the codebase maintainable and extensible.

Project Structure

src/tailscalemcp/
ā”œā”€ā”€ __init__.py
ā”œā”€ā”€ __main__.py
ā”œā”€ā”€ mcp_server.py          # Main server entry point
ā”œā”€ā”€ exceptions.py          # Custom exceptions
ā”œā”€ā”€ monitoring.py          # Monitoring and metrics collection
ā”œā”€ā”€ grafana_dashboard.py   # Grafana dashboard generation
ā”œā”€ā”€ taildrop.py           # Taildrop file sharing functionality
ā”œā”€ā”€ device_management.py  # Advanced device management
ā”œā”€ā”€ magic_dns.py          # MagicDNS and networking features
└── tools/                # Modular tool implementations
    ā”œā”€ā”€ __init__.py
    ā”œā”€ā”€ device_tools.py    # Device management tools
    ā”œā”€ā”€ monitoring_tools.py # Monitoring and metrics tools
    ā”œā”€ā”€ taildrop_tools.py  # Taildrop file sharing tools
    └── dns_tools.py       # DNS and MagicDNS tools

Tool Categories

šŸ”§ Device Management Tools (device_tools.py)

  • List and search devices

  • Device authorization and management

  • SSH access configuration

  • Device tagging and grouping

  • Exit node and subnet router management

šŸ“Š Monitoring Tools (monitoring_tools.py)

  • Network status and health monitoring

  • Prometheus metrics export

  • Network topology visualization

  • Grafana dashboard creation and export

  • Health reports and analytics

šŸ“ Taildrop Tools (taildrop_tools.py)

  • Secure file sharing between devices

  • Transfer management and monitoring

  • File expiration and cleanup

  • Transfer statistics and analytics

🌐 DNS Tools (dns_tools.py)

  • MagicDNS configuration

  • Custom DNS record management

  • DNS resolution and caching

  • Network policy management

  • ACL (Access Control List) management

Benefits of Modular Architecture

  • Maintainability: Each tool category is isolated and focused

  • Extensibility: Easy to add new tools without affecting existing functionality

  • Testability: Individual modules can be tested in isolation

  • Code Reusability: Tool modules can be reused across different contexts

  • Error Isolation: Issues in one module don't affect others

šŸ› ļø Development

Prerequisites

  • Python 3.11+

  • uv (recommended) or pip

  • Docker (optional)

Setup Development Environment

# Clone the repository
git clone https://github.com/yourusername/tailscalemcp.git
cd tailscalemcp

# Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh

# Install dependencies
make install-dev

# Setup pre-commit hooks
make pre-commit

# Or use the setup command
make setup

Development Commands

# Run tests
make test

# Run tests with coverage
make test-cov

# Run linting
make lint

# Format code
make format

# Run all checks
make all

# Build package
make build

# Run the server
make run

Docker Development

# Build development image
make docker-dev

# Run development container
make docker-run-dev

# Or use docker-compose
make dev-up

🧪 Testing

The project uses pytest with comprehensive test coverage:

# Run all tests
pytest

# Run with coverage
pytest --cov=tailscalemcp --cov-report=html

# Run specific test file
pytest tests/test_mcp_server.py

# Run with verbose output
pytest -v

šŸ“Š Code Quality

This project maintains high code quality standards:

  • Ruff: Fast Python linter and formatter

  • MyPy: Static type checking

  • Pytest: Comprehensive testing framework

  • Pre-commit: Automated code quality checks

  • Bandit: Security linting

  • Safety: Dependency vulnerability scanning

šŸš€ CI/CD Pipeline

The project includes a comprehensive CI/CD pipeline with:

  • Linting: Ruff, MyPy, and security checks

  • Testing: Multi-Python version testing with coverage

  • Security: Bandit and Safety scanning

  • Building: Package and Docker image building

  • Deployment: Automatic PyPI publishing on releases

🐳 Docker Support

Production Image

docker build -t tailscalemcp:latest .
docker run -p 8000:8000 tailscalemcp:latest

Development Image

docker build -f Dockerfile.dev -t tailscalemcp:dev .
docker run -p 8000:8000 -v $(pwd):/app tailscalemcp:dev

Docker Compose

# Production
docker-compose up -d

# Development
docker-compose --profile dev up -d

šŸ“š API Reference

Core Classes

TailscaleMCPServer

Main server class for managing Tailscale networks.

server = TailscaleMCPServer(
    api_key: Optional[str] = None,
    tailnet: Optional[str] = None
)

Available Tools

  • list_devices(online_only: bool = False, filter_tags: List[str] = None)

  • get_device(device_id: str)

  • get_network_status()

  • get_dns_config()

  • list_acls(detailed: bool = False)

  • enable_exit_node(device_id: str, advertise_routes: List[str] = None)

  • disable_exit_node(device_id: str)

  • enable_subnet_router(device_id: str, subnets: List[str])

  • disable_subnet_router(device_id: str)

Exception Handling

from tailscalemcp.exceptions import (
    TailscaleMCPError,
    AuthenticationError,
    AuthorizationError,
    NotFoundError,
    ValidationError
)

try:
    device = await server._get_device_impl("invalid_id")
except NotFoundError as e:
    print(f"Device not found: {e.message}")

šŸ¤ Contributing

We welcome contributions! Please see our Contributing Guide for details.

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Commit your changes (git commit -m 'Add amazing feature')

  4. Push to the branch (git push origin feature/amazing-feature)

  5. Open a Pull Request

Development Workflow

  1. Setup development environment: make setup

  2. Make your changes

  3. Run tests: make test

  4. Run linting: make lint

  5. Format code: make format

  6. Commit with conventional commits

  7. Push and create PR

šŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

šŸ†˜ Support

šŸ“š Additional Documentation

šŸ™ Acknowledgments

  • FastMCP for the excellent MCP framework with persistent storage support

  • Tailscale for the amazing networking platform

  • Ruff for fast Python tooling

  • py-key-value-aio for flexible storage backends

  • All contributors and users of this project


Made with ā¤ļø by the TailscaleMCP team


Further Reading

  • Expansion Plan: docs/TAILSCALE_MCP_EXPANSION_PLAN.md (includes Phase 6.5: Services)

  • Implementation Status: docs/IMPLEMENTATION_STATUS.md

-
security - not tested
A
license - permissive license
-
quality - not tested

Latest Blog Posts

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/sandraschi/tailscale-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server