{"_id":"@comicchang/tailscale-mcp-server","_rev":"9-6f18154932647dbf17ddfacd93139e18","name":"@comicchang/tailscale-mcp-server","dist-tags":{"latest":"0.3.11"},"versions":{"0.3.5":{"name":"@comicchang/tailscale-mcp-server","version":"0.3.5","keywords":["tailscale","mcp","model context protocol","tailscale mcp","tailscale mcp server"],"author":{"name":"comicchang"},"license":"MIT","_id":"@comicchang/tailscale-mcp-server@0.3.5","maintainers":[{"name":"comicchang","email":"comicchang@gmail.com"}],"bin":{"tailscale-mcp-server":"dist/index.js"},"dist":{"shasum":"aaa54a9a45ea973cfde9458c8ee4b131169f0107","tarball":"https://registry.npmjs.org/@comicchang/tailscale-mcp-server/-/tailscale-mcp-server-0.3.5.tgz","fileCount":5,"integrity":"sha512-EeUmwimm57PmcnQHYlkSBK29d07/fjEn4QEWM7BQeGrH00G9598FdDZvtJeuxdGEepa9VbiMwmCOMc+idoEpjA==","signatures":[{"sig":"MEUCIEiWdgXUZvc1yNkwny/74Nu48fuKVfODjV2R3HefcjdQAiEA9JHz5ZEXGY0IGdZGMVAdtqUwUa9FnIWGiiaKldtt61o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174350},"main":"dist/index.js","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"7152aa6b250f060fa0f81b9a07728bdb00edd0da","scripts":{"qa":"bun run typecheck && bun run test:unit && bun run check","dev":"bun run build:dev && bun dist/index.js","lint":"biome lint .","test":"bun test","build":"bun esbuild.config.js build","check":"biome check .","clean":"rimraf dist","start":"bun dist/index.js","format":"biome format --write .","publish":"./scripts/publish.sh","qa:full":"bun run typecheck && bun run test && bun run check","test:ci":"bun test ./src/__test__/utils/","build:dev":"bun esbuild.config.js dev","check:fix":"biome check --write .","dev:watch":"bun run build:watch","inspector":"bunx @modelcontextprotocol/inspector bun dist/index.js","test:unit":"bun test ./src/__test__/utils/ ./src/__test__/tailscale/oauth.test.ts","typecheck":"tsc --noEmit","dev:direct":"tsx src/index.ts","test:setup":"./scripts/setup-testing.sh","build:watch":"bun esbuild.config.js watch","publish:test":"./scripts/test-publish.sh","test:unit:ci":"npm run test:ci","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","test:integration":"bun test ./src/__test__/tailscale/*.integration.test.ts","test:integration:ci":"bun test --coverage --testNamePattern='integration'"},"_npmUser":{"name":"comicchang","email":"comicchang@gmail.com"},"_npmVersion":"10.8.2","description":"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.","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^4.3.6","axios":"^1.13.4","dotenv":"^17.2.3","express":"^5.2.1","ipaddr.js":"2.3.0","@modelcontextprotocol/sdk":"^1.25.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","rimraf":"^6.1.2","semver":"^7.7.3","esbuild":"^0.27.2","audit-ci":"^7.1.0","@types/bun":"latest","typescript":"^5.9.3","@types/node":"^25.0.10","@biomejs/biome":"2.3.13","@types/express":"^5.0.6","@types/json-schema":"7.0.15"},"_npmOperationalInternal":{"tmp":"tmp/tailscale-mcp-server_0.3.5_1773294871619_0.508621675648393","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@comicchang/tailscale-mcp-server","version":"0.3.7","keywords":["tailscale","mcp","model context protocol","tailscale mcp","tailscale mcp server"],"author":{"name":"comicchang"},"license":"MIT","_id":"@comicchang/tailscale-mcp-server@0.3.7","maintainers":[{"name":"comicchang","email":"comicchang@gmail.com"}],"bin":{"tailscale-mcp-server":"dist/index.js"},"dist":{"shasum":"00f073fd19f426ef57d79971b3fd64bbe8adc236","tarball":"https://registry.npmjs.org/@comicchang/tailscale-mcp-server/-/tailscale-mcp-server-0.3.7.tgz","fileCount":5,"integrity":"sha512-c1wEH+GXu/hTgIe6EC9gLv48vqDk4O3ptJOoJNdN8DcvCYHiEO9ppTwFjaRzxPLpCXJnwhICPa6N77vTRWub9A==","signatures":[{"sig":"MEQCIAdPZGOy2loWWodZMUwLz/F1GzUakMkt080PwNB6dnYYAiA4DhJH2I+Eyzppq71NudTMOUwKA3+NfwS+X6rEqzO+5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174362},"main":"dist/index.js","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"25fe46a91e23980b22aa6a08d60820e6a2b61ca9","scripts":{"qa":"bun run typecheck && bun run test:unit && bun run check","dev":"bun run build:dev && bun dist/index.js","lint":"biome lint .","test":"bun test","build":"bun esbuild.config.js build","check":"biome check .","clean":"rimraf dist","start":"bun dist/index.js","format":"biome format --write .","qa:full":"bun run typecheck && bun run test && bun run check","test:ci":"bun test ./src/__test__/utils/","build:dev":"bun esbuild.config.js dev","check:fix":"biome check --write .","dev:watch":"bun run build:watch","inspector":"bunx @modelcontextprotocol/inspector bun dist/index.js","test:unit":"bun test ./src/__test__/utils/ ./src/__test__/tailscale/oauth.test.ts","typecheck":"tsc --noEmit","dev:direct":"tsx src/index.ts","test:setup":"./scripts/setup-testing.sh","build:watch":"bun esbuild.config.js watch","test:unit:ci":"npm run test:ci","release:local":"./scripts/publish.sh","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","test:integration":"bun test ./src/__test__/tailscale/*.integration.test.ts","release:local:test":"./scripts/test-publish.sh","test:integration:ci":"bun test --coverage --testNamePattern='integration'"},"_npmUser":{"name":"comicchang","email":"comicchang@gmail.com"},"_npmVersion":"10.8.2","description":"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.","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^4.3.6","axios":"^1.13.4","dotenv":"^17.2.3","express":"^5.2.1","ipaddr.js":"2.3.0","@modelcontextprotocol/sdk":"^1.25.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","rimraf":"^6.1.2","semver":"^7.7.3","esbuild":"^0.27.2","audit-ci":"^7.1.0","@types/bun":"latest","typescript":"^5.9.3","@types/node":"^25.0.10","@biomejs/biome":"2.3.13","@types/express":"^5.0.6","@types/json-schema":"7.0.15"},"_npmOperationalInternal":{"tmp":"tmp/tailscale-mcp-server_0.3.7_1773295352760_0.8437944699219917","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"@comicchang/tailscale-mcp-server","version":"0.3.8","keywords":["tailscale","mcp","model context protocol","tailscale mcp","tailscale mcp server"],"author":{"name":"comicchang"},"license":"MIT","_id":"@comicchang/tailscale-mcp-server@0.3.8","maintainers":[{"name":"comicchang","email":"comicchang@gmail.com"}],"bin":{"tailscale-mcp-server":"dist/index.js"},"dist":{"shasum":"36a0886842183b67045ae9a303680e4655eda3d2","tarball":"https://registry.npmjs.org/@comicchang/tailscale-mcp-server/-/tailscale-mcp-server-0.3.8.tgz","fileCount":5,"integrity":"sha512-3G9Z5U1XsXyuZsbbOPXTUp3dzVzjbmoGrnRFIAggZ+FYYlvkZiOf0OKTBqmBG8lrntI03WILhNRrsSDb3joFYg==","signatures":[{"sig":"MEQCIEGm2nvMA67Id1t7Zi/7kiqDB2GJ+rKFNikUxielcjYJAiAuURI6nuZOIShf6e7iTorPYC+rVwXX8HFPVopMQNLrAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174315},"main":"dist/index.js","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"6cf9e67ec1eaccc6a5c61838ad5b08c7213eaee4","scripts":{"qa":"bun run typecheck && bun run test:unit && bun run check","dev":"bun run build:dev && bun dist/index.js","lint":"biome lint .","test":"bun test","build":"bun esbuild.config.js build","check":"biome check .","clean":"rimraf dist","start":"bun dist/index.js","format":"biome format --write .","qa:full":"bun run typecheck && bun run test && bun run check","test:ci":"bun test ./src/__test__/utils/","build:dev":"bun esbuild.config.js dev","check:fix":"biome check --write .","dev:watch":"bun run build:watch","inspector":"bunx @modelcontextprotocol/inspector bun dist/index.js","test:unit":"bun test ./src/__test__/utils/ ./src/__test__/tailscale/oauth.test.ts","typecheck":"tsc --noEmit","dev:direct":"tsx src/index.ts","test:setup":"./scripts/setup-testing.sh","build:watch":"bun esbuild.config.js watch","test:unit:ci":"npm run test:ci","release:local":"./scripts/publish.sh","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","test:integration":"bun test ./src/__test__/tailscale/*.integration.test.ts","release:local:test":"./scripts/test-publish.sh","test:integration:ci":"bun test --coverage --testNamePattern='integration'"},"_npmUser":{"name":"comicchang","email":"comicchang@gmail.com"},"_npmVersion":"10.8.2","description":"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.","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^4.3.6","axios":"^1.13.4","dotenv":"^17.2.3","express":"^5.2.1","ipaddr.js":"2.3.0","@modelcontextprotocol/sdk":"^1.25.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","rimraf":"^6.1.2","semver":"^7.7.3","esbuild":"^0.27.2","audit-ci":"^7.1.0","@types/bun":"latest","typescript":"^5.9.3","@types/node":"^25.0.10","@biomejs/biome":"2.3.13","@types/express":"^5.0.6","@types/json-schema":"7.0.15"},"_npmOperationalInternal":{"tmp":"tmp/tailscale-mcp-server_0.3.8_1773298642313_0.07135919429263571","host":"s3://npm-registry-packages-npm-production"}},"0.3.9":{"name":"@comicchang/tailscale-mcp-server","version":"0.3.9","keywords":["tailscale","mcp","model context protocol","tailscale mcp","tailscale mcp server"],"author":{"name":"comicchang"},"license":"MIT","_id":"@comicchang/tailscale-mcp-server@0.3.9","maintainers":[{"name":"comicchang","email":"comicchang@gmail.com"}],"bin":{"tailscale-mcp-server":"dist/index.js"},"dist":{"shasum":"be73a3b0acaa5c539e13a9b2b0b1e7c96e5d7230","tarball":"https://registry.npmjs.org/@comicchang/tailscale-mcp-server/-/tailscale-mcp-server-0.3.9.tgz","fileCount":5,"integrity":"sha512-yFIuEKMp7HO18SwFMEdn9Vh4mNKffqo3eG1oCmVNOOm0ZX5OBE2TGa9g25r7HYi9joBJ1Pl9wLGAD4u/DMnFaA==","signatures":[{"sig":"MEUCIQCm7DziqlVHzUcO97M4S26L+lKFBD41EegtyaZ220etkQIgQHznsLCUQSD6Vud6JWf7KnpZLQS1ffBMWj6OCcmFjcc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175131},"main":"dist/index.js","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"4df39a713bf06f293acbdc0700ec3a1d6908d6a2","scripts":{"qa":"bun run typecheck && bun run test:unit && bun run check","dev":"bun run build:dev && bun dist/index.js","lint":"biome lint .","test":"bun test","build":"bun esbuild.config.js build","check":"biome check .","clean":"rimraf dist","start":"bun dist/index.js","format":"biome format --write .","qa:full":"bun run typecheck && bun run test && bun run check","test:ci":"bun test ./src/__test__/utils/","build:dev":"bun esbuild.config.js dev","check:fix":"biome check --write .","dev:watch":"bun run build:watch","inspector":"bunx @modelcontextprotocol/inspector bun dist/index.js","test:unit":"bun test ./src/__test__/utils/ ./src/__test__/tailscale/oauth.test.ts","typecheck":"tsc --noEmit","dev:direct":"tsx src/index.ts","test:setup":"./scripts/setup-testing.sh","build:watch":"bun esbuild.config.js watch","test:unit:ci":"npm run test:ci","release:local":"./scripts/publish.sh","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","test:integration":"bun test ./src/__test__/tailscale/*.integration.test.ts","release:local:test":"./scripts/test-publish.sh","test:integration:ci":"bun test --coverage --testNamePattern='integration'"},"_npmUser":{"name":"comicchang","email":"comicchang@gmail.com"},"_npmVersion":"10.8.2","description":"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.","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^4.3.6","axios":"^1.13.4","dotenv":"^17.2.3","express":"^5.2.1","ipaddr.js":"2.3.0","@modelcontextprotocol/sdk":"^1.25.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","rimraf":"^6.1.2","semver":"^7.7.3","esbuild":"^0.27.2","audit-ci":"^7.1.0","@types/bun":"latest","typescript":"^5.9.3","@types/node":"^25.0.10","@biomejs/biome":"2.3.13","@types/express":"^5.0.6","@types/json-schema":"7.0.15"},"_npmOperationalInternal":{"tmp":"tmp/tailscale-mcp-server_0.3.9_1773299052089_0.8025346858703104","host":"s3://npm-registry-packages-npm-production"}},"0.3.10":{"name":"@comicchang/tailscale-mcp-server","version":"0.3.10","keywords":["tailscale","mcp","model context protocol","tailscale mcp","tailscale mcp server"],"author":{"name":"comicchang"},"license":"MIT","_id":"@comicchang/tailscale-mcp-server@0.3.10","maintainers":[{"name":"comicchang","email":"comicchang@gmail.com"}],"bin":{"tailscale-mcp-server":"dist/index.js"},"dist":{"shasum":"c0288621db0135d04644a1418468fab1d5061e48","tarball":"https://registry.npmjs.org/@comicchang/tailscale-mcp-server/-/tailscale-mcp-server-0.3.10.tgz","fileCount":5,"integrity":"sha512-MyIjmI22dghhzuj1CQuH1lMcWcjBCNB3m4zXfboafO+isPnnctxNfZxBQi1HDu36ukdj9giYWLrw9EqPczguDQ==","signatures":[{"sig":"MEQCICFH7T8HOOIfm46i8KMSg/cFDVaOcMYOHc28ERKVSfs5AiAAvKRiU7J7Z1NQ53GFBpvnIY/KoTVwpXoKRO246o6M3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175408},"main":"dist/index.js","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"3c9158a9eb1bb5921d890f22b40ed7408e0a98ac","scripts":{"qa":"bun run typecheck && bun run test:unit && bun run check","dev":"bun run build:dev && bun dist/index.js","lint":"biome lint .","test":"bun test","build":"bun esbuild.config.js build","check":"biome check .","clean":"rimraf dist","start":"bun dist/index.js","format":"biome format --write .","qa:full":"bun run typecheck && bun run test && bun run check","test:ci":"bun test ./src/__test__/utils/","build:dev":"bun esbuild.config.js dev","check:fix":"biome check --write .","dev:watch":"bun run build:watch","inspector":"bunx @modelcontextprotocol/inspector bun dist/index.js","test:unit":"bun test ./src/__test__/utils/ ./src/__test__/tailscale/oauth.test.ts","typecheck":"tsc --noEmit","dev:direct":"tsx src/index.ts","test:setup":"./scripts/setup-testing.sh","build:watch":"bun esbuild.config.js watch","test:unit:ci":"npm run test:ci","release:local":"./scripts/publish.sh","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","test:integration":"bun test ./src/__test__/tailscale/*.integration.test.ts","release:local:test":"./scripts/test-publish.sh","test:integration:ci":"bun test --coverage --testNamePattern='integration'"},"_npmUser":{"name":"comicchang","email":"comicchang@gmail.com"},"_npmVersion":"10.8.2","description":"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.","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^4.3.6","axios":"^1.13.4","dotenv":"^17.2.3","express":"^5.2.1","ipaddr.js":"2.3.0","@modelcontextprotocol/sdk":"^1.25.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","rimraf":"^6.1.2","semver":"^7.7.3","esbuild":"^0.27.2","audit-ci":"^7.1.0","@types/bun":"latest","typescript":"^5.9.3","@types/node":"^25.0.10","@biomejs/biome":"2.3.13","@types/express":"^5.0.6","@types/json-schema":"7.0.15"},"_npmOperationalInternal":{"tmp":"tmp/tailscale-mcp-server_0.3.10_1773299774108_0.8725796114133482","host":"s3://npm-registry-packages-npm-production"}},"0.3.11":{"name":"@comicchang/tailscale-mcp-server","version":"0.3.11","description":"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.","keywords":["tailscale","mcp","model context protocol","tailscale mcp","tailscale mcp server"],"author":{"name":"comicchang"},"license":"MIT","type":"module","main":"dist/index.js","bin":{"tailscale-mcp-server":"dist/index.js"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"clean":"rimraf dist","build":"bun esbuild.config.js build","build:dev":"bun esbuild.config.js dev","build:watch":"bun esbuild.config.js watch","start":"bun dist/index.js","dev":"bun run build:dev && bun dist/index.js","dev:watch":"bun run build:watch","dev:direct":"tsx src/index.ts","typecheck":"tsc --noEmit","lint":"biome lint .","format":"biome format --write .","check":"biome check .","check:fix":"biome check --write .","test":"bun test","test:unit":"bun test ./src/__test__/utils/ ./src/__test__/tailscale/oauth.test.ts","test:integration":"bun test ./src/__test__/tailscale/*.integration.test.ts","test:coverage":"bun test --coverage","test:ci":"bun test ./src/__test__/utils/","test:unit:ci":"npm run test:ci","test:integration:ci":"bun test --coverage --testNamePattern='integration'","test:setup":"./scripts/setup-testing.sh","qa":"bun run typecheck && bun run test:unit && bun run check","qa:full":"bun run typecheck && bun run test && bun run check","inspector":"bunx @modelcontextprotocol/inspector bun dist/index.js","prepublishOnly":"bun run build","release:local":"./scripts/publish.sh","release:local:test":"./scripts/test-publish.sh"},"dependencies":{"@modelcontextprotocol/sdk":"^1.25.3","axios":"^1.13.4","dotenv":"^17.2.3","express":"^5.2.1","ipaddr.js":"2.3.0","zod":"^4.3.6"},"devDependencies":{"@biomejs/biome":"2.3.13","@types/bun":"latest","@types/express":"^5.0.6","@types/json-schema":"7.0.15","@types/node":"^25.0.10","audit-ci":"^7.1.0","esbuild":"^0.27.2","rimraf":"^6.1.2","semver":"^7.7.3","tsx":"^4.21.0","typescript":"^5.9.3"},"_id":"@comicchang/tailscale-mcp-server@0.3.11","gitHead":"cea23f53e722d43deb7694064f876c938f5fb117","_nodeVersion":"20.20.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-fP8/kRdBg/FN+CYzMxbVHdfNTQ+ob40vXxl3azSmKODqccN2lCs4+GKkHAlSGtvQ2Hp3m+ipSE9gn12LUeQUhA==","shasum":"980d84cf42edf127d1f75e9a6721fc8ad6d9c3b7","tarball":"https://registry.npmjs.org/@comicchang/tailscale-mcp-server/-/tailscale-mcp-server-0.3.11.tgz","fileCount":5,"unpackedSize":177582,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCID3NGh/UOxWbx+C6tPWusBmw3MkSPmVB6yQJre33nFL5AiArbe6Q1skeD0+nmB9q7QRrFp23OumhZOikn5HGDAPn6Q=="}]},"_npmUser":{"name":"comicchang","email":"comicchang@gmail.com"},"directories":{},"maintainers":[{"name":"comicchang","email":"comicchang@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tailscale-mcp-server_0.3.11_1773301390949_0.01438986275252363"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-12T05:54:31.567Z","modified":"2026-03-12T07:43:11.218Z","0.3.4":"2026-03-12T05:43:45.348Z","0.3.5":"2026-03-12T05:54:31.786Z","0.3.7":"2026-03-12T06:02:32.891Z","0.3.8":"2026-03-12T06:57:22.453Z","0.3.9":"2026-03-12T07:04:12.242Z","0.3.10":"2026-03-12T07:16:14.269Z","0.3.11":"2026-03-12T07:43:11.091Z"},"author":{"name":"comicchang"},"license":"MIT","keywords":["tailscale","mcp","model context protocol","tailscale mcp","tailscale mcp server"],"description":"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.","maintainers":[{"name":"comicchang","email":"comicchang@gmail.com"}],"readme":"# Tailscale MCP Server\n\nA modern [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server that provides seamless integration with Tailscale's CLI commands and REST API, enabling automated network management and monitoring through a standardized interface.\n\n<a href=\"https://glama.ai/mcp/servers/@comicchang/tailscale-mcp\">\n  <img width=\"380\" height=\"200\" src=\"https://glama.ai/mcp/servers/@comicchang/tailscale-mcp/badge\" alt=\"Tailscale Server MCP server\" />\n</a>\n\n## 📦 Available Packages\n\n- **NPM**: [`@comicchang/tailscale-mcp-server`](https://www.npmjs.com/package/@comicchang/tailscale-mcp-server)\n- **Docker Hub**: [`ooxxcc/tailscale-mcp`](https://hub.docker.com/r/ooxxcc/tailscale-mcp)\n- **GitHub Container Registry**: [`ghcr.io/comicchang/tailscale-mcp`](https://github.com/comicchang/tailscale-mcp/pkgs/container/tailscale-mcp)\n\n## 🚀 Recommended Package Manager\n\nThis project is optimized for **[Bun](https://bun.sh)** for faster installation and execution. NPM is supported as a fallback option.\n\n### Quick Setup with Bun\n\n```bash\n# Install Bun (if not already installed)\ncurl -fsSL https://bun.sh/install | bash\n\n# Install dependencies\nbun install\n\n# Build and run\nbun run build\nbun start\n```\n\n### Fallback with NPM\n\n```bash\nnpm ci\nnpm run build\nnpm start\n```\n\n## Features\n\n- **Device Management**: List, authorize, deauthorize, and manage Tailscale devices\n- **Network Operations**: Connect/disconnect, manage routes, and monitor network status\n- **Security Controls**: Manage ACLs, device tags, and network lock settings\n- **Modern Architecture**: Modular tool system with TypeScript and Zod validation\n- **CLI Integration**: Direct integration with Tailscale CLI commands\n- **API Integration**: REST API support for advanced operations\n\n## 📚 Documentation\n\nThis project includes comprehensive documentation organized by domain:\n\n- **[🔧 CI/CD Workflows](docs/workflows.md)** - GitHub Actions, testing pipelines, and release automation\n- **[🧪 Testing Strategy](src/__test__/README.md)** - Unit tests, integration tests, and testing best practices\n- **[🐳 Docker Guide](docs/docker.md)** - Container usage, development workflows, and deployment strategies\n\n## Quick Start\n\n### Option 1: NPX (Recommended)\n\nRun directly without installation:\n\n```bash\n# 直接运行（推荐）\nnpx -y @comicchang/tailscale-mcp-server\n\n# Or install globally\nnpm install -g @comicchang/tailscale-mcp-server\ntailscale-mcp-server\n```\n\n### Option 2: Docker\n\n```bash\n# GitHub Container Registry (recommended)\ndocker run -d \\\n  --name tailscale-mcp \\\n  -e TAILSCALE_API_KEY=your_api_key \\\n  -e TAILSCALE_TAILNET=your_tailnet \\\n  ghcr.io/comicchang/tailscale-mcp:latest\n\n# Or use Docker Compose\ndocker-compose up -d\n```\n\n> **📖 For detailed Docker usage, development workflows, and deployment strategies, see the [Docker Guide](docs/docker.md)**\n\n## Configuration\n\n### Claude Desktop\n\nAdd to your Claude Desktop configuration (`~/.claude/claude_desktop_config.json`):\n\n#### Using NPX (Recommended)\n\n```json\n{\n  \"mcpServers\": {\n    \"tailscale\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"@comicchang/tailscale-mcp-server\"\n      ],\n      \"env\": {\n        \"TAILSCALE_API_KEY\": \"your-api-key-here\",\n        \"TAILSCALE_TAILNET\": \"your-tailnet-name\"\n      }\n    }\n  }\n}\n```\n\n#### Using Docker\n\n```json\n{\n  \"mcpServers\": {\n    \"tailscale\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\",\n        \"--rm\",\n        \"-i\",\n        \"-e\",\n        \"TAILSCALE_API_KEY=your-api-key\",\n        \"-e\",\n        \"TAILSCALE_TAILNET=your-tailnet\",\n        \"ghcr.io/comicchang/tailscale-mcp:latest\"\n      ]\n    }\n  }\n}\n```\n\n### Environment Variables\n\n#### Authentication (choose one method)\n\n| Variable                        | Description                   | Required |\n| ------------------------------- | ----------------------------- | -------- |\n| `TAILSCALE_API_KEY`             | Tailscale API key             | Option 1 |\n| `TAILSCALE_OAUTH_CLIENT_ID`     | OAuth client ID               | Option 2 |\n| `TAILSCALE_OAUTH_CLIENT_SECRET` | OAuth client secret           | Option 2 |\n\n#### General Configuration\n\n| Variable                 | Description            | Required | Default                     |\n| ------------------------ | ---------------------- | -------- | --------------------------- |\n| `TAILSCALE_TAILNET`      | Tailscale tailnet name | Yes\\*    | -                           |\n| `TAILSCALE_API_BASE_URL` | API base URL           | No       | `https://api.tailscale.com` |\n| `LOG_LEVEL`              | Logging level (0-3)    | No       | `1` (INFO)                  |\n| `MCP_SERVER_LOG_FILE`    | Server log file path   | No       | -                           |\n\n\\*Required for API-based operations. CLI operations work without API credentials.\n\n### OAuth vs API Key Authentication\n\n**API Key** (`TAILSCALE_API_KEY`):\n\n- Full permissions matching the user who created the key\n- Expires in 1-90 days\n- Tied to a specific user account\n\n**OAuth Client** (`TAILSCALE_OAUTH_CLIENT_ID` + `TAILSCALE_OAUTH_CLIENT_SECRET`):\n\n- Scoped permissions (e.g., read-only device access)\n- Does not expire (but can be revoked)\n- Not tied to any user account\n- Recommended for automation and least-privilege access\n\n#### Creating an OAuth Client\n\n1. Go to [Tailscale OAuth Settings](https://login.tailscale.com/admin/settings/oauth)\n2. Click \"Generate OAuth client\"\n3. Select the required scopes (e.g., `devices:read` for read-only device access)\n4. Copy the client ID and secret\n\n#### OAuth Configuration Example\n\n```json\n{\n  \"mcpServers\": {\n    \"tailscale\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"@comicchang/tailscale-mcp-server\"\n      ],\n      \"env\": {\n        \"TAILSCALE_OAUTH_CLIENT_ID\": \"your-oauth-client-id\",\n        \"TAILSCALE_OAUTH_CLIENT_SECRET\": \"your-oauth-client-secret\",\n        \"TAILSCALE_TAILNET\": \"your-tailnet-name\"\n      }\n    }\n  }\n}\n```\n\n#### Available OAuth Scopes\n\n| Scope              | Description                          |\n| ------------------ | ------------------------------------ |\n| `all:read`         | Read-only access to all resources    |\n| `devices:read`     | Read device information              |\n| `devices:core`     | Full device management               |\n| `dns:read`         | Read DNS settings                    |\n| `dns:write`        | Modify DNS settings                  |\n| `acl:read`         | Read ACL configuration               |\n| `acl:write`        | Modify ACL configuration             |\n| `auth_keys`        | Manage authentication keys           |\n\nSee [Tailscale OAuth Scopes](https://tailscale.com/kb/1215/oauth-clients#scopes) for a complete list.\n\n## Available Tools\n\n### Device Management\n\n- `list_devices` - List all devices in the Tailscale network\n- `device_action` - Perform actions on specific devices (authorize, deauthorize, delete, expire-key)\n- `manage_routes` - Enable or disable routes for devices\n- `manage_device_tags` - Manage device tags for organization and ACL targeting\n- `manage_device_attributes` - Manage custom device posture attributes\n- `manage_exit_nodes` - Manage Tailscale exit nodes and routing\n\n### Network Operations\n\n- `get_network_status` - Get current network status (CLI-first, API fallback)\n- `connect_network` - Connect to the Tailscale network\n- `disconnect_network` - Disconnect from the Tailscale network\n- `ping_peer` - Ping a peer device\n\n### ACL & DNS Management\n\n- `manage_acl` - Manage Access Control Lists (get, update, validate)\n- `manage_dns` - Manage DNS configuration (nameservers, MagicDNS, search paths)\n- `manage_split_dns` - Manage Split DNS configuration for specific domains\n- `manage_keys` - Manage Tailscale authentication keys\n- `manage_policy_file` - Manage policy files and preview ACL access rules\n\n### Administration\n\n- `get_version` - Get Tailscale version information\n- `get_tailnet_info` - Get detailed network information\n- `manage_tailnet_settings` - Get or update Tailscale tailnet settings\n- `manage_file_sharing` - Manage Tailscale file sharing settings\n- `manage_webhooks` - Manage webhooks for event notifications\n- `manage_users` - List and delete tailnet users\n- `manage_contacts` - Manage tailnet contacts (security, support)\n- `manage_log_streams` - Manage log streaming configuration\n\n## Development\n\n### Quick Setup\n\n```bash\n# Clone and setup\ngit clone https://github.com/comicchang/tailscale-mcp-server.git\ncd tailscale-mcp-server\n\n# Install Bun (recommended) or use npm\ncurl -fsSL https://bun.sh/install | bash\nbun install  # or: npm install\n\n# Setup environment\ncp .env.example .env\n# Edit .env with your Tailscale credentials\n\n# Build and run\nbun run build  # or: npm run build\nbun start      # or: npm start\n```\n\n### Development Commands\n\n```bash\n# Development workflow (Bun recommended)\nbun run dev:direct        # Fast development with tsx\nbun run dev:watch         # Auto-rebuild on changes\nbun run build:watch       # Build with file watching\n\n# Development workflow (NPM fallback)\nnpm run dev:direct\nnpm run dev:watch\nnpm run build:watch\n\n# Testing (Bun recommended)\nbun test                  # All tests\nbun run test:unit         # Unit tests only\nbun run test:integration  # Integration tests (requires Tailscale CLI)\nbun run test:watch        # Watch mode\n\n# Testing (NPM fallback)\nnpm test\nnpm run test:unit\nnpm run test:integration\nnpm run test:watch\n\n# Quality assurance (Bun recommended)\nbun run qa                # Quick QA (typecheck + unit tests + lint)\nbun run qa:full           # Full QA (all tests + checks)\nbun run typecheck         # TypeScript validation\n\n# Quality assurance (NPM fallback)\nnpm run qa\nnpm run qa:full\nnpm run typecheck\n\n# Tools (Bun recommended)\nbun run inspector         # Test with MCP Inspector\n\n# Tools (NPM fallback)\nnpm run inspector\n```\n\n### Local Claude Desktop Configuration\n\n```json\n{\n  \"mcpServers\": {\n    \"tailscale-dev\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/your/tailscale-mcp-server/dist/index.js\"],\n      \"env\": {\n        \"TAILSCALE_API_KEY\": \"your-api-key-here\",\n        \"TAILSCALE_TAILNET\": \"your-tailnet-name\",\n        \"LOG_LEVEL\": \"0\"\n      }\n    }\n  }\n}\n```\n\n> **📖 For comprehensive development guides, testing strategies, and CI/CD information:**\n>\n> - **[Testing Documentation](src/__test__/README.md)** - Unit tests, integration tests, coverage\n> - **[Docker Development](docs/docker.md)** - Container-based development workflows\n> - **[CI/CD Workflows](docs/workflows.md)** - GitHub Actions, automation, releases\n\n### Project Structure\n\n```bash\nsrc/\n├── server.ts              # Main server implementation\n├── tools/                 # Modular tool definitions\n├── tailscale/             # Tailscale integrations\n├── types.ts               # Type definitions\n├── logger.ts              # Logging utilities\n└── index.ts               # Entry point\n```\n\n### Adding New Tools\n\nCreate 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.\n\n### Debugging\n\n```bash\n# Enable debug logging\nexport LOG_LEVEL=0\nexport MCP_SERVER_LOG_FILE=debug-{timestamp}.log\n\n# View logs\ntail -f logs/debug-*.log\n```\n\n## API Reference\n\nAll API methods align with the [Tailscale API v2](https://tailscale.com/api) endpoints.\n\n### Tool Categories\n\n#### Device Tools (`device-tools.ts`)\n\n- Device listing and filtering\n- Device authorization management (authorize, deauthorize, delete, expire-key)\n- Route management per device (enable/disable subnet routes)\n\n#### Network Tools (`network-tools.ts`)\n\n- Network status monitoring (CLI-first, API device list as fallback)\n- Connection management (connect/disconnect via CLI)\n- Peer connectivity testing (ping)\n- Version information\n\n#### ACL & DNS Tools (`acl-tools.ts`)\n\n- ACL management (get, update, validate)\n- DNS configuration (nameservers, MagicDNS, search paths)\n- Split DNS configuration (per-domain DNS servers)\n- Authentication key management (list, create, delete)\n- Policy file management and ACL access preview\n\n#### Admin Tools (`admin-tools.ts`)\n\n- Tailnet information and settings management\n- File sharing configuration\n- Exit node management\n- Webhook management (list, create, delete)\n- Device tag management\n- User management (list, delete)\n- Contact management (security, support)\n- Log stream configuration (configuration/network logs)\n- Device posture attributes (custom key-value metadata)\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/amazing-feature`\n3. Make your changes and add tests\n4. Run quality checks: `bun run qa:full` (or `npm run qa:full`)\n5. Commit your changes: `git commit -m 'Add amazing feature'`\n6. Push to the branch: `git push origin feature/amazing-feature`\n7. Open a Pull Request\n\n### Development Guidelines\n\n- Use TypeScript for all new code\n- Add Zod schemas for input validation\n- Include tests for new tools (see [Testing Guide](src/__test__/README.md))\n- Follow the existing modular architecture\n- Update documentation for new features\n\n### Resources for Contributors\n\n- **[Testing Strategy](src/__test__/README.md)** - How to write and run tests\n- **[CI/CD Workflows](docs/workflows.md)** - Understanding the automation pipeline\n- **[Docker Development](docs/docker.md)** - Container-based development workflows\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Support\n\n- [Issues](https://github.com/your-repo/issues) - Bug reports and feature requests\n- [Discussions](https://github.com/your-repo/discussions) - Questions and community support\n- [MCP Documentation](https://modelcontextprotocol.io) - Learn more about MCP\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for version history and updates.\n","readmeFilename":"README.md"}