-
Notifications
You must be signed in to change notification settings - Fork 22
docs: sync MCP server docs to plane-mcp-server v0.3.0 #313
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,30 +1,33 @@ | ||
| --- | ||
| title: Self-host MCP Server | ||
| description: Deploy your own Plane MCP Server with Docker Compose or Helm. Register an OAuth app, configure credentials, and point AI clients at your own instance. | ||
| title: Self-host the MCP server | ||
| description: Deploy the Plane MCP server with Docker Compose or Helm, register OAuth callbacks, configure storage and security, and connect AI clients. | ||
| keywords: plane mcp server, self-hosted mcp, plane mcp deployment, docker compose mcp, helm mcp, plane oauth mcp, mcp server setup | ||
| --- | ||
|
|
||
| # Self-host MCP Server | ||
| # Self-host the MCP server | ||
|
|
||
| This guide is for teams that want to run their own instance of the Plane MCP Server - either because they're on a self-hosted Plane installation that needs OAuth against their own domain, or because they want full control over the MCP infrastructure. | ||
| This guide is for teams that want to run their own instance of the Plane MCP server — either because they use a | ||
| self-hosted Plane installation that needs OAuth against their own domain, or because they want full control over the | ||
| MCP infrastructure. | ||
|
|
||
| If you're a Plane Cloud user connecting to `mcp.plane.so`, you don't need this. Use the [MCP Server setup guide](/dev-tools/mcp-server) instead. | ||
| If you're a Plane Cloud user connecting to `mcp.plane.so`, you don't need this. Use the | ||
| [MCP server setup guide](/dev-tools/mcp-server) instead. | ||
|
|
||
| ## Prerequisites | ||
|
|
||
| - A running **Plane instance** (self-hosted or Cloud) with workspace admin access | ||
| - **Docker** and Docker Compose v2+, _or_ **Kubernetes** v1.21+ with Helm v3+ | ||
| - A **public URL** for the MCP server (e.g. `https://mcp.yourdomain.com`) - OAuth callbacks must be able to reach it over HTTPS | ||
| - A **public URL** for the MCP server (e.g. `https://mcp.yourdomain.com`) — OAuth callbacks must reach it over HTTPS | ||
|
|
||
| --- | ||
|
|
||
| ## Register an OAuth app in Plane | ||
|
|
||
| The MCP server authenticates users through Plane's OAuth 2.0 system. You need to register an app to get a Client ID and Client Secret. | ||
|
|
||
| 1. Go to **Workspace Settings → Integrations**: | ||
| 1. Go to **Workspace settings → Integrations**: | ||
|
|
||
| ``` | ||
| ```text | ||
| https://<your-plane-domain>/<workspace>/settings/integrations/ | ||
| ``` | ||
|
|
||
|
|
@@ -36,27 +39,28 @@ The MCP server authenticates users through Plane's OAuth 2.0 system. You need to | |
| | ---------------- | ---------------------------------------------------------------- | | ||
| | **App Name** | Anything descriptive (e.g. `Plane MCP Server`) | | ||
| | **Setup URL** | Your MCP server's public URL (e.g. `https://mcp.yourdomain.com`) | | ||
| | **Redirect URI** | All three URIs listed below, space-separated | | ||
| | **Redirect URI** | Both URIs listed below, space-separated | | ||
| | **Webhook URL** | Leave empty unless you need webhook events | | ||
|
|
||
| ::: tip Add all three redirect URIs | ||
| The server exposes callbacks on three paths to support all transports and MCP clients: | ||
| ::: tip Add both redirect URIs | ||
| FastMCP exposes one callback under the HTTP mount and one under the SSE mount: | ||
|
|
||
| | Transport | Redirect URI | | ||
| | --------------- | ------------------------------------- | | ||
| | OAuth callback | `<MCP_SERVER_URL>/callback` | | ||
| | HTTP with OAuth | `<MCP_SERVER_URL>/http/auth/callback` | | ||
| | SSE (legacy) | `<MCP_SERVER_URL>/auth/callback` | | ||
| | Transport | Redirect URI | | ||
| | ---------------- | ------------------------------------- | | ||
| | Streamable HTTP | `<MCP_SERVER_URL>/http/auth/callback` | | ||
| | SSE (deprecated) | `<MCP_SERVER_URL>/auth/callback` | | ||
|
|
||
| For `https://mcp.yourdomain.com`, paste this into the Redirect URI field: | ||
|
|
||
| ```text | ||
| https://mcp.yourdomain.com/http/auth/callback https://mcp.yourdomain.com/auth/callback | ||
| ``` | ||
| https://mcp.yourdomain.com/callback https://mcp.yourdomain.com/http/auth/callback https://mcp.yourdomain.com/auth/callback | ||
| ``` | ||
|
|
||
| A previously registered `https://mcp.yourdomain.com/callback` URI is harmless but unnecessary. | ||
|
|
||
| ::: | ||
|
|
||
| 4. Under **Scopes & Permissions**, select both **read** and **write** scopes. | ||
| 4. Under **Scopes & permissions**, select both **read** and **write** scopes. | ||
|
|
||
| 5. Save. Copy the generated **Client ID** and **Client Secret** - you'll need them in the next step. | ||
|
|
||
|
|
@@ -146,15 +150,45 @@ The container listens on plain HTTP at `:8211`. Put it behind a reverse proxy (n | |
|
|
||
| #### Environment variable reference | ||
|
|
||
| | Variable | Required | Description | | ||
| | ------------------------------------ | -------- | ------------------------------------------------------------------------------ | | ||
| | `APP_RELEASE_VERSION` | No | Image tag to deploy. Defaults to `latest`. Pin in production. | | ||
| | `PLANE_BASE_URL` | No | Plane API URL. Defaults to `https://api.plane.so`. | | ||
| | `PLANE_INTERNAL_BASE_URL` | No | Internal Plane URL for server-to-server calls. Falls back to `PLANE_BASE_URL`. | | ||
| | `PLANE_OAUTH_PROVIDER_CLIENT_ID` | Yes | OAuth Client ID from Step 1. | | ||
| | `PLANE_OAUTH_PROVIDER_CLIENT_SECRET` | Yes | OAuth Client Secret from Step 1. | | ||
| | `PLANE_OAUTH_PROVIDER_BASE_URL` | Yes | Public URL of **this MCP server** - not your Plane instance. | | ||
| | `MCP_PATH_PREFIX` | No | Path prefix for all routes. Use when reverse-proxying alongside other apps. | | ||
| | Variable | Required | Description | | ||
| | ------------------------------------ | -------- | -------------------------------------------------------------------------------------------------------------------- | | ||
| | `APP_RELEASE_VERSION` | No | Image tag to deploy. Defaults to `latest`. Pin in production. | | ||
| | `PLANE_BASE_URL` | No | Public Plane API URL. Defaults to `https://api.plane.so`. | | ||
| | `PLANE_INTERNAL_BASE_URL` | No | Internal Plane URL for server-to-server calls. Falls back to `PLANE_BASE_URL`. | | ||
| | `PLANE_OAUTH_PROVIDER_CLIENT_ID` | Yes | OAuth Client ID from Step 1. | | ||
| | `PLANE_OAUTH_PROVIDER_CLIENT_SECRET` | Yes | OAuth Client Secret from Step 1. | | ||
| | `PLANE_OAUTH_PROVIDER_BASE_URL` | Yes | Public URL of **this MCP server**, not your Plane instance. | | ||
| | `PLANE_OAUTH_PROVIDER_ENABLE_CIMD` | No | Enables client ID metadata documents. Defaults to `false`. | | ||
| | `PLANE_OAUTH_ALLOWED_REDIRECT_URIS` | No | Comma-separated extra client redirect patterns. `*` can match a port, path segment, or subdomain; keep hosts pinned. | | ||
| | `MCP_PATH_PREFIX` | No | Prefix for every route. For example, `/plane` serves MCP at `/plane/http/mcp`. | | ||
| | `REDIS_HOST` | No | Redis or Valkey host for persistent OAuth token storage. Without it, tokens use in-memory storage. | | ||
| | `REDIS_PORT` | No | Redis or Valkey port. | | ||
| | `REDIS_PASSWORD` | No | Static Redis or Valkey password. | | ||
| | `REDIS_SSL` | No | Enables TLS for Redis or Valkey when set to `true`. | | ||
| | `ELASTICACHE_SECRET_ARN` | No | AWS Secrets Manager ARN containing a rotating ElastiCache authentication token. | | ||
| | `AWS_REGION` | No | AWS region for `ELASTICACHE_SECRET_ARN`. | | ||
| | `REDIS_AUTH_TOKEN_KEY` | No | JSON key that contains the rotating token in the AWS secret. | | ||
| | `LOG_USER_INFO` | No | Logs the user's display name when `true`. Defaults to `false`; the display name is PII. | | ||
|
|
||
| #### Onboard a new MCP client | ||
|
|
||
| The built-in redirect allowlist contains: | ||
|
|
||
| - `http://localhost:*`, `http://localhost:*/*`, `http://127.0.0.1:*`, and | ||
| `http://127.0.0.1:*/*` | ||
| - `cursor://anysphere.cursor-mcp/oauth/*` and `https://www.cursor.com/*` | ||
| - `https://vscode.dev/redirect` and `https://insiders.vscode.dev/redirect` | ||
| - `https://antigravity.google/oauth-callback` | ||
| - `https://claude.ai/*` | ||
| - `https://chatgpt.com/connector/oauth/*` and `https://chatgpt.com/connector_platform_oauth_redirect` | ||
|
|
||
| Append new client callbacks without releasing a new server version: | ||
|
|
||
| ```env | ||
| PLANE_OAUTH_ALLOWED_REDIRECT_URIS=https://newclient.com/cb,https://other.app/oauth/* | ||
| ``` | ||
|
|
||
| The `*` wildcard can match any port, path segment, or subdomain. Keep the host pinned to a domain you trust. | ||
|
|
||
| #### Upgrading | ||
|
|
||
|
|
@@ -224,6 +258,9 @@ helm install plane-mcp plane/plane-mcp-server \ | |
| | `services.redis.local_setup` | `true` | Deploy Valkey in-cluster | | ||
| | `services.redis.external_redis_url` | `""` | External Valkey/Redis URL (if not using in-cluster) | | ||
|
|
||
| Environment variables that have no Helm value — for example `PLANE_OAUTH_ALLOWED_REDIRECT_URIS` or `LOG_USER_INFO` — | ||
| must be set as environment variables on the MCP server deployment. | ||
|
|
||
|
Comment on lines
+264
to
+266
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
command -v helm >/dev/null
helm repo add plane https://helm.plane.so >/dev/null
helm repo update >/dev/null
helm show values plane/plane-mcp-server | rg -n 'extraEnv|env|secret'Repository: makeplane/developer-docs Length of output: 162 🏁 Script executed: #!/usr/bin/env bash
set -u
printf '%s\n' '--- target section ---'
sed -n '235,275p' docs/dev-tools/mcp-server-self-host.md
printf '%s\n' '--- local Helm and MCP references ---'
rg -n -i --glob '*.{md,mdx,yaml,yml,json,toml}' \
'plane-mcp-server|extraEnv|extra env|extraEnvs|envFrom|secret|helm' .
printf '%s\n' '--- repository file candidates ---'
git ls-files | rg -i 'mcp|helm|chart|values'Repository: makeplane/developer-docs Length of output: 50382 🌐 Web query:
💡 Result: As of August 2026, there is no official, published Helm chart specifically for the plane-mcp-server [1]. While there have been community discussions and pull requests aimed at creating one, the primary documentation for the Plane MCP server focuses on direct configuration via environment variables (such as PLANE_API_KEY, PLANE_WORKSPACE_SLUG, and PLANE_BASE_URL) rather than Helm deployment [2][3][4]. For the main Plane platform Helm charts (plane-ce and plane-enterprise), the platform does provide a mechanism for injecting additional environment variables globally across its workloads using an Citations:
🏁 Script executed: #!/usr/bin/env bash
set -u
printf '%s\n' '--- chart repository metadata ---'
for url in \
https://helm.plane.so/index.yaml \
https://raw.githubusercontent.com/makeplane/plane/master/deployments/helm/plane-mcp-server/values.yaml \
https://raw.githubusercontent.com/makeplane/plane/main/deployments/helm/plane-mcp-server/values.yaml
do
printf '\nURL: %s\n' "$url"
curl -L --fail --silent --show-error --max-time 20 "$url" | \
rg -n -i -C 3 'extraEnv|extra env|envFrom|secret|environment|mcp' || true
doneRepository: makeplane/developer-docs Length of output: 549 🏁 Script executed: #!/usr/bin/env bash
set -u
python3 - <<'PY'
from urllib.request import urlopen, Request
from urllib.error import HTTPError, URLError
urls = [
"https://helm.plane.so/index.yaml",
"https://helm.plane.so/charts/plane-mcp-server",
"https://github.com/makeplane/helm-charts",
]
for url in urls:
print(f"\nURL: {url}")
try:
req = Request(url, headers={"User-Agent": "read-only-review-check"})
with urlopen(req, timeout=20) as response:
body = response.read()
print("status:", response.status, "bytes:", len(body))
text = body.decode("utf-8", "replace")
matches = [
line for line in text.splitlines()
if "plane-mcp" in line.lower() or "mcp-server" in line.lower()
]
print("\n".join(matches[:20]) or "no plane-mcp-server entry")
except (HTTPError, URLError, TimeoutError) as exc:
print(type(exc).__name__, exc)
PYRepository: makeplane/developer-docs Length of output: 732 🏁 Script executed: #!/usr/bin/env bash
set -u
printf '%s\n' '--- Helm index entries ---'
curl -k -L --fail --silent --show-error --max-time 20 \
https://helm.plane.so/index.yaml |
rg -n -i -C 2 'plane-mcp|mcp-server' || true
printf '%s\n' '--- Helm chart endpoint ---'
curl -k -I -L --max-time 20 \
https://helm.plane.so/charts/plane-mcp-server 2>&1 |
sed -n '1,12p'
printf '%s\n' '--- helm-charts repository candidates ---'
curl -k -L --fail --silent --show-error --max-time 20 \
https://api.github.com/repos/makeplane/helm-charts/contents/charts |
python3 -c 'import json,sys; print("\n".join(x["name"] for x in json.load(sys.stdin)))' |
rg -i 'mcp|plane' || trueRepository: makeplane/developer-docs Length of output: 849 Remove or correct the Helm deployment section.
🤖 Prompt for AI Agents
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The chart does exist — There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
The The finding remains valid for the repository URL. The documented 🐇🔎 ✏️ Learnings added
You are interacting with an AI system. |
||
| #### Upgrading | ||
|
|
||
| ```bash | ||
|
|
@@ -240,17 +277,25 @@ helm uninstall plane-mcp --namespace plane-mcp | |
|
|
||
| --- | ||
|
|
||
| ## Logging and observability | ||
|
|
||
| The server emits structured JSON logs with the tool name, duration, status, opaque user ID, and workspace slug. | ||
|
|
||
| `LOG_USER_INFO` defaults to `false`. Setting it to `true` also logs the user's display name, which is personally | ||
| identifiable information. | ||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
|
|
||
| ## Connect AI clients | ||
|
|
||
| Once the server is running, your available endpoints are: | ||
|
|
||
| | Endpoint | Auth | Description | | ||
| | --------------------------------------------- | ---------- | ----------------------------------- | | ||
| | `https://mcp.yourdomain.com/http/mcp` | OAuth | Recommended for most clients | | ||
| | `https://mcp.yourdomain.com/http/api-key/mcp` | PAT header | For CI/CD, scripts, headless setups | | ||
| | `https://mcp.yourdomain.com/sse` | OAuth | Legacy SSE transport (deprecated) | | ||
| | Endpoint | Auth | Description | | ||
| | --------------------------------------------- | --------------------------------------------------------- | -------------------------------- | | ||
| | `https://mcp.yourdomain.com/http/mcp` | OAuth | Recommended for most clients | | ||
| | `https://mcp.yourdomain.com/http/api-key/mcp` | `Authorization: Bearer <PAT>`, `x-workspace-slug: <slug>` | CI, scripts, and headless setups | | ||
| | `https://mcp.yourdomain.com/sse` | OAuth | Deprecated HTTP+SSE transport | | ||
|
|
||
| Client configuration is identical to the [MCP Server setup guide](/dev-tools/mcp-server) - replace `https://mcp.plane.so` with your server's URL in every config snippet. | ||
| Client configuration is identical to the [MCP server setup guide](/dev-tools/mcp-server). Swap | ||
| `https://mcp.plane.so` for your server's host in each configuration. | ||
|
|
||
| --- | ||
|
|
||
|
|
@@ -273,9 +318,12 @@ If Valkey is unhealthy, tokens are stored in-memory and lost on restart. Verify | |
|
|
||
| **OAuth errors:** | ||
|
|
||
| - Confirm all three redirect URIs are registered in your Plane OAuth app: `/callback`, `/http/auth/callback`, `/auth/callback`. | ||
| - Confirm both redirect URIs are registered in your Plane OAuth app: `/http/auth/callback` and `/auth/callback`. An | ||
| existing `/callback` registration is harmless but unnecessary. | ||
| - Check that `PLANE_OAUTH_PROVIDER_CLIENT_ID` and `PLANE_OAUTH_PROVIDER_CLIENT_SECRET` match what Plane generated. | ||
| - Check that `PLANE_OAUTH_PROVIDER_BASE_URL` is the publicly reachable `https://` URL of this MCP server - not your Plane instance URL. | ||
| - If the client reports `redirect_uri is not allowed`, add its exact callback or a host-pinned pattern to | ||
| `PLANE_OAUTH_ALLOWED_REDIRECT_URIS`, then restart the deployment. | ||
| - Clear any cached auth tokens on the client side: | ||
|
|
||
| ```bash | ||
|
|
@@ -297,5 +345,5 @@ docker compose up -d | |
|
|
||
| --- | ||
|
|
||
| → For client configuration details, see the [MCP Server setup guide](/dev-tools/mcp-server). | ||
| → For the full list of available tools, see the [MCP Server Tool Reference](/dev-tools/mcp-server-tools). | ||
| → For client configuration details, see the [MCP server setup guide](/dev-tools/mcp-server). | ||
| → For the full list of available tools, see the [tool reference](/dev-tools/mcp-server-tools). | ||
Uh oh!
There was an error while loading. Please reload this page.