tailscale-mcp 2026.3.15 → 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,9 +4,32 @@ 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
- - Publish to npm as `@itunified/mcp-tailscale`, add `.npmignore`, `bin` entry, expanded keywords (#12)
31
+ - Publish to npm as `tailscale-mcp`, add `.npmignore`, `bin` entry, expanded keywords (#12)
32
+ - Rename package from `@itunified/mcp-tailscale` to `tailscale-mcp` (npm free org cannot publish public scoped packages)
10
33
  - Update package.json version to `2026.3.15`, description aligned with product positioning
11
34
 
12
35
  ## v2026.03.15.4
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`
@@ -123,6 +124,14 @@ docs/
123
124
  4. Push tag: `git push origin --tags`
124
125
  5. Create GitHub release: `gh release create v2026.03.13.1 --title "v2026.03.13.1 — <title>" --notes "<release notes>"`
125
126
  6. Release notes must list what changed and reference closed issues
127
+ 7. **Publish to npm**: `npm run build && npm publish --access public` (package: `tailscale-mcp`)
128
+
129
+ ### npm Publishing — MANDATORY
130
+ - npm package name: `tailscale-mcp` (unscoped, published to npmjs.com)
131
+ - **Every release MUST be published to npm** after tagging
132
+ - Ensure `npm run build` succeeds before publishing
133
+ - Verify with `npm view tailscale-mcp version` after publishing
134
+ - Auth: granular access token set via `npm config set //registry.npmjs.org/:_authToken TOKEN`
126
135
 
127
136
  ## Git Workflow
128
137
 
package/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  **Secure MCP access for private infrastructure over Tailscale**
4
4
 
5
+ [![npm](https://img.shields.io/npm/v/tailscale-mcp?style=flat-square)](https://www.npmjs.com/package/tailscale-mcp)
5
6
  [![GitHub release](https://img.shields.io/github/v/release/itunified-io/mcp-tailscale?style=flat-square)](https://github.com/itunified-io/mcp-tailscale/releases)
6
7
  [![License: AGPL-3.0](https://img.shields.io/badge/license-AGPL--3.0-blue?style=flat-square)](LICENSE)
7
8
  [![CalVer](https://img.shields.io/badge/calver-YYYY.0M.DD.MICRO-22bfae?style=flat-square)](https://calver.org)
@@ -31,7 +32,17 @@ mcp-tailscale is an MCP Gateway Runtime that connects AI agents (Claude, GPT, cu
31
32
 
32
33
  ## Quick Start
33
34
 
35
+ ### Install from npm
36
+
37
+ ```bash
38
+ npm install -g tailscale-mcp
39
+ ```
40
+
41
+ ### Or clone and build from source
42
+
34
43
  ```bash
44
+ git clone https://github.com/itunified-io/mcp-tailscale.git
45
+ cd mcp-tailscale
35
46
  npm install
36
47
  cp .env.example .env # Edit with your Tailscale API key and tailnet name
37
48
  npm run build
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,9 +1,18 @@
1
1
  {
2
2
  "name": "tailscale-mcp",
3
- "version": "2026.3.15",
3
+ "mcpName": "io.github.itunified-io/tailscale",
4
+ "version": "2026.3.17",
4
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",
5
6
  "type": "module",
6
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
+ },
7
16
  "bin": {
8
17
  "mcp-tailscale": "dist/index.js"
9
18
  },
package/server.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.itunified-io/tailscale",
4
+ "title": "Tailscale MCP Server",
5
+ "description": "Secure MCP access for private infrastructure over Tailscale — 48 tools across 9 domains",
6
+ "version": "2026.3.16",
7
+ "repository": {
8
+ "url": "https://github.com/itunified-io/mcp-tailscale",
9
+ "source": "github"
10
+ },
11
+ "packages": [
12
+ {
13
+ "registryType": "npm",
14
+ "identifier": "tailscale-mcp",
15
+ "version": "2026.3.16",
16
+ "runtimeHint": "npx",
17
+ "runtimeArguments": [],
18
+ "packageArguments": [],
19
+ "environmentVariables": [
20
+ {
21
+ "name": "TAILSCALE_API_KEY",
22
+ "description": "Tailscale API key",
23
+ "required": false
24
+ },
25
+ {
26
+ "name": "TAILSCALE_OAUTH_CLIENT_ID",
27
+ "description": "OAuth client ID (alternative to API key)",
28
+ "required": false
29
+ },
30
+ {
31
+ "name": "TAILSCALE_OAUTH_CLIENT_SECRET",
32
+ "description": "OAuth client secret",
33
+ "required": false
34
+ },
35
+ {
36
+ "name": "TAILSCALE_TAILNET",
37
+ "description": "Tailnet name",
38
+ "required": true
39
+ }
40
+ ],
41
+ "transport": {
42
+ "type": "stdio"
43
+ }
44
+ }
45
+ ]
46
+ }