AgentStack
MCP verified BSD-3-Clause Self-run

Tsidp

mcp-tailscale-tsidp · by tailscale

A simple OIDC / OAuth Identity Provider (IdP) server for your tailnet.

No reviews yet
0 installs
0 views
view→install

Install

$ agentstack add mcp-tailscale-tsidp

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

Are you the author of Tsidp? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

tsidp - Tailscale OpenID Connect (OIDC) Identity Provider

> [!CAUTION] > This is an experimental update of tsidp. It is under active development and may experience breaking changes.

[](https://tailscale.com/kb/1531/community-projects)

tsidp is an OIDC / OAuth Identity Provider (IdP) server that integrates with your Tailscale network. It allows you to use Tailscale identities for authentication into applications that support OpenID Connect as well as authenticated MCP client / server connections.

Prerequisites

  • A Tailscale network (tailnet) with MagicDNS and HTTPS enabled
  • A Tailscale authentication key from your tailnet
  • (Recommended) Docker installed on your system
  • Ability to set an Application capability grant

Running tsidp

(Recommended) Using the pre-built image

Docker images are automatically published at when releases are tagged.

> [!TIP] > Replace YOUR_TAILSCALE_AUTHKEY with your Tailscale authentication key in the following commands: > > Use an existing auth key or create a new auth key in the Keys page of the Tailscale admin console. Ensure you select an existing tag or create a new one.

Here is an example docker compose YAML file for tsidp:

services:
  tsidp:
    container_name: tsidp
    image: ghcr.io/tailscale/tsidp:latest
    volumes:
      - tsidp-data:/data
    environment:
      - TAILSCALE_USE_WIP_CODE=1 # tsidp is experimental - needed while version  [!NOTE]
> If you're running tsidp for the first time it may take a few minutes for the TLS certificate to generate. You may not be able to access the service until the certificate is ready.

> [!NOTE]
> **Using OAuth Client Secrets**
>
> As an alternative to traditional auth keys, you can use OAuth client secrets for automatic node registration.
>
> **Setup:**
> 1. In the [Tailscale admin console](https://login.tailscale.com/admin/settings/oauth), create an OAuth client with **Auth Keys → Write** scope
> 2. Ensure the advertise tag (e.g. `tag:tsidp`) is defined in your ACL `tagOwners`
> 3. Set `TS_AUTHKEY` to your OAuth client secret (`tskey-client-...`)
> 4. Set `TS_ADVERTISE_TAGS` (or `--advertise-tags`) — **required** when using OAuth client secrets
>
> ```yaml
> environment:
>   - TS_AUTHKEY=tskey-client-xxxxx
>   - TS_ADVERTISE_TAGS=tag:tsidp
> ```

### Other Ways to Build and Run

Building your own container

```bash
$ make docker-image

Using Go directly

If you'd like to build tsidp and / or run it directly you can do the following:

# Clone the Tailscale repository
$ git clone https://github.com/tailscale/tsidp.git
$ cd tsidp

# run with default values for flags
$ TAILSCALE_USE_WIP_CODE=1 TS_AUTHKEY={YOUR_TAILSCALE_AUTHKEY} TSNET_FORCE_LOGIN=1 go run .

Setting an Application Capability Grant

> [!IMPORTANT] > Access to the admin UI and dynamic client registration endpoints are denied by default.

> [!WARNING] > tsidp's application capability schema are still in development and may change at anytime.

  • Set an Application capability to grant access to the admin UI and DCR endpoints.
  • Configure grants in the Access controls page of the Tailscale admin console.
  • App capability grants are per request and updated immediately. No need to restart tsidp.

Example

"grants": [
  {
    // Very permissive and suitable only for testing.
    "src": ["*"],
    "dst": ["*"],

    // Example of a grant for tsidp:
    "app": {
      "tailscale.com/cap/tsidp": [
        {
          // allow access to UI
          "allow_admin_ui": true,

          // allow dynamic client registration
          "allow_dcr": true,

          // Secure Token Service (STS) controls
          "users":     ["*"],
          "resources": ["*"],

          // extraClaims are included in the id_token
          // recommend: keep this small and simple
          "extraClaims": {
            "bools": true,
            "strings": "Mon Jan 2 15:04:05 MST 2006",
            "numbers": 180,
            "array1": [1,2,3],
            "array2": ["one", "two", "three"]
          },

          // include extraClaims data in /userinfo response
          "includeInUserInfo": true,
        },
      ],
    },
  },
],

tsidp Configuration Options

The tsidp-server is configured by several command-line flags:

| Flag | Description | Default | | ------------------------------ | -------------------------------------------------------------------------------------------------- | -------- | | -dir | Directory path to save tsnet and tsidp state. Recommend to be set. | "" | | -hostname | hostname on tailnet. Will become .your-tailnet.ts.net | idp | | -port | Port to listen on | 443 | | -local-port | Listen on localhost:. Useful for testing | disabled | | -use-local-tailscaled | Use local tailscaled instead of tsnet | false | | -funnel | Use Tailscale Funnel to make tsidp available on the public internet so it works with SaaS products | disabled | | -enable-sts | Enable OAuth token exchange using RFC 8693 | disabled | | -advertise-tags | Comma-separated advertise tags (e.g. tag:tsidp). Required when using OAuth client secrets | "" | | -log | Set logging level: debug, info, warn, error | info | | -debug-all-requests | For development. Prints all requests and responses | disabled | | -debug-tsnet | For development. Enables debug level logging with tsnet connection | disabled |

CLI Environment Variables

The tsidp-server binary is configured through the CLI flags above. However, there are several environment variables that configure the libraries tsidp-server uses to connect to the tailnet.

Required
  • TAILSCALE_USE_WIP_CODE=1: required while tsidp is in development (`.

> [!WARNING] > Serverless/Stateless Deployment: tsidp requires persistent state storage to function properly in production. Without a persistent -dir, the service will re-register with Tailscale on every restart, lose dynamic OIDC client registrations, and invalidate user sessions. Serverless environments without persistent storage are not recommended for production use.

  • TS_AUTHKEY=: Key for registering a tsidp as a new node on your tailnet. Can be a traditional auth key or OAuth client secret (tskey-client-xxx). If omitted, a link will be printed to manually register.
  • TS_ADVERTISE_TAGS=: Comma-separated advertise tags (e.g., "tag:tsidp,tag:server"). Optional, but required when using OAuth client secrets.
  • TSNET_FORCE_LOGIN=1: Force re-login of the node. Useful during development.

Docker Environment Variables

The Docker image exposes the CLI flags through environment variables. If omitted the default values for the CLI flags will be used.

> [!NOTE] > TS_STATE_DIR and TS_HOSTNAME are legacy names. These will be replaced by TSIDP_STATE_DIR and TSIDP_HOSTNAME in the future.

| Environment Variable | CLI flag | | ---------------------------------------- | -------------------------- | | TS_STATE_DIR= \note prefix | -dir | | TS_HOSTNAME= \note prefix | -hostname | | TSIDP_PORT= | -port | | TSIDP_LOCAL_PORT= | -local-port | | TSIDP_USE_FUNNEL=1 | -funnel | | TSIDP_ENABLE_STS=1 | -enable-sts | | TSIDP_LOG= | -log | | TSIDP_DEBUG_TSNET=1 | -debug-tsnet | | TSIDP_DEBUG_ALL_REQUESTS=1 | -debug-all-requests | | TS_AUTHKEY= | (env var only) | | TS_ADVERTISE_TAGS= | -advertise-tags |

Application Configuration Guides (WIP)

tsidp can be used as IdP server for any application that supports custom OIDC providers.

> [!IMPORTANT] > Note: If you'd like to use tsidp to login to a SaaS application outside of your tailnet rather than a self-hosted app inside of your tailnet, you'll need to run tsidp with --funnel enabled.

  • [Proxmox](docs/proxmox/README.md)

TODOs

  • (TODO) Grafana
  • (TODO) open-webui
  • (TODO) Jellyfin
  • (TODO) Salesforce
  • (TODO) ...

MCP Configuration Guides

tsidp supports all of the endpoints required & suggested by the MCP Authorization specification, including Dynamic Client Registration (DCR). More information can be found in the following examples:

  • [MCP Client / Server](./examples/mcp-server/README.md)
  • [MCP Client / Gateway Server](./examples/mcp-gateway/README.md)

Support

This is an experimental, work in progress, community project. For issues or questions, file issues on the GitHub repository.

License

BSD-3-Clause License. See [LICENSE](./LICENSE) for details.

Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.