tailscale-mcp 2026.3.16 → 2026.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,28 @@ All notable changes to this project will be documented in this file.
4
4
  This project uses [Calendar Versioning](https://calver.org/) (`YYYY.MM.DD.TS`).
5
5
 
6
6
 
7
+ ## v2026.03.16.3
8
+
9
+ - **Plugin API: extract `createServer()` factory for enterprise extensibility** (#37)
10
+ - Add `src/types.ts` with `ToolHandler`, `ToolMiddleware`, and `ToolResult` types
11
+ - Add `src/server.ts` with `createServer()` factory supporting optional middleware
12
+ - Refactor `src/index.ts` to use `createServer()` internally (zero behavior change)
13
+ - Add `exports` map to `package.json` for subpath imports (`/server`, `/types`, `/client/*`, `/utils/*`, `/transport`)
14
+ - Add design doc `docs/plans/003-plugin-api.md`
15
+ - 199 unit tests (was 188)
16
+
17
+ ## v2026.03.16.2
18
+
19
+ - Add ADR-0024 reference to `.gitignore` and MCP Registry Tokens entry to CLAUDE.md security section (#35)
20
+
21
+ ## v2026.03.16.1
22
+
23
+ - Register on official MCP Registry as `io.github.itunified-io/tailscale` (#12)
24
+ - Add `server.json` metadata for MCP registry publishing
25
+ - Add `mcpName` field to package.json for registry validation
26
+ - Bump version to `2026.3.16`, publish `tailscale-mcp@2026.3.16` to npm
27
+ - Add `.mcpregistry_*` to `.gitignore`
28
+
7
29
  ## v2026.03.15.5
8
30
 
9
31
  - Publish to npm as `tailscale-mcp`, add `.npmignore`, `bin` entry, expanded keywords (#12)
package/CLAUDE.md CHANGED
@@ -86,6 +86,7 @@ docs/
86
86
  - **Error handling**: No credential leaks in error messages (Bearer token never appears in logs or errors)
87
87
  - **Credentials**: Never hardcoded, never logged, never in git
88
88
  - **Secret Redaction — MANDATORY**: When using `grep`, `cat`, `sed`, `awk`, shell scripts, or any tool that reads/displays file contents containing secrets (`.env`, credentials, API keys, tokens, passwords), **ALWAYS redact the secret values** in output. Never display raw secret values in terminal output, logs, conversation context, or commit messages.
89
+ - **MCP Registry Tokens**: `.mcpregistry_*` files are gitignored (ADR-0024). Never commit registry auth tokens.
89
90
  - **Public Repo Documentation Policy — MANDATORY**: This is a **public repository**. All documentation, code examples, test data, and commit messages MUST use only generic placeholders:
90
91
  - Tailnet names: `your-tailnet-name`, `example.com`
91
92
  - Device IDs: `123456789`
package/dist/index.d.ts CHANGED
@@ -1,2 +1,6 @@
1
+ /**
2
+ * CLI entry point for mcp-tailscale.
3
+ * Uses createServer() factory and connects the appropriate transport.
4
+ */
1
5
  export {};
2
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
package/dist/index.js CHANGED
@@ -1,65 +1,13 @@
1
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
1
+ /**
2
+ * CLI entry point for mcp-tailscale.
3
+ * Uses createServer() factory and connects the appropriate transport.
4
+ */
2
5
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
6
  import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
4
7
  import express from "express";
5
8
  import { validateTransportConfig, createAuthMiddleware } from "./transport.js";
6
- import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
7
- import { createClientFromEnv } from "./client/client-factory.js";
8
- import { deviceToolDefinitions, handleDeviceTool } from "./tools/devices.js";
9
- import { dnsToolDefinitions, handleDnsTool } from "./tools/dns.js";
10
- import { aclToolDefinitions, handleAclTool } from "./tools/acl.js";
11
- import { keyToolDefinitions, handleKeyTool } from "./tools/keys.js";
12
- import { tailnetToolDefinitions, handleTailnetTool } from "./tools/tailnet.js";
13
- import { diagnosticsToolDefinitions, handleDiagnosticsTool } from "./tools/diagnostics.js";
14
- import { userToolDefinitions, handleUserTool } from "./tools/users.js";
15
- import { webhookToolDefinitions, handleWebhookTool } from "./tools/webhooks.js";
16
- import { postureToolDefinitions, handlePostureTool } from "./tools/posture.js";
17
- const allToolDefinitions = [
18
- ...deviceToolDefinitions,
19
- ...dnsToolDefinitions,
20
- ...aclToolDefinitions,
21
- ...keyToolDefinitions,
22
- ...tailnetToolDefinitions,
23
- ...diagnosticsToolDefinitions,
24
- ...userToolDefinitions,
25
- ...webhookToolDefinitions,
26
- ...postureToolDefinitions,
27
- ];
28
- const toolHandlers = new Map();
29
- for (const def of deviceToolDefinitions)
30
- toolHandlers.set(def.name, handleDeviceTool);
31
- for (const def of dnsToolDefinitions)
32
- toolHandlers.set(def.name, handleDnsTool);
33
- for (const def of aclToolDefinitions)
34
- toolHandlers.set(def.name, handleAclTool);
35
- for (const def of keyToolDefinitions)
36
- toolHandlers.set(def.name, handleKeyTool);
37
- for (const def of tailnetToolDefinitions)
38
- toolHandlers.set(def.name, handleTailnetTool);
39
- for (const def of diagnosticsToolDefinitions)
40
- toolHandlers.set(def.name, handleDiagnosticsTool);
41
- for (const def of userToolDefinitions)
42
- toolHandlers.set(def.name, handleUserTool);
43
- for (const def of webhookToolDefinitions)
44
- toolHandlers.set(def.name, handleWebhookTool);
45
- for (const def of postureToolDefinitions)
46
- toolHandlers.set(def.name, handlePostureTool);
47
- const server = new Server({ name: "mcp-tailscale", version: "2026.3.14" }, { capabilities: { tools: {} } });
48
- const client = createClientFromEnv();
49
- server.setRequestHandler(ListToolsRequestSchema, async () => ({
50
- tools: allToolDefinitions,
51
- }));
52
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
53
- const { name, arguments: args } = request.params;
54
- const handler = toolHandlers.get(name);
55
- if (!handler) {
56
- return {
57
- content: [{ type: "text", text: `Unknown tool: ${name}` }],
58
- isError: true,
59
- };
60
- }
61
- return handler(name, (args ?? {}), client);
62
- });
9
+ import { createServer } from "./server.js";
10
+ const { server } = createServer();
63
11
  async function main() {
64
12
  const config = validateTransportConfig(process.env);
65
13
  if (config.mode === "stdio") {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;AAElC,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,CAAC,GAAyC,CAAC,CAAC;IAE1F,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAEhD,+DAA+D;QAC/D,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8B,CAAC;QAE5D,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,EAAE;YAC3C,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAC3D,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAElD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACnB,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,EAAE;YACjD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,SAAmB,CAAC;YAChD,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;gBACzD,OAAO;YACT,CAAC;YACD,MAAM,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACxC,OAAO,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Server factory for mcp-tailscale.
3
+ * Creates an MCP server with all Tailscale tools registered.
4
+ * Supports optional middleware for enterprise extensions (audit, RBAC, etc.).
5
+ */
6
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
7
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
8
+ import type { ITailscaleClient } from "./client/types.js";
9
+ import type { ToolHandler, ToolMiddleware } from "./types.js";
10
+ /**
11
+ * Options for creating an MCP Tailscale server.
12
+ */
13
+ export interface CreateServerOptions {
14
+ /** Optional middleware to intercept all tool calls (for audit, RBAC, etc.) */
15
+ middleware?: ToolMiddleware;
16
+ /** Server name (default: "mcp-tailscale") */
17
+ name?: string;
18
+ /** Server version (default: "2026.3.16") */
19
+ version?: string;
20
+ }
21
+ /**
22
+ * Result from createServer().
23
+ */
24
+ export interface CreateServerResult {
25
+ /** The MCP server instance, ready to connect a transport */
26
+ server: Server;
27
+ /** The Tailscale API client */
28
+ client: ITailscaleClient;
29
+ /** All 48 tool definitions */
30
+ allToolDefinitions: Tool[];
31
+ /** Map of tool name → handler function */
32
+ toolHandlers: Map<string, ToolHandler>;
33
+ }
34
+ /**
35
+ * Create an MCP server with all Tailscale tools registered.
36
+ *
37
+ * @example
38
+ * // Basic usage (identical to running `npx tailscale-mcp`)
39
+ * const { server } = createServer();
40
+ *
41
+ * @example
42
+ * // With enterprise middleware
43
+ * const { server } = createServer({
44
+ * middleware: async (name, args, client, next) => {
45
+ * console.log(`Tool called: ${name}`);
46
+ * return next(name, args, client);
47
+ * },
48
+ * });
49
+ */
50
+ export declare function createServer(options?: CreateServerOptions): CreateServerResult;
51
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwB9D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,8BAA8B;IAC9B,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC3B,0CAA0C;IAC1C,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACxC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,kBAAkB,CAgFpB"}
package/dist/server.js ADDED
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Server factory for mcp-tailscale.
3
+ * Creates an MCP server with all Tailscale tools registered.
4
+ * Supports optional middleware for enterprise extensions (audit, RBAC, etc.).
5
+ */
6
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
7
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
8
+ import { createClientFromEnv } from "./client/client-factory.js";
9
+ import { deviceToolDefinitions, handleDeviceTool } from "./tools/devices.js";
10
+ import { dnsToolDefinitions, handleDnsTool } from "./tools/dns.js";
11
+ import { aclToolDefinitions, handleAclTool } from "./tools/acl.js";
12
+ import { keyToolDefinitions, handleKeyTool } from "./tools/keys.js";
13
+ import { tailnetToolDefinitions, handleTailnetTool, } from "./tools/tailnet.js";
14
+ import { diagnosticsToolDefinitions, handleDiagnosticsTool, } from "./tools/diagnostics.js";
15
+ import { userToolDefinitions, handleUserTool } from "./tools/users.js";
16
+ import { webhookToolDefinitions, handleWebhookTool, } from "./tools/webhooks.js";
17
+ import { postureToolDefinitions, handlePostureTool, } from "./tools/posture.js";
18
+ /**
19
+ * Create an MCP server with all Tailscale tools registered.
20
+ *
21
+ * @example
22
+ * // Basic usage (identical to running `npx tailscale-mcp`)
23
+ * const { server } = createServer();
24
+ *
25
+ * @example
26
+ * // With enterprise middleware
27
+ * const { server } = createServer({
28
+ * middleware: async (name, args, client, next) => {
29
+ * console.log(`Tool called: ${name}`);
30
+ * return next(name, args, client);
31
+ * },
32
+ * });
33
+ */
34
+ export function createServer(options) {
35
+ const { middleware, name = "mcp-tailscale", version = "2026.3.16", } = options ?? {};
36
+ // Assemble all tool definitions
37
+ const allToolDefinitions = [
38
+ ...deviceToolDefinitions,
39
+ ...dnsToolDefinitions,
40
+ ...aclToolDefinitions,
41
+ ...keyToolDefinitions,
42
+ ...tailnetToolDefinitions,
43
+ ...diagnosticsToolDefinitions,
44
+ ...userToolDefinitions,
45
+ ...webhookToolDefinitions,
46
+ ...postureToolDefinitions,
47
+ ];
48
+ // Build tool handler map
49
+ const toolHandlers = new Map();
50
+ for (const def of deviceToolDefinitions)
51
+ toolHandlers.set(def.name, handleDeviceTool);
52
+ for (const def of dnsToolDefinitions)
53
+ toolHandlers.set(def.name, handleDnsTool);
54
+ for (const def of aclToolDefinitions)
55
+ toolHandlers.set(def.name, handleAclTool);
56
+ for (const def of keyToolDefinitions)
57
+ toolHandlers.set(def.name, handleKeyTool);
58
+ for (const def of tailnetToolDefinitions)
59
+ toolHandlers.set(def.name, handleTailnetTool);
60
+ for (const def of diagnosticsToolDefinitions)
61
+ toolHandlers.set(def.name, handleDiagnosticsTool);
62
+ for (const def of userToolDefinitions)
63
+ toolHandlers.set(def.name, handleUserTool);
64
+ for (const def of webhookToolDefinitions)
65
+ toolHandlers.set(def.name, handleWebhookTool);
66
+ for (const def of postureToolDefinitions)
67
+ toolHandlers.set(def.name, handlePostureTool);
68
+ // Create Tailscale API client
69
+ const client = createClientFromEnv();
70
+ // Create MCP server
71
+ const server = new Server({ name, version }, { capabilities: { tools: {} } });
72
+ // Register ListTools handler
73
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
74
+ tools: allToolDefinitions,
75
+ }));
76
+ // Register CallTools handler (with optional middleware)
77
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
78
+ const { name: toolName, arguments: args } = request.params;
79
+ const handler = toolHandlers.get(toolName);
80
+ if (!handler) {
81
+ return {
82
+ content: [
83
+ { type: "text", text: `Unknown tool: ${toolName}` },
84
+ ],
85
+ isError: true,
86
+ };
87
+ }
88
+ const typedArgs = (args ?? {});
89
+ if (middleware) {
90
+ return middleware(toolName, typedArgs, client, handler);
91
+ }
92
+ return handler(toolName, typedArgs, client);
93
+ });
94
+ return { server, client, allToolDefinitions, toolHandlers };
95
+ }
96
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Shared types for MCP tool handling and middleware.
3
+ * Used by the core server and enterprise extensions.
4
+ */
5
+ import type { ITailscaleClient } from "./client/types.js";
6
+ /**
7
+ * Result returned by a tool handler.
8
+ */
9
+ export type ToolResult = {
10
+ content: Array<{
11
+ type: "text";
12
+ text: string;
13
+ }>;
14
+ isError?: boolean;
15
+ };
16
+ /**
17
+ * Handler function for a single MCP tool.
18
+ * Receives the tool name, validated arguments, and Tailscale client.
19
+ */
20
+ export type ToolHandler = (name: string, args: Record<string, unknown>, client: ITailscaleClient) => Promise<ToolResult>;
21
+ /**
22
+ * Middleware that intercepts tool calls before/after execution.
23
+ * Call `next(name, args, client)` to continue to the actual handler.
24
+ * Enterprise uses this for audit logging, RBAC, policy enforcement, etc.
25
+ */
26
+ export type ToolMiddleware = (name: string, args: Record<string, unknown>, client: ITailscaleClient, next: ToolHandler) => Promise<ToolResult>;
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,gBAAgB,KACrB,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,WAAW,KACd,OAAO,CAAC,UAAU,CAAC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shared types for MCP tool handling and middleware.
3
+ * Used by the core server and enterprise extensions.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
package/package.json CHANGED
@@ -1,10 +1,18 @@
1
1
  {
2
2
  "name": "tailscale-mcp",
3
3
  "mcpName": "io.github.itunified-io/tailscale",
4
- "version": "2026.3.16",
4
+ "version": "2026.3.17",
5
5
  "description": "Secure MCP access for private infrastructure over Tailscale — 48 tools for devices, DNS, ACL, keys, users, webhooks, posture, and tailnet management via Tailscale API v2",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
8
+ "exports": {
9
+ ".": "./dist/index.js",
10
+ "./server": "./dist/server.js",
11
+ "./types": "./dist/types.js",
12
+ "./client/*": "./dist/client/*.js",
13
+ "./utils/*": "./dist/utils/*.js",
14
+ "./transport": "./dist/transport.js"
15
+ },
8
16
  "bin": {
9
17
  "mcp-tailscale": "dist/index.js"
10
18
  },
package/server.json CHANGED
@@ -3,23 +3,20 @@
3
3
  "name": "io.github.itunified-io/tailscale",
4
4
  "title": "Tailscale MCP Server",
5
5
  "description": "Secure MCP access for private infrastructure over Tailscale — 48 tools across 9 domains",
6
+ "version": "2026.3.16",
6
7
  "repository": {
7
8
  "url": "https://github.com/itunified-io/mcp-tailscale",
8
9
  "source": "github"
9
10
  },
10
- "version_detail": {
11
- "version": "2026.3.15",
12
- "release_date": "2026-03-15"
13
- },
14
11
  "packages": [
15
12
  {
16
13
  "registryType": "npm",
17
14
  "identifier": "tailscale-mcp",
18
- "version": "2026.3.15",
19
- "runtime": "node",
20
- "runtime_arguments": [],
21
- "package_arguments": [],
22
- "environment_variables": [
15
+ "version": "2026.3.16",
16
+ "runtimeHint": "npx",
17
+ "runtimeArguments": [],
18
+ "packageArguments": [],
19
+ "environmentVariables": [
23
20
  {
24
21
  "name": "TAILSCALE_API_KEY",
25
22
  "description": "Tailscale API key",
@@ -1 +0,0 @@
1
- ghu_7si3hZcRXM5oe8ZNBuynQHUWZa54CB4Jt0WS
@@ -1 +0,0 @@
1
- {"token":"eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJtY3AtcmVnaXN0cnkiLCJleHAiOjE3NzM1NjU0MjksIm5iZiI6MTc3MzU2NTEyOSwiaWF0IjoxNzczNTY1MTI5LCJhdXRoX21ldGhvZCI6ImdpdGh1Yi1hdCIsImF1dGhfbWV0aG9kX3N1YiI6Iml0dW5pZmllZC1idWVjaGVsZWIiLCJwZXJtaXNzaW9ucyI6W3siYWN0aW9uIjoicHVibGlzaCIsInJlc291cmNlIjoiaW8uZ2l0aHViLml0dW5pZmllZC1idWVjaGVsZWIvKiJ9LHsiYWN0aW9uIjoicHVibGlzaCIsInJlc291cmNlIjoiaW8uZ2l0aHViLml0dW5pZmllZC8qIn0seyJhY3Rpb24iOiJwdWJsaXNoIiwicmVzb3VyY2UiOiJpby5naXRodWIuaXR1bmlmaWVkLWlvLyoifV19.h2qb1P7ArenWZNrHffxwHTLH5uujGs_GXTvBxE4nap-yIYRx_LL_OERCx5dLj4FtJfQ5w7Eblyv1udtxMl4cCg","expires_at":1773565429}