Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,16 @@
"name": "workday",
"source": "third_party/workday",
"description": "Look up workers, organizations, time off, payroll, and recruiting data in Workday."
},
{
"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"
}
}
]
}
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc
| `shopify-store` | [Shopify](third_party/shopify-store/) | Cursor | Integrations | Connect your Shopify store so Grok can answer questions about products, orders, customers, inventory, and sales. |
| `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. |
| `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
Expand Down
38 changes: 38 additions & 0 deletions third_party/tailscale/.cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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/"
}
11 changes: 11 additions & 0 deletions third_party/tailscale/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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.
21 changes: 21 additions & 0 deletions third_party/tailscale/LICENSE
Original file line number Diff line number Diff line change
@@ -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.
42 changes: 42 additions & 0 deletions third_party/tailscale/README.md
Original file line number Diff line number Diff line change
@@ -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
15 changes: 15 additions & 0 deletions third_party/tailscale/assets/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
56 changes: 56 additions & 0 deletions third_party/tailscale/skills/tailscale-setup/SKILL.md
Original file line number Diff line number Diff line change
@@ -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 <node-key>`). 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`.
Loading