diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 451e14b07..824194e9a 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -522,6 +522,16 @@ "name": "square", "source": "third_party/square", "description": "Work with payments, orders, catalog, customers, and invoices." + }, + { + "name": "tailscale", + "source": "third_party/tailscale", + "description": "Let Grok Bot reach MCP servers on your private Tailscale network. Sign in to Tailscale to connect your tailnet; Grok Bot joins it as one tagged device and only reaches the hosts you grant to tag:grokbot.", + "minClientVersions": { + "cursor": "never", + "grokbot": "0.49.0", + "sand": "0.49.0" + } } ] } diff --git a/README.md b/README.md index 399900c91..106f7973f 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `quickbooks-online` | [QuickBooks Online](third_party/quickbooks-online/) | Cursor | Integrations | Read invoices, bills, expenses, customers, accounts, and financial reports. | | `workday` | [Workday](third_party/workday/) | Cursor | Integrations | Look up workers, organizations, time off, payroll, and recruiting data in Workday. | | `square` | [Square](third_party/square/) | Cursor | Integrations | Work with payments, orders, catalog, customers, and invoices. | +| `tailscale` | [Tailscale](third_party/tailscale/) | Cursor | Integrations | Let Grok Bot reach MCP servers on your private Tailscale network. Sign in to Tailscale to connect your tailnet; Grok Bot joins it as one tagged device and only reaches the hosts you grant to tag:grokbot. | Author values match each plugin’s `plugin.json` `author.name` (Cursor lists `plugins@cursor.com` in the manifest). ## Repository structure diff --git a/third_party/tailscale/.cursor-plugin/plugin.json b/third_party/tailscale/.cursor-plugin/plugin.json new file mode 100644 index 000000000..781b51306 --- /dev/null +++ b/third_party/tailscale/.cursor-plugin/plugin.json @@ -0,0 +1,38 @@ +{ + "name": "tailscale", + "displayName": "Tailscale", + "version": "1.0.0", + "minClientVersions": { + "cursor": "never", + "grokbot": "0.49.0", + "sand": "0.49.0" + }, + "description": "Let Grok Bot reach MCP servers on your private Tailscale network. Sign in to Tailscale to connect your tailnet; Grok Bot joins it as one tagged device and only reaches the hosts you grant to tag:grokbot.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://tailscale.com", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.svg", + "keywords": [ + "tailscale", + "tailnet", + "wireguard", + "vpn", + "private network", + "networking", + "self-hosted", + "grok", + "mcp" + ], + "category": "integrations", + "tags": [ + "tailscale", + "networking", + "grok", + "mcp" + ], + "skills": "./skills/" +} diff --git a/third_party/tailscale/CHANGELOG.md b/third_party/tailscale/CHANGELOG.md new file mode 100644 index 000000000..3a298f6e2 --- /dev/null +++ b/third_party/tailscale/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `tailscale` plugin, the opt-in for Grok Bot's built-in Tailscale connection. Installing it and signing in to Tailscale joins Grok Bot to your tailnet as one device tagged `tag:grokbot`. +- Carries no MCP server definition: the connection is served by the Cursor backend, and the MCP servers you reach over the tailnet are added separately. +- Added the Tailscale setup skill: the `tag:grokbot` tag owner and grant in the tailnet policy file, sign-in and device approval, Tailnet Lock, and how to disconnect. +- Grok Bot only (`grokbot` / `sand` 0.49.0 or newer, `cursor: "never"`). +- Logo: Tailscale's official mark, from the Tailscale press kit. diff --git a/third_party/tailscale/LICENSE b/third_party/tailscale/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/tailscale/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Cursor + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/tailscale/README.md b/third_party/tailscale/README.md new file mode 100644 index 000000000..25ec51f24 --- /dev/null +++ b/third_party/tailscale/README.md @@ -0,0 +1,42 @@ +# Tailscale + +Grok Bot plugin that lets agents reach [Model Context Protocol](https://modelcontextprotocol.io/) servers on your private [Tailscale](https://tailscale.com) network (tailnet). + +Let Grok Bot reach MCP servers on your private Tailscale network. Sign in to Tailscale to connect your tailnet; Grok Bot joins it as one tagged device and only reaches the hosts you grant to tag:grokbot. + +## Who can use it + +- Grok Bot **0.49** or newer. +- A Tailscale account with permission to edit the tailnet policy file. +- Not available in Cursor. Cursor must not list or install this plugin. + +## MCP + +This plugin ships no `mcp.json`. Grok Bot's Tailscale connection is served by the Cursor backend, and installing the plugin is the opt-in that turns it on. The MCP servers you want to reach on the tailnet are added separately, by their `*.ts.net` name or `100.x` address. + +## Setup + +1. In the tailnet policy file, define `tag:grokbot` and grant it access to only the MCP hosts and ports Grok Bot should reach. +2. Open **Tailscale** in Grok Bot's plugins, click **Authenticate**, and sign in to Tailscale. +3. Approve the new device in the Tailscale admin console if device approval is on. On a tailnet with Tailnet Lock, sign the device too. + +The `tailscale-setup` skill walks through each step, including a policy snippet. + +## Notes + +- Only messages from the bot owner and linked teammates, and routines the owner schedules, can use the tailnet. +- Grok Bot reaches nothing beyond what your grants allow `tag:grokbot` to reach. +- To disconnect, click **Remove** on the Tailscale plugin page in Grok Bot. + +## Docs + +- Tailscale grants: https://tailscale.com/docs/features/access-control/grants +- Tags: https://tailscale.com/docs/features/tags +- Device approval: https://tailscale.com/docs/features/access-control/device-management/device-approval +- Tailnet Lock: https://tailscale.com/docs/features/tailnet-lock + +Logo is Tailscale's official mark, from the Tailscale press kit. + +## License + +MIT diff --git a/third_party/tailscale/assets/logo.svg b/third_party/tailscale/assets/logo.svg new file mode 100644 index 000000000..d36945afc --- /dev/null +++ b/third_party/tailscale/assets/logo.svg @@ -0,0 +1,15 @@ + + Tailscale + + + + + + + + + + + + + diff --git a/third_party/tailscale/skills/tailscale-setup/SKILL.md b/third_party/tailscale/skills/tailscale-setup/SKILL.md new file mode 100644 index 000000000..7930011ea --- /dev/null +++ b/third_party/tailscale/skills/tailscale-setup/SKILL.md @@ -0,0 +1,56 @@ +--- +name: tailscale-setup +description: Walk a user through connecting Grok Bot to their Tailscale tailnet - define tag:grokbot in the tailnet policy file, grant it only the MCP hosts and ports it should reach, sign in from the Tailscale plugin, approve the device, then add tailnet MCP servers. Use when the user asks to set up, troubleshoot, or disconnect Grok Bot's Tailscale connection. +--- + +# Tailscale setup for Grok Bot + +Grok Bot joins the user's tailnet as one device tagged `tag:grokbot`. It can reach only the hosts and ports the tailnet policy file grants to that tag, so set up the policy before signing in. + +## 1. Define the tag and grant access + +In the Tailscale admin console, open **Access controls** and edit the policy file: + +- Add `tag:grokbot` to `tagOwners`, listing the user who will sign in (or `autogroup:admin`). +- Add a grant from `tag:grokbot` to only the MCP hosts and ports Grok Bot should reach. Nothing else. + +```hujson +{ + "tagOwners": { + "tag:grokbot": ["autogroup:admin"], + }, + "grants": [ + { + "src": ["tag:grokbot"], + "dst": ["mcp-server.tail1234.ts.net"], + "ip": ["tcp:443"], + }, + ], +} +``` + +Merge these keys into the existing policy instead of replacing it. Use the user's real host names, `100.x` addresses, or tags in `dst`, and the ports their MCP servers listen on in `ip`. If the policy still has the default allow-all rule, `tag:grokbot` can reach every device; point that out and suggest narrowing it. + +## 2. Connect Grok Bot + +1. Open the **Tailscale** plugin in Grok Bot and click **Authenticate**. +2. Sign in to Tailscale and approve the new device. +3. If device approval is on for the tailnet, approve the device on the **Machines** page of the admin console. +4. If the tailnet uses Tailnet Lock, sign the device from a signing node (`tailscale lock sign `). It cannot reach anything until it is signed. + +## 3. Add MCP servers + +Add each MCP server as usual, using its `*.ts.net` name or `100.x` address as the URL host. Requests to that host go over the tailnet. + +## Who can use the tailnet + +Only messages from the bot owner and linked teammates, and routines the owner schedules, can use the tailnet. Other people messaging the bot cannot. + +## Disconnect + +Click **Remove** on the Tailscale plugin page in Grok Bot. + +## Troubleshooting + +- **Cannot reach a host:** check that a grant from `tag:grokbot` covers that host and port, and that the device is approved (and signed, with Tailnet Lock). +- **Sign-in cannot apply the tag:** the signing-in user is not an owner of `tag:grokbot` in `tagOwners`.