Skip to main content

Plane MCP Server CE

MCP server for self-hosted Plane Community Edition.

  • Package: plane-community-mcp
  • Command: plane-mcp-server-ce
  • Transports: stdio and Streamable HTTP with PAT headers
  • OAuth and SSE are not supported.

Install

Python 3.10 or later is required. Package: plane-community-mcp; command: plane-mcp-server-ce.

uvx (no install; runs the latest release, or a pinned one):

uvx --from plane-community-mcp plane-mcp-server-ce --help
uvx --from plane-community-mcp==0.7.1 plane-mcp-server-ce --help

pip / pipx:

pip install plane-community-mcp
pipx install plane-community-mcp

Docker (see HTTP for run flags):

docker build -t plane-mcp-server-ce .

Verify an installation:

plane-mcp-server-ce --help          # pip/pipx
uvx --from plane-community-mcp plane-mcp-server-ce --help   # uvx

Update

How to move an existing setup to a new release.

uvx caches the resolved package; pass --refresh to pick up the new release:

uvx --refresh --from plane-community-mcp plane-mcp-server-ce --help

MCP client configs using uvx --from plane-community-mcp … keep the cache per client; add --refresh once after upgrading, or run the command above manually, then restart the client. Pinned configs (==x.y.z) must be edited to the new version.

pip / pipx:

pip install --upgrade plane-community-mcp
pipx upgrade plane-community-mcp

Docker: rebuild the image so the new version is baked in:

git pull && docker build -t plane-mcp-server-ce .

Upgrading to 0.7.0

  • Pages are served by one resource tool, page(action=...), with actions list, retrieve, create, update, archive, unarchive, delete. The previous per-operation tools (create_page, update_page, …) remain callable but no longer appear in tools/list; clients that cache tool lists should refresh them.
  • update_page now takes (page_id, project_id, name=None, description_html=None). MCP calls use named arguments and are unaffected; positional callers must switch to named arguments.
  • On CE without session credentials, page tools are hidden and direct calls fail with a clear credentials error instead of a cryptic 401/404.

Stdio

Set the Plane URL, API key, and workspace slug:

export PLANE_BASE_URL="https://plane.example.com"
export PLANE_API_KEY="your-api-key"
export PLANE_WORKSPACE_SLUG="your-workspace"
export PLANE_MCP_EDITION="community"

uvx --from plane-community-mcp plane-mcp-server-ce stdio

Example MCP configuration:

{
  "mcpServers": {
    "plane": {
      "command": "uvx",
      "args": ["--from", "plane-community-mcp", "plane-mcp-server-ce", "stdio"],
      "env": {
        "PLANE_BASE_URL": "https://plane.example.com",
        "PLANE_API_KEY": "your-api-key",
        "PLANE_WORKSPACE_SLUG": "your-workspace",
        "PLANE_MCP_EDITION": "community"
      }
    }
  }
}

HTTP

Start the server:

export PLANE_BASE_URL="https://plane.example.com"
export PLANE_MCP_EDITION="community"
uvx --from plane-community-mcp plane-mcp-server-ce http

Endpoint:

http://<host>:8211/http/api-key/mcp

Clients must send both headers:

Authorization: Bearer <api-key>
x-workspace-slug: <workspace-slug>

Example with mcp-remote:

{
  "mcpServers": {
    "plane": {
      "command": "npx",
      "args": [
        "mcp-remote@latest",
        "http://plane-mcp:8211/http/api-key/mcp",
        "--header", "Authorization: Bearer ${PLANE_API_KEY}",
        "--header", "x-workspace-slug: ${PLANE_WORKSPACE_SLUG}"
      ]
    }
  }
}

Docker:

docker build -t plane-mcp-server-ce .
docker run -p 8211:8211 \
  -e PLANE_BASE_URL="https://plane.example.com" \
  -e PLANE_MCP_EDITION="community" \
  plane-mcp-server-ce

Configuration

Variable Required Description
PLANE_BASE_URL Yes for self-hosted Plane Plane instance origin.
PLANE_API_KEY stdio Personal API key.
PLANE_WORKSPACE_SLUG stdio Workspace slug.
PLANE_MCP_EDITION Recommended Set to community for CE-only tool discovery.
PLANE_CE_CAPABILITIES No Comma-separated CE capability keys (e.g. pages.parent_id) enabled beyond the verified baseline.
PLANE_INTERNAL_BASE_URL No Internal Plane URL for server-to-server calls.
MCP_PATH_PREFIX No HTTP route prefix.
LOG_LEVEL No Python log level; default INFO.
LOG_USER_INFO No Set to true to include display name in logs.

Session-only CE tools

CE exposes project pages and work-item archive operations through its app API, not the public API. Enable these tools with either a session cookie or login credentials:

export PLANE_SESSION_COOKIE="<session-id-cookie>"
# Or:
export PLANE_SESSION_EMAIL="you@example.com"
export PLANE_SESSION_PASSWORD="your-password"

Without these variables, session-only tools are hidden. Prefer a session cookie over an account password. The cookie is the session-id value from an active browser session and must be replaced when it expires.

A cookie cannot be renewed in-process: once it expires, a 401 retry only re-fetches the CSRF token, so the server cannot recover until it is restarted with a fresh value. Refresh it out of band with scripts/refresh-session.sh, which signs in with PLANE_SESSION_EMAIL / PLANE_SESSION_PASSWORD (no browser needed) and rewrites PLANE_SESSION_COOKIE in your env file (atomically, keeping its permissions; the cookie value is never echoed):

./scripts/refresh-session.sh                     # default env file: ~/.config/plane-mcp/env
./scripts/refresh-session.sh /path/to/env-file   # or pass one explicitly

Requires curl and python3. Restart the MCP server afterwards — the cookie is only read at process start. Run it manually or from cron before the session expires.

Page operations are exposed through the page(action=...) resource tool (list, retrieve, create, update, archive, unarchive, delete). The previous per-operation names below remain callable but are hidden from discovery, so existing clients keep working. update_page / page(action="update") accepts name and/or description_html; on CE they are applied through the app API's separate name and content routes, in that order. On Plane Cloud all page actions use the public SDK/API path.

Old tool Replacement
list_pages page(action="list")
retrieve_page page(action="retrieve")
create_page page(action="create")
update_page page(action="update")
update_page_content page(action="update", description_html=…)
archive_page page(action="archive")
unarchive_page page(action="unarchive")
delete_page page(action="delete")

On CE, parent_id/collection_id on page(action="create") are rejected before any write (silently ignored on every target probed so far). Set PLANE_CE_CAPABILITIES (comma-separated, e.g. pages.parent_id) to enable them on a target you have verified yourself; see CE_COMPAT.md.

CE scope

CE mode exposes supported projects, work items, cycles, modules, labels, states, comments, links, attachments, activities, and project pages. Unsupported or partial endpoints are omitted from discovery where possible. See CE_COMPAT.md for endpoint evidence and the complete matrix.

Logging

Logs are JSON. Each tool call emits one success or error event with the tool name and duration. Request payloads are not logged.

Development

uv sync --all-extras
uv run ruff check .
uv run pytest

Release

See RELEASING.md.

Contributing

See CONTRIBUTING.md.

License

MIT

Release files for plane-community-mcp 0.7.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for plane-community-mcp 0.7.1
File Size Uploaded
plane_community_mcp-0.7.1.tar.gz 68.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for plane-community-mcp 0.7.1
File Interpreter ABI Platform
plane_community_mcp-0.7.1-py3-none-any.whl Python 3 none any Details

Total release size: 144.6 kB

Release files / plane_community_mcp-0.7.1.tar.gz

Download URL plane_community_mcp-0.7.1.tar.gz
Size 68.4 kB
Tags Source
SHA-256 checksum
How to use checksums
29548c8ecce3ac031a03577694a9bdcfdfb90735a394f45aac0cff3325d29325
BLAKE2b-256 checksum
How to use checksums
c5227ee3bc4f536fb8301ca0401de3a92c336367c9e46837f9340268a9db18dd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.

Transparency log

Release files / plane_community_mcp-0.7.1-py3-none-any.whl

Download URL plane_community_mcp-0.7.1-py3-none-any.whl
Size 76.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fa6ecabef4a6bad0f1be2351b8a132b240156ff1cab368d24a2d1a5960fbfac0
BLAKE2b-256 checksum
How to use checksums
a238cbeb258c8f3330a45eddbc59127e065bb48c0578ce32d0af23431e3b8416
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.7.1 This release

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page