Observed since 21 Oct, 09:38 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
@0xrelogic/tailscale-mcp-server
A Model Context Protocol (MCP) server that provides seamless integration with Tailscale's CLI commands and REST API, enabling automated network management and monitoring through a standardized interface. (Fixed $schema compatibility issue)
A modern Model Context Protocol (MCP) server that provides seamless integration with Tailscale's CLI commands and REST API, enabling automated network management and monitoring through a standardized interface.
@hexsleeves/tailscale-mcp-serverhexsleeves/tailscale-mcp-serverghcr.io/hexsleeves/tailscale-mcp-serverThis project is optimized for Bun for faster installation and execution. NPM is supported as a fallback option.
# Install Bun (if not already installed)
curl -fsSL https://bun.sh/install | bash
# Install dependencies
bun install
# Build and run
bun run build
bun start
npm ci
npm run build
npm start
This project includes comprehensive documentation organized by domain:
Run directly without installation:
# Explicit package syntax (most reliable)
npx --package=@hexsleeves/tailscale-mcp-server tailscale-mcp-server
# Or install globally
npm install -g @hexsleeves/tailscale-mcp-server
tailscale-mcp-server
# GitHub Container Registry (recommended)
docker run -d \
--name tailscale-mcp \
-e TAILSCALE_API_KEY=your_api_key \
-e TAILSCALE_TAILNET=your_tailnet \
ghcr.io/hexsleeves/tailscale-mcp-server:latest
# Or use Docker Compose
docker-compose up -d
📖 For detailed Docker usage, development workflows, and deployment strategies, see the Docker Guide
Add to your Claude Desktop configuration (~/.claude/claude_desktop_config.json):
{
"mcpServers": {
"tailscale": {
"command": "npx",
"args": [
"--package=@hexsleeves/tailscale-mcp-server",
"tailscale-mcp-server"
],
"env": {
"TAILSCALE_API_KEY": "your-api-key-here",
"TAILSCALE_TAILNET": "your-tailnet-name"
}
}
}
}
{
"mcpServers": {
"tailscale": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"TAILSCALE_API_KEY=your-api-key",
"-e",
"TAILSCALE_TAILNET=your-tailnet",
"ghcr.io/hexsleeves/tailscale-mcp-server:latest"
]
}
}
}
| Variable | Description | Required | Default |
|---|---|---|---|
TAILSCALE_API_KEY | Tailscale API key | Yes* | - |
TAILSCALE_TAILNET | Tailscale tailnet name | Yes* | - |
TAILSCALE_API_BASE_URL | API base URL | No | https://api.tailscale.com |
LOG_LEVEL | Logging level (0-3) | No | 1 (INFO) |
MCP_SERVER_LOG_FILE | Server log file path | No | - |
*Required for API-based operations. CLI operations work without API credentials.
list_devices - List all devices in the Tailscale networkdevice_action - Perform actions on specific devices (authorize, deauthorize, delete, expire-key)manage_routes - Enable or disable routes for devicesget_network_status - Get current network status from Tailscale CLIconnect_network - Connect to the Tailscale networkdisconnect_network - Disconnect from the Tailscale networkping_peer - Ping a peer deviceget_version - Get Tailscale version informationget_tailnet_info - Get detailed network information# Clone and setup
git clone https://github.com/HexSleeves/tailscale-mcp-server.git
cd tailscale-mcp-server
# Install Bun (recommended) or use npm
curl -fsSL https://bun.sh/install | bash
bun install # or: npm install
# Setup environment
cp .env.example .env
# Edit .env with your Tailscale credentials
# Build and run
bun run build # or: npm run build
bun start # or: npm start
# Development workflow (Bun recommended)
bun run dev:direct # Fast development with tsx
bun run dev:watch # Auto-rebuild on changes
bun run build:watch # Build with file watching
# Development workflow (NPM fallback)
npm run dev:direct
npm run dev:watch
npm run build:watch
# Testing (Bun recommended)
bun test # All tests
bun run test:unit # Unit tests only
bun run test:integration # Integration tests (requires Tailscale CLI)
bun run test:watch # Watch mode
# Testing (NPM fallback)
npm test
npm run test:unit
npm run test:integration
npm run test:watch
# Quality assurance (Bun recommended)
bun run qa # Quick QA (typecheck + unit tests + lint)
bun run qa:full # Full QA (all tests + checks)
bun run typecheck # TypeScript validation
# Quality assurance (NPM fallback)
npm run qa
npm run qa:full
npm run typecheck
# Tools (Bun recommended)
bun run inspector # Test with MCP Inspector
# Tools (NPM fallback)
npm run inspector
{
"mcpServers": {
"tailscale-dev": {
"command": "node",
"args": ["/path/to/your/tailscale-mcp-server/dist/index.js"],
"env": {
"TAILSCALE_API_KEY": "your-api-key-here",
"TAILSCALE_TAILNET": "your-tailnet-name",
"LOG_LEVEL": "0"
}
}
}
}
📖 For comprehensive development guides, testing strategies, and CI/CD information:
- Testing Documentation - Unit tests, integration tests, coverage
- Docker Development - Container-based development workflows
- CI/CD Workflows - GitHub Actions, automation, releases
src/
├── server.ts # Main server implementation
├── tools/ # Modular tool definitions
├── tailscale/ # Tailscale integrations
├── types.ts # Type definitions
├── logger.ts # Logging utilities
└── index.ts # Entry point
Create a tool module in src/tools/ and register it in src/server.ts. See existing tools for examples of the modular architecture using Zod schemas and TypeScript.
# Enable debug logging
export LOG_LEVEL=0
export MCP_SERVER_LOG_FILE=debug-{timestamp}.log
# View logs
tail -f logs/debug-*.log
git checkout -b feature/amazing-featurebun run qa:full (or npm run qa:full)git commit -m 'Add amazing feature'git push origin feature/amazing-featureMIT License - see LICENSE file for details.
See CHANGELOG.md for version history and updates.
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
zodEnvironment{
"local_name": "zod",
"alias": false,
"peer_metadata": null
} | ^4.0.5 | runtime |
axiosEnvironment{
"local_name": "axios",
"alias": false,
"peer_metadata": null
} | ^1.10.0 | runtime |
dotenvEnvironment{
"local_name": "dotenv",
"alias": false,
"peer_metadata": null
} | ^17.2.0 | runtime |
expressEnvironment{
"local_name": "express",
"alias": false,
"peer_metadata": null
} | ^5.1.0 | runtime |
@modelcontextprotocol/sdkEnvironment{
"local_name": "@modelcontextprotocol/sdk",
"alias": false,
"peer_metadata": null
} | ^1.16.0 | runtime |
tsxEnvironment{
"local_name": "tsx",
"alias": false,
"peer_metadata": null
} | ^4.20.3 | development |
eslintEnvironment{
"local_name": "eslint",
"alias": false,
"peer_metadata": null
} | ^9.31.0 | development |
rimrafEnvironment{
"local_name": "rimraf",
"alias": false,
"peer_metadata": null
} | ^6.0.1 | development |
semverEnvironment{
"local_name": "semver",
"alias": false,
"peer_metadata": null
} | ^7.7.2 | development |
esbuildEnvironment{
"local_name": "esbuild",
"alias": false,
"peer_metadata": null
} | ^0.25.6 | development |
globalsEnvironment{
"local_name": "globals",
"alias": false,
"peer_metadata": null
} | ^16.3.0 | development |
audit-ciEnvironment{
"local_name": "audit-ci",
"alias": false,
"peer_metadata": null
} | ^7.1.0 | development |
prettierEnvironment{
"local_name": "prettier",
"alias": false,
"peer_metadata": null
} | 3.6.2 | development |
@eslint/jsEnvironment{
"local_name": "@eslint/js",
"alias": false,
"peer_metadata": null
} | ^9.31.0 | development |
@types/bunEnvironment{
"local_name": "@types/bun",
"alias": false,
"peer_metadata": null
} | latest | development |
typescriptEnvironment{
"local_name": "typescript",
"alias": false,
"peer_metadata": null
} | ^5.8.3 | development |
@types/nodeEnvironment{
"local_name": "@types/node",
"alias": false,
"peer_metadata": null
} | ^24.0.14 | development |
@eslint/jsonEnvironment{
"local_name": "@eslint/json",
"alias": false,
"peer_metadata": null
} | ^0.13.0 | development |
@biomejs/biomeEnvironment{
"local_name": "@biomejs/biome",
"alias": false,
"peer_metadata": null
} | 2.1.2 | development |
@types/expressEnvironment{
"local_name": "@types/express",
"alias": false,
"peer_metadata": null
} | ^5.0.3 | development |
@eslint/markdownEnvironment{
"local_name": "@eslint/markdown",
"alias": false,
"peer_metadata": null
} | ^7.0.0 | development |
typescript-eslintEnvironment{
"local_name": "typescript-eslint",
"alias": false,
"peer_metadata": null
} | ^8.37.0 | development |
@types/json-schemaEnvironment{
"local_name": "@types/json-schema",
"alias": false,
"peer_metadata": null
} | 7.0.15 | development |
@typescript-eslint/parserEnvironment{
"local_name": "@typescript-eslint/parser",
"alias": false,
"peer_metadata": null
} | ^8.37.0 | development |
@typescript-eslint/eslint-pluginEnvironment{
"local_name": "@typescript-eslint/eslint-plugin",
"alias": false,
"peer_metadata": null
} | ^8.37.0 | development |
Source distribution
{
"shasum": "1cee5620379822cadd548d7cb76a6f513f1f9cf4",
"tarball": "https://registry.npmjs.org/@0xrelogic/tailscale-mcp-server/-/tailscale-mcp-server-0.3.1.tgz",
"fileCount": 4,
"integrity": "sha512-diuAOuHkLYXb7DzlnGMsJfFwqXl+mLD7gRVzPIB+CDdDPZa7m8aUBG3geKRq6o0wsoMqh+2J29eIyNhEj19oFA==",
"signatures": [
{
"sig": "MEUCIQCSDkfhePVePlxrTiDYNYzOQFq8KqRNhK0E/54drFG/rwIgMtehNrmf0IlqE3IbfSomfv0Ut6P5kTlb77w4RzPZpto=",
"keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"
}
],
"unpackedSize": 132710
}Observed since 21 Oct, 09:38 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:22ab7b33f747ddf7e69fb7fbf2d2ea6e78bbae22e6b066dc9f495c6533f511a6