1. Conduid
  2. Security
  3. Tsidp
MCP server · Security

Tsidp

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

77Good

Scored 16 hours ago · breakdown

About Tsidp

Tsidp is an MCP server published by tailscale in the Security category: a simple OIDC / OAuth Identity Provider (IdP) server for your tailnet.

The repository has 680 stars and 67 forks, with the last commit 3 days ago. Recent commit activity is the strongest signal that reported issues will get attention.

Install

From source
git clone https://github.com/tailscale/tsidp

This server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.

Ask AI

✦

Ask AI about Tsidp

Powered by Claude · Grounded in docs

I know everything about Tsidp. Ask me about installation, configuration, usage, or troubleshooting.

Security checks

Static checks derived from the repository 16 hours ago. Heuristics on the source, not an audit.

  • ✓README presentThe repository ships documentation.
  • ✓License declaredUsable under a stated license.
  • ✓Tests presentA test suite exists in the repository.
  • ✓Dependencies pinnedA lockfile pins dependency versions.
  • ✓No dynamic code executionSource scan found no eval, dynamic Function, or shell execution.
  • !Scoped permissionsDoesn't declare a permission scope. Assume it can do anything its process can.

Releases

v0.0.17v0.0.17 · 15 Oct 2026Changelog 972d97d49b6e44d2baf4786def7485f55a7b09c1 dockerfile: fix docker-image build (#201) 8a220b355366fcc30d8d3ae0821c18c042dd06f8 go.{mod,sum}/server: replace deprecated go-jose library (#200)
v0.0.16v0.0.16 · 13 Oct 2026Changelog 02a878de5bb1fa067166b2f6caee55b8801626a0 flake.{lock,nix],go.{mod,mod.sir,sum}: update go and tailcale (#198) 8fa860f333d9b0ed7eee66e0c7c08531f743fd16 feat: support auth key from file (TS_AUTHKEY_FILE) (#190)…
v0.0.15v0.0.15 · 20 Aug 2026Changelog 437cbaea19c9fa6451292aef1f0ce075b097e5d8 go.{mod{.sri},sum}: update tailscale to 1.102.3 (#188) 754b84237a1439417d9693109d7a15dd2ebe4883 go.{mod,sum,sri}: update tailscale deps (#187) a3654d69e0f9fba780f3c5761c9f76385ac6c8f0…
v0.0.14v0.0.14 · 25 May 2026Changelog ccbf006c35396212dc258018eee26826d1436441 go.mod: update deps to pick up security patches (#172)
v0.0.13v0.0.13 · 25 May 2026Changelog a9340f0d39e46ca47a61f9998d6989e43f0574b0 tsidp-server: add warning for -use-local-tailscaled flag (#171) 7c5dc48947303df3417e1d612c609be9260183be feat: add `--version` flag and version resolution to CLI (#165)…

README

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.

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 https://ghcr.io/tailscale/tsidp 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 <1.0.0
      - TS_STATE_DIR=/data # store persistent tsnet and tsidp state
      - TS_HOSTNAME=idp # Hostname on tailnet (becomes idp.your-tailnet.ts.net)
      - TSIDP_ENABLE_STS=1 # Enable OAuth token exchange
      # Optional: Tailscale auth key for automatic node registration
      # - TS_AUTHKEY=tskey-auth-xxxxx
volumes:
  tsidp-data:

Paste the YAML snippet above into a file named compose.yaml. Once the compose file has been edited to your satisfaction, start tsidp by issuing docker compose up -d. Monitor the result with docker compose logs -f.

Once tsidp has started, visit https://idp.yourtailnet.ts.net in a browser to confirm the service is running.

[!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, 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
environment:
  - TS_AUTHKEY=tskey-client-xxxxx
  - TS_ADVERTISE_TAGS=tag:tsidp

[!NOTE] Using Docker Secrets

Passing TS_AUTHKEY as a plain environment variable puts the key in docker inspect output and the container's process environment. To avoid that, mount the key as a Docker secret and point tsidp at the mounted file with TS_AUTHKEY_FILE instead:

services:
  tsidp:
    image: ghcr.io/tailscale/tsidp:latest
    environment:
      - TAILSCALE_USE_WIP_CODE=1
      - TS_STATE_DIR=/data
      - TS_AUTHKEY_FILE=/run/secrets/ts_authkey
    volumes:
      - tsidp-data:/data
    secrets:
      - ts_authkey
secrets:
  ts_authkey:
    file: ./ts_authkey.txt
volumes:
  tsidp-data:

Other Ways to Build and Run

$ make docker-image

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 <path> Directory path to save tsnet and tsidp state. Recommend to be set. ""
-hostname <hostname> hostname on tailnet. Will become <hostname>.your-tailnet.ts.net idp
-port <port> Port to listen on 443
-local-port <port> Listen on localhost:<port>. 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 <tags> Comma-separated advertise tags (e.g. tag:tsidp). Required when using OAuth client secrets ""
-log <level> 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 (<v1.0.0).

Optional

These environment variables are used when tsidp does not have any state information set in -dir <path>.

[!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>: 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_AUTHKEY_FILE=<path> / -authkey-file <path>: Same as TS_AUTHKEY, but reads the key from a file - useful when your key comes from a Docker/Kubernetes secret instead of an env var. Don't set this alongside TS_AUTHKEY; tsidp will refuse to start rather than guess which one you meant. If the file is missing, tsidp just logs a warning and carries on (it may already be registered from a previous boot). No effect with -use-local-tailscaled.
  • TS_ADVERTISE_TAGS=<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=<path> *note prefix -dir <path>
TS_HOSTNAME=<hostname> *note prefix -hostname <hostname>
TSIDP_PORT=<port> -port <port>
TSIDP_LOCAL_PORT=<local-port> -local-port <local-port>
TSIDP_USE_LOCAL_TAILSCALED=1 -use-local-tailscaled
TSIDP_USE_FUNNEL=1 -funnel
TSIDP_ENABLE_STS=1 -enable-sts
TSIDP_LOG=<level> -log <level>
TSIDP_DEBUG_TSNET=1 -debug-tsnet
TSIDP_DEBUG_ALL_REQUESTS=1 -debug-all-requests
TS_AUTHKEY=<key> (env var only)
TS_AUTHKEY_FILE=<path> -authkey-file <path>
TS_ADVERTISE_TAGS=<tags> -advertise-tags <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.

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:

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 for details.

README fetched from the repository 16 hours ago. The original is authoritative.

Questions

About Tsidp

How do I install Tsidp?

No package has been published for this server, so install it from source: clone the repository and follow its README.

Is Tsidp safe to use with an AI agent?

Its trust score is 77 out of 100 (good). It passes 5 of the 6 static security checks run so far; the failures are listed above. It has no ConduID identity yet, so agent calls to it are not receipted.

Is Tsidp still maintained?

Yes — the latest release is v0.0.17 (15 Oct 2026), and the last commit was 3 days ago. The repository has 680 stars and 48 open issues.