@yawlabs/tailscale-mcp 0.3.0 → 0.5.0

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.
Files changed (59) hide show
  1. package/README.md +36 -33
  2. package/dist/index.js +23250 -120
  3. package/package.json +10 -11
  4. package/dist/api.d.ts +0 -35
  5. package/dist/api.js +0 -134
  6. package/dist/api.js.map +0 -1
  7. package/dist/cli.d.ts +0 -5
  8. package/dist/cli.js +0 -43
  9. package/dist/cli.js.map +0 -1
  10. package/dist/index.d.ts +0 -2
  11. package/dist/index.js.map +0 -1
  12. package/dist/tools/acl.d.ts +0 -86
  13. package/dist/tools/acl.js +0 -105
  14. package/dist/tools/acl.js.map +0 -1
  15. package/dist/tools/audit.d.ts +0 -50
  16. package/dist/tools/audit.js +0 -60
  17. package/dist/tools/audit.js.map +0 -1
  18. package/dist/tools/devices.d.ts +0 -290
  19. package/dist/tools/devices.js +0 -254
  20. package/dist/tools/devices.js.map +0 -1
  21. package/dist/tools/dns.d.ts +0 -130
  22. package/dist/tools/dns.js +0 -139
  23. package/dist/tools/dns.js.map +0 -1
  24. package/dist/tools/invites.d.ts +0 -158
  25. package/dist/tools/invites.js +0 -160
  26. package/dist/tools/invites.js.map +0 -1
  27. package/dist/tools/keys.d.ts +0 -94
  28. package/dist/tools/keys.js +0 -92
  29. package/dist/tools/keys.js.map +0 -1
  30. package/dist/tools/log-streaming.d.ts +0 -90
  31. package/dist/tools/log-streaming.js +0 -89
  32. package/dist/tools/log-streaming.js.map +0 -1
  33. package/dist/tools/network-lock.d.ts +0 -14
  34. package/dist/tools/network-lock.js +0 -20
  35. package/dist/tools/network-lock.js.map +0 -1
  36. package/dist/tools/oauth-clients.d.ts +0 -118
  37. package/dist/tools/oauth-clients.js +0 -102
  38. package/dist/tools/oauth-clients.js.map +0 -1
  39. package/dist/tools/posture.d.ts +0 -126
  40. package/dist/tools/posture.js +0 -103
  41. package/dist/tools/posture.js.map +0 -1
  42. package/dist/tools/services.d.ts +0 -124
  43. package/dist/tools/services.js +0 -106
  44. package/dist/tools/services.js.map +0 -1
  45. package/dist/tools/status.d.ts +0 -26
  46. package/dist/tools/status.js +0 -38
  47. package/dist/tools/status.js.map +0 -1
  48. package/dist/tools/tailnet.d.ts +0 -142
  49. package/dist/tools/tailnet.js +0 -111
  50. package/dist/tools/tailnet.js.map +0 -1
  51. package/dist/tools/users.d.ts +0 -118
  52. package/dist/tools/users.js +0 -108
  53. package/dist/tools/users.js.map +0 -1
  54. package/dist/tools/webhooks.d.ts +0 -126
  55. package/dist/tools/webhooks.js +0 -121
  56. package/dist/tools/webhooks.js.map +0 -1
  57. package/dist/tools/workload-identity.d.ts +0 -118
  58. package/dist/tools/workload-identity.js +0 -105
  59. package/dist/tools/workload-identity.js.map +0 -1
package/dist/tools/dns.js DELETED
@@ -1,139 +0,0 @@
1
- import { z } from "zod";
2
- import { apiGet, apiPost, apiPut, getTailnet } from "../api.js";
3
- export const dnsTools = [
4
- {
5
- name: "tailscale_get_nameservers",
6
- description: "Get the DNS nameservers configured for your tailnet.",
7
- annotations: {
8
- title: "Get nameservers",
9
- readOnlyHint: true,
10
- destructiveHint: false,
11
- idempotentHint: true,
12
- openWorldHint: true,
13
- },
14
- inputSchema: z.object({}),
15
- handler: async () => {
16
- return apiGet(`/tailnet/${getTailnet()}/dns/nameservers`);
17
- },
18
- },
19
- {
20
- name: "tailscale_set_nameservers",
21
- description: "Set the DNS nameservers for your tailnet. Replaces all existing nameservers.",
22
- annotations: {
23
- title: "Set nameservers",
24
- readOnlyHint: false,
25
- destructiveHint: false,
26
- idempotentHint: true,
27
- openWorldHint: true,
28
- },
29
- inputSchema: z.object({
30
- dns: z.array(z.string()).describe("List of DNS server IP addresses (e.g. ['8.8.8.8', '1.1.1.1'])"),
31
- }),
32
- handler: async (input) => {
33
- return apiPost(`/tailnet/${getTailnet()}/dns/nameservers`, { dns: input.dns });
34
- },
35
- },
36
- {
37
- name: "tailscale_get_search_paths",
38
- description: "Get the DNS search paths configured for your tailnet.",
39
- annotations: {
40
- title: "Get DNS search paths",
41
- readOnlyHint: true,
42
- destructiveHint: false,
43
- idempotentHint: true,
44
- openWorldHint: true,
45
- },
46
- inputSchema: z.object({}),
47
- handler: async () => {
48
- return apiGet(`/tailnet/${getTailnet()}/dns/searchpaths`);
49
- },
50
- },
51
- {
52
- name: "tailscale_set_search_paths",
53
- description: "Set the DNS search paths for your tailnet. Replaces all existing search paths.",
54
- annotations: {
55
- title: "Set DNS search paths",
56
- readOnlyHint: false,
57
- destructiveHint: false,
58
- idempotentHint: true,
59
- openWorldHint: true,
60
- },
61
- inputSchema: z.object({
62
- searchPaths: z.array(z.string()).describe("List of DNS search domains (e.g. ['example.com', 'internal.corp'])"),
63
- }),
64
- handler: async (input) => {
65
- return apiPost(`/tailnet/${getTailnet()}/dns/searchpaths`, {
66
- searchPaths: input.searchPaths,
67
- });
68
- },
69
- },
70
- {
71
- name: "tailscale_get_split_dns",
72
- description: "Get the split DNS configuration for your tailnet.",
73
- annotations: {
74
- title: "Get split DNS",
75
- readOnlyHint: true,
76
- destructiveHint: false,
77
- idempotentHint: true,
78
- openWorldHint: true,
79
- },
80
- inputSchema: z.object({}),
81
- handler: async () => {
82
- return apiGet(`/tailnet/${getTailnet()}/dns/split-dns`);
83
- },
84
- },
85
- {
86
- name: "tailscale_set_split_dns",
87
- description: "Set split DNS configuration. Maps domains to specific nameservers. Replaces the entire split DNS configuration.",
88
- annotations: {
89
- title: "Set split DNS",
90
- readOnlyHint: false,
91
- destructiveHint: false,
92
- idempotentHint: true,
93
- openWorldHint: true,
94
- },
95
- inputSchema: z.object({
96
- splitDns: z
97
- .record(z.string(), z.array(z.string()))
98
- .describe('Map of domain to nameserver list (e.g. { "corp.example.com": ["10.0.0.1"], "internal.dev": ["10.0.0.2"] })'),
99
- }),
100
- handler: async (input) => {
101
- return apiPut(`/tailnet/${getTailnet()}/dns/split-dns`, input.splitDns);
102
- },
103
- },
104
- {
105
- name: "tailscale_get_dns_preferences",
106
- description: "Get DNS preferences for your tailnet, including whether MagicDNS is enabled.",
107
- annotations: {
108
- title: "Get DNS preferences",
109
- readOnlyHint: true,
110
- destructiveHint: false,
111
- idempotentHint: true,
112
- openWorldHint: true,
113
- },
114
- inputSchema: z.object({}),
115
- handler: async () => {
116
- return apiGet(`/tailnet/${getTailnet()}/dns/preferences`);
117
- },
118
- },
119
- {
120
- name: "tailscale_set_dns_preferences",
121
- description: "Set DNS preferences for your tailnet, such as enabling or disabling MagicDNS.",
122
- annotations: {
123
- title: "Set DNS preferences",
124
- readOnlyHint: false,
125
- destructiveHint: false,
126
- idempotentHint: true,
127
- openWorldHint: true,
128
- },
129
- inputSchema: z.object({
130
- magicDNS: z.boolean().describe("Whether to enable MagicDNS"),
131
- }),
132
- handler: async (input) => {
133
- return apiPost(`/tailnet/${getTailnet()}/dns/preferences`, {
134
- magicDNS: input.magicDNS,
135
- });
136
- },
137
- },
138
- ];
139
- //# sourceMappingURL=dns.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dns.js","sourceRoot":"","sources":["../../src/tools/dns.ts"],"names":[],"mappings":"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"}
@@ -1,158 +0,0 @@
1
- import { z } from "zod";
2
- export declare const inviteTools: readonly [{
3
- readonly name: "tailscale_list_device_invites";
4
- readonly description: "List all device invites for your tailnet.";
5
- readonly annotations: {
6
- readonly title: "List device invites";
7
- readonly readOnlyHint: true;
8
- readonly destructiveHint: false;
9
- readonly idempotentHint: true;
10
- readonly openWorldHint: true;
11
- };
12
- readonly inputSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
13
- readonly handler: () => Promise<import("../api.js").ApiResponse<unknown>>;
14
- }, {
15
- readonly name: "tailscale_create_device_invite";
16
- readonly description: "Create a new device invite that allows someone to add a device to your tailnet.";
17
- readonly annotations: {
18
- readonly title: "Create device invite";
19
- readonly readOnlyHint: false;
20
- readonly destructiveHint: false;
21
- readonly idempotentHint: false;
22
- readonly openWorldHint: true;
23
- };
24
- readonly inputSchema: z.ZodObject<{
25
- multiUse: z.ZodOptional<z.ZodBoolean>;
26
- allowExitNode: z.ZodOptional<z.ZodBoolean>;
27
- email: z.ZodOptional<z.ZodString>;
28
- }, "strip", z.ZodTypeAny, {
29
- email?: string | undefined;
30
- multiUse?: boolean | undefined;
31
- allowExitNode?: boolean | undefined;
32
- }, {
33
- email?: string | undefined;
34
- multiUse?: boolean | undefined;
35
- allowExitNode?: boolean | undefined;
36
- }>;
37
- readonly handler: (input: {
38
- multiUse?: boolean;
39
- allowExitNode?: boolean;
40
- email?: string;
41
- }) => Promise<import("../api.js").ApiResponse<unknown>>;
42
- }, {
43
- readonly name: "tailscale_get_device_invite";
44
- readonly description: "Get details for a specific device invite.";
45
- readonly annotations: {
46
- readonly title: "Get device invite";
47
- readonly readOnlyHint: true;
48
- readonly destructiveHint: false;
49
- readonly idempotentHint: true;
50
- readonly openWorldHint: true;
51
- };
52
- readonly inputSchema: z.ZodObject<{
53
- inviteId: z.ZodString;
54
- }, "strip", z.ZodTypeAny, {
55
- inviteId: string;
56
- }, {
57
- inviteId: string;
58
- }>;
59
- readonly handler: (input: {
60
- inviteId: string;
61
- }) => Promise<import("../api.js").ApiResponse<unknown>>;
62
- }, {
63
- readonly name: "tailscale_delete_device_invite";
64
- readonly description: "Delete a device invite. This is irreversible — the invite link will stop working.";
65
- readonly annotations: {
66
- readonly title: "Delete device invite";
67
- readonly readOnlyHint: false;
68
- readonly destructiveHint: true;
69
- readonly idempotentHint: true;
70
- readonly openWorldHint: true;
71
- };
72
- readonly inputSchema: z.ZodObject<{
73
- inviteId: z.ZodString;
74
- }, "strip", z.ZodTypeAny, {
75
- inviteId: string;
76
- }, {
77
- inviteId: string;
78
- }>;
79
- readonly handler: (input: {
80
- inviteId: string;
81
- }) => Promise<import("../api.js").ApiResponse<unknown>>;
82
- }, {
83
- readonly name: "tailscale_list_user_invites";
84
- readonly description: "List all user invites for your tailnet.";
85
- readonly annotations: {
86
- readonly title: "List user invites";
87
- readonly readOnlyHint: true;
88
- readonly destructiveHint: false;
89
- readonly idempotentHint: true;
90
- readonly openWorldHint: true;
91
- };
92
- readonly inputSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
93
- readonly handler: () => Promise<import("../api.js").ApiResponse<unknown>>;
94
- }, {
95
- readonly name: "tailscale_create_user_invite";
96
- readonly description: "Create a new user invite that allows someone to join your tailnet.";
97
- readonly annotations: {
98
- readonly title: "Create user invite";
99
- readonly readOnlyHint: false;
100
- readonly destructiveHint: false;
101
- readonly idempotentHint: false;
102
- readonly openWorldHint: true;
103
- };
104
- readonly inputSchema: z.ZodObject<{
105
- email: z.ZodOptional<z.ZodString>;
106
- role: z.ZodOptional<z.ZodEnum<["member", "admin", "it-admin", "network-admin", "billing-admin", "auditor"]>>;
107
- }, "strip", z.ZodTypeAny, {
108
- email?: string | undefined;
109
- role?: "admin" | "member" | "it-admin" | "network-admin" | "billing-admin" | "auditor" | undefined;
110
- }, {
111
- email?: string | undefined;
112
- role?: "admin" | "member" | "it-admin" | "network-admin" | "billing-admin" | "auditor" | undefined;
113
- }>;
114
- readonly handler: (input: {
115
- email?: string;
116
- role?: string;
117
- }) => Promise<import("../api.js").ApiResponse<unknown>>;
118
- }, {
119
- readonly name: "tailscale_get_user_invite";
120
- readonly description: "Get details for a specific user invite.";
121
- readonly annotations: {
122
- readonly title: "Get user invite";
123
- readonly readOnlyHint: true;
124
- readonly destructiveHint: false;
125
- readonly idempotentHint: true;
126
- readonly openWorldHint: true;
127
- };
128
- readonly inputSchema: z.ZodObject<{
129
- inviteId: z.ZodString;
130
- }, "strip", z.ZodTypeAny, {
131
- inviteId: string;
132
- }, {
133
- inviteId: string;
134
- }>;
135
- readonly handler: (input: {
136
- inviteId: string;
137
- }) => Promise<import("../api.js").ApiResponse<unknown>>;
138
- }, {
139
- readonly name: "tailscale_delete_user_invite";
140
- readonly description: "Delete a user invite. This is irreversible — the invite link will stop working.";
141
- readonly annotations: {
142
- readonly title: "Delete user invite";
143
- readonly readOnlyHint: false;
144
- readonly destructiveHint: true;
145
- readonly idempotentHint: true;
146
- readonly openWorldHint: true;
147
- };
148
- readonly inputSchema: z.ZodObject<{
149
- inviteId: z.ZodString;
150
- }, "strip", z.ZodTypeAny, {
151
- inviteId: string;
152
- }, {
153
- inviteId: string;
154
- }>;
155
- readonly handler: (input: {
156
- inviteId: string;
157
- }) => Promise<import("../api.js").ApiResponse<unknown>>;
158
- }];
@@ -1,160 +0,0 @@
1
- import { z } from "zod";
2
- import { apiDelete, apiGet, apiPost, encPath, getTailnet } from "../api.js";
3
- export const inviteTools = [
4
- // --- Device Invites ---
5
- {
6
- name: "tailscale_list_device_invites",
7
- description: "List all device invites for your tailnet.",
8
- annotations: {
9
- title: "List device invites",
10
- readOnlyHint: true,
11
- destructiveHint: false,
12
- idempotentHint: true,
13
- openWorldHint: true,
14
- },
15
- inputSchema: z.object({}),
16
- handler: async () => {
17
- return apiGet(`/tailnet/${getTailnet()}/device-invites`);
18
- },
19
- },
20
- {
21
- name: "tailscale_create_device_invite",
22
- description: "Create a new device invite that allows someone to add a device to your tailnet.",
23
- annotations: {
24
- title: "Create device invite",
25
- readOnlyHint: false,
26
- destructiveHint: false,
27
- idempotentHint: false,
28
- openWorldHint: true,
29
- },
30
- inputSchema: z.object({
31
- multiUse: z.boolean().optional().describe("Whether the invite can be used more than once (default: false)"),
32
- allowExitNode: z
33
- .boolean()
34
- .optional()
35
- .describe("Whether the invited device can be used as an exit node (default: false)"),
36
- email: z.string().optional().describe("Email address to send the invite to"),
37
- }),
38
- handler: async (input) => {
39
- const body = {};
40
- if (input.multiUse !== undefined)
41
- body.multiUse = input.multiUse;
42
- if (input.allowExitNode !== undefined)
43
- body.allowExitNode = input.allowExitNode;
44
- if (input.email !== undefined)
45
- body.email = input.email;
46
- return apiPost(`/tailnet/${getTailnet()}/device-invites`, body);
47
- },
48
- },
49
- {
50
- name: "tailscale_get_device_invite",
51
- description: "Get details for a specific device invite.",
52
- annotations: {
53
- title: "Get device invite",
54
- readOnlyHint: true,
55
- destructiveHint: false,
56
- idempotentHint: true,
57
- openWorldHint: true,
58
- },
59
- inputSchema: z.object({
60
- inviteId: z.string().describe("The device invite ID"),
61
- }),
62
- handler: async (input) => {
63
- return apiGet(`/device-invites/${encPath(input.inviteId)}`);
64
- },
65
- },
66
- {
67
- name: "tailscale_delete_device_invite",
68
- description: "Delete a device invite. This is irreversible — the invite link will stop working.",
69
- annotations: {
70
- title: "Delete device invite",
71
- readOnlyHint: false,
72
- destructiveHint: true,
73
- idempotentHint: true,
74
- openWorldHint: true,
75
- },
76
- inputSchema: z.object({
77
- inviteId: z.string().describe("The device invite ID to delete"),
78
- }),
79
- handler: async (input) => {
80
- return apiDelete(`/device-invites/${encPath(input.inviteId)}`);
81
- },
82
- },
83
- // --- User Invites ---
84
- {
85
- name: "tailscale_list_user_invites",
86
- description: "List all user invites for your tailnet.",
87
- annotations: {
88
- title: "List user invites",
89
- readOnlyHint: true,
90
- destructiveHint: false,
91
- idempotentHint: true,
92
- openWorldHint: true,
93
- },
94
- inputSchema: z.object({}),
95
- handler: async () => {
96
- return apiGet(`/tailnet/${getTailnet()}/user-invites`);
97
- },
98
- },
99
- {
100
- name: "tailscale_create_user_invite",
101
- description: "Create a new user invite that allows someone to join your tailnet.",
102
- annotations: {
103
- title: "Create user invite",
104
- readOnlyHint: false,
105
- destructiveHint: false,
106
- idempotentHint: false,
107
- openWorldHint: true,
108
- },
109
- inputSchema: z.object({
110
- email: z.string().optional().describe("Email address to send the invite to"),
111
- role: z
112
- .enum(["member", "admin", "it-admin", "network-admin", "billing-admin", "auditor"])
113
- .optional()
114
- .describe("Role to assign to the invited user (default: member)"),
115
- }),
116
- handler: async (input) => {
117
- const body = {};
118
- if (input.email !== undefined)
119
- body.email = input.email;
120
- if (input.role !== undefined)
121
- body.role = input.role;
122
- return apiPost(`/tailnet/${getTailnet()}/user-invites`, body);
123
- },
124
- },
125
- {
126
- name: "tailscale_get_user_invite",
127
- description: "Get details for a specific user invite.",
128
- annotations: {
129
- title: "Get user invite",
130
- readOnlyHint: true,
131
- destructiveHint: false,
132
- idempotentHint: true,
133
- openWorldHint: true,
134
- },
135
- inputSchema: z.object({
136
- inviteId: z.string().describe("The user invite ID"),
137
- }),
138
- handler: async (input) => {
139
- return apiGet(`/user-invites/${encPath(input.inviteId)}`);
140
- },
141
- },
142
- {
143
- name: "tailscale_delete_user_invite",
144
- description: "Delete a user invite. This is irreversible — the invite link will stop working.",
145
- annotations: {
146
- title: "Delete user invite",
147
- readOnlyHint: false,
148
- destructiveHint: true,
149
- idempotentHint: true,
150
- openWorldHint: true,
151
- },
152
- inputSchema: z.object({
153
- inviteId: z.string().describe("The user invite ID to delete"),
154
- }),
155
- handler: async (input) => {
156
- return apiDelete(`/user-invites/${encPath(input.inviteId)}`);
157
- },
158
- },
159
- ];
160
- //# sourceMappingURL=invites.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invites.js","sourceRoot":"","sources":["../../src/tools/invites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5E,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,yBAAyB;IACzB;QACE,IAAI,EAAE,+BAA+B;QACrC,WAAW,EAAE,2CAA2C;QACxD,WAAW,EAAE;YACX,KAAK,EAAE,qBAAqB;YAC5B,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO,MAAM,CAAC,YAAY,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAC3D,CAAC;KACF;IACD;QACE,IAAI,EAAE,gCAAgC;QACtC,WAAW,EAAE,iFAAiF;QAC9F,WAAW,EAAE;YACX,KAAK,EAAE,sBAAsB;YAC7B,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;YAC3G,aAAa,EAAE,CAAC;iBACb,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,yEAAyE,CAAC;YACtF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;SAC7E,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAIf,EAAE,EAAE;YACH,MAAM,IAAI,GAA4B,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;gBAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YACjE,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS;gBAAE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;YAChF,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YACxD,OAAO,OAAO,CAAC,YAAY,UAAU,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC;KACF;IACD;QACE,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,2CAA2C;QACxD,WAAW,EAAE;YACX,KAAK,EAAE,mBAAmB;YAC1B,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;SACtD,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAA2B,EAAE,EAAE;YAC7C,OAAO,MAAM,CAAC,mBAAmB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;KACF;IACD;QACE,IAAI,EAAE,gCAAgC;QACtC,WAAW,EAAE,mFAAmF;QAChG,WAAW,EAAE;YACX,KAAK,EAAE,sBAAsB;YAC7B,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;SAChE,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAA2B,EAAE,EAAE;YAC7C,OAAO,SAAS,CAAC,mBAAmB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;KACF;IAED,uBAAuB;IACvB;QACE,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,yCAAyC;QACtD,WAAW,EAAE;YACX,KAAK,EAAE,mBAAmB;YAC1B,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO,MAAM,CAAC,YAAY,UAAU,EAAE,eAAe,CAAC,CAAC;QACzD,CAAC;KACF;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,oEAAoE;QACjF,WAAW,EAAE;YACX,KAAK,EAAE,oBAAoB;YAC3B,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YAC5E,IAAI,EAAE,CAAC;iBACJ,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;iBAClF,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;SACpE,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAAwC,EAAE,EAAE;YAC1D,MAAM,IAAI,GAA4B,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YACxD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACrD,OAAO,OAAO,CAAC,YAAY,UAAU,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;QAChE,CAAC;KACF;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,yCAAyC;QACtD,WAAW,EAAE;YACX,KAAK,EAAE,iBAAiB;YACxB,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;SACpD,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAA2B,EAAE,EAAE;YAC7C,OAAO,MAAM,CAAC,iBAAiB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;KACF;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,iFAAiF;QAC9F,WAAW,EAAE;YACX,KAAK,EAAE,oBAAoB;YAC3B,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;SAC9D,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAA2B,EAAE,EAAE;YAC7C,OAAO,SAAS,CAAC,iBAAiB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;KACF;CACO,CAAC"}
@@ -1,94 +0,0 @@
1
- import { z } from "zod";
2
- export declare const keyTools: readonly [{
3
- readonly name: "tailscale_list_keys";
4
- readonly description: "List all auth keys in your tailnet.";
5
- readonly annotations: {
6
- readonly title: "List auth keys";
7
- readonly readOnlyHint: true;
8
- readonly destructiveHint: false;
9
- readonly idempotentHint: true;
10
- readonly openWorldHint: true;
11
- };
12
- readonly inputSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
13
- readonly handler: () => Promise<import("../api.js").ApiResponse<unknown>>;
14
- }, {
15
- readonly name: "tailscale_get_key";
16
- readonly description: "Get details for a specific auth key.";
17
- readonly annotations: {
18
- readonly title: "Get auth key";
19
- readonly readOnlyHint: true;
20
- readonly destructiveHint: false;
21
- readonly idempotentHint: true;
22
- readonly openWorldHint: true;
23
- };
24
- readonly inputSchema: z.ZodObject<{
25
- keyId: z.ZodString;
26
- }, "strip", z.ZodTypeAny, {
27
- keyId: string;
28
- }, {
29
- keyId: string;
30
- }>;
31
- readonly handler: (input: {
32
- keyId: string;
33
- }) => Promise<import("../api.js").ApiResponse<unknown>>;
34
- }, {
35
- readonly name: "tailscale_create_key";
36
- readonly description: "Create a new auth key for adding devices to your tailnet. Returns the key value — save it immediately, as it cannot be retrieved again.";
37
- readonly annotations: {
38
- readonly title: "Create auth key";
39
- readonly readOnlyHint: false;
40
- readonly destructiveHint: false;
41
- readonly idempotentHint: false;
42
- readonly openWorldHint: true;
43
- };
44
- readonly inputSchema: z.ZodObject<{
45
- reusable: z.ZodOptional<z.ZodBoolean>;
46
- ephemeral: z.ZodOptional<z.ZodBoolean>;
47
- preauthorized: z.ZodOptional<z.ZodBoolean>;
48
- tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
49
- expirySeconds: z.ZodOptional<z.ZodNumber>;
50
- description: z.ZodOptional<z.ZodString>;
51
- }, "strip", z.ZodTypeAny, {
52
- tags?: string[] | undefined;
53
- reusable?: boolean | undefined;
54
- ephemeral?: boolean | undefined;
55
- preauthorized?: boolean | undefined;
56
- expirySeconds?: number | undefined;
57
- description?: string | undefined;
58
- }, {
59
- tags?: string[] | undefined;
60
- reusable?: boolean | undefined;
61
- ephemeral?: boolean | undefined;
62
- preauthorized?: boolean | undefined;
63
- expirySeconds?: number | undefined;
64
- description?: string | undefined;
65
- }>;
66
- readonly handler: (input: {
67
- reusable?: boolean;
68
- ephemeral?: boolean;
69
- preauthorized?: boolean;
70
- tags?: string[];
71
- expirySeconds?: number;
72
- description?: string;
73
- }) => Promise<import("../api.js").ApiResponse<unknown>>;
74
- }, {
75
- readonly name: "tailscale_delete_key";
76
- readonly description: "Delete an auth key. This is irreversible — devices already authenticated with this key are unaffected, but no new devices can use it.";
77
- readonly annotations: {
78
- readonly title: "Delete auth key";
79
- readonly readOnlyHint: false;
80
- readonly destructiveHint: true;
81
- readonly idempotentHint: true;
82
- readonly openWorldHint: true;
83
- };
84
- readonly inputSchema: z.ZodObject<{
85
- keyId: z.ZodString;
86
- }, "strip", z.ZodTypeAny, {
87
- keyId: string;
88
- }, {
89
- keyId: string;
90
- }>;
91
- readonly handler: (input: {
92
- keyId: string;
93
- }) => Promise<import("../api.js").ApiResponse<unknown>>;
94
- }];
@@ -1,92 +0,0 @@
1
- import { z } from "zod";
2
- import { apiDelete, apiGet, apiPost, encPath, getTailnet } from "../api.js";
3
- export const keyTools = [
4
- {
5
- name: "tailscale_list_keys",
6
- description: "List all auth keys in your tailnet.",
7
- annotations: {
8
- title: "List auth keys",
9
- readOnlyHint: true,
10
- destructiveHint: false,
11
- idempotentHint: true,
12
- openWorldHint: true,
13
- },
14
- inputSchema: z.object({}),
15
- handler: async () => {
16
- return apiGet(`/tailnet/${getTailnet()}/keys`);
17
- },
18
- },
19
- {
20
- name: "tailscale_get_key",
21
- description: "Get details for a specific auth key.",
22
- annotations: {
23
- title: "Get auth key",
24
- readOnlyHint: true,
25
- destructiveHint: false,
26
- idempotentHint: true,
27
- openWorldHint: true,
28
- },
29
- inputSchema: z.object({
30
- keyId: z.string().describe("The auth key ID"),
31
- }),
32
- handler: async (input) => {
33
- return apiGet(`/tailnet/${getTailnet()}/keys/${encPath(input.keyId)}`);
34
- },
35
- },
36
- {
37
- name: "tailscale_create_key",
38
- description: "Create a new auth key for adding devices to your tailnet. Returns the key value — save it immediately, as it cannot be retrieved again.",
39
- annotations: {
40
- title: "Create auth key",
41
- readOnlyHint: false,
42
- destructiveHint: false,
43
- idempotentHint: false,
44
- openWorldHint: true,
45
- },
46
- inputSchema: z.object({
47
- reusable: z.boolean().optional().describe("Whether the key can be used more than once (default: false)"),
48
- ephemeral: z.boolean().optional().describe("Whether devices using this key are ephemeral (default: false)"),
49
- preauthorized: z.boolean().optional().describe("Whether devices are pre-authorized (default: false)"),
50
- tags: z.array(z.string()).optional().describe("ACL tags to apply to devices using this key"),
51
- expirySeconds: z.number().optional().describe("Key expiry in seconds (default: 90 days)"),
52
- description: z.string().optional().describe("Description for this key"),
53
- }),
54
- handler: async (input) => {
55
- const body = {
56
- capabilities: {
57
- devices: {
58
- create: {
59
- reusable: input.reusable ?? false,
60
- ephemeral: input.ephemeral ?? false,
61
- preauthorized: input.preauthorized ?? false,
62
- tags: input.tags ?? [],
63
- },
64
- },
65
- },
66
- };
67
- if (input.expirySeconds !== undefined)
68
- body.expirySeconds = input.expirySeconds;
69
- if (input.description !== undefined)
70
- body.description = input.description;
71
- return apiPost(`/tailnet/${getTailnet()}/keys`, body);
72
- },
73
- },
74
- {
75
- name: "tailscale_delete_key",
76
- description: "Delete an auth key. This is irreversible — devices already authenticated with this key are unaffected, but no new devices can use it.",
77
- annotations: {
78
- title: "Delete auth key",
79
- readOnlyHint: false,
80
- destructiveHint: true,
81
- idempotentHint: true,
82
- openWorldHint: true,
83
- },
84
- inputSchema: z.object({
85
- keyId: z.string().describe("The auth key ID to delete"),
86
- }),
87
- handler: async (input) => {
88
- return apiDelete(`/tailnet/${getTailnet()}/keys/${encPath(input.keyId)}`);
89
- },
90
- },
91
- ];
92
- //# sourceMappingURL=keys.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/tools/keys.ts"],"names":[],"mappings":"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"}