Typed Python client and MCP server for Plane Plus — built for AI agents.
by EyrieHQ · Apache-2.0
MCP quickstart • SDK quickstart • Config • Plane Plus fork
Two things in one repo, sharing the same HTTP layer:
plane_sdk— a typed Python client for the Plane Plus API. Covers projects, work items, cycles, modules, labels, states, pages, first-class epics, workspace wiki pages, page folders, intake, and members.mcp_server— a FastMCP server that exposes every SDK method as an MCP tool so LLM agents (Claude Code, Claude Desktop, Cursor, Continue, etc.) can manage a Plane Plus workspace directly.
Designed for and supported against
Plane Plus — an AI-agent-first
fork of Plane. Assumes the Plane Plus
/api/v1/ surface (API-key auth, markdown round-trip on pages, first-class
epics, page folders).
- Python 3.11+
- A Plane workspace and an API key (Workspace Settings → API tokens)
- For the MCP server: an MCP-aware client such as Claude Code, Claude Desktop,
or Cursor — and
uvinstalled (the recipes below useuvxfor zero-install runs)
The recommended way to run the MCP server is via uvx, which fetches and runs
the latest release without polluting your global environment.
Add to your .claude.json or workspace .mcp.json:
{
"mcpServers": {
"plane": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/eyriehq/plane-plus-sdk-mcp.git",
"plane-mcp"
],
"env": {
"PLANE_BASE_URL": "https://plane.example.com",
"PLANE_API_KEY": "plane_api_...",
"PLANE_WORKSPACE_SLUG": "my-workspace"
}
}
}
}Restart Claude Code. Verify with /mcp — you should see plane listed with
its tools enabled. Try a prompt like:
List the work items in the "Engineering" project.
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)
or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"plane": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/eyriehq/plane-plus-sdk-mcp.git",
"plane-mcp"
],
"env": {
"PLANE_BASE_URL": "https://plane.example.com",
"PLANE_API_KEY": "plane_api_...",
"PLANE_WORKSPACE_SLUG": "my-workspace"
}
}
}
}Fully quit and relaunch Claude Desktop. The Plane tools appear under the hammer icon in the message composer.
Go to Settings → MCP → Add new MCP server and paste the equivalent JSON (same shape as above). Cursor picks it up automatically.
Any MCP-aware client can use the same command. The binary is plane-mcp,
installed as a [project.scripts] entry in the package metadata. If your
client expects stdio transport, that's what FastMCP exposes by default.
The examples above track main. For stability, pin to a tag:
"args": ["--from", "git+https://github.com/eyriehq/plane-plus-sdk-mcp.git@v1.0.0", "plane-mcp"]
Or to a specific commit:
"args": ["--from", "git+https://github.com/eyriehq/plane-plus-sdk-mcp.git@abcd123", "plane-mcp"]
To force a re-fetch after a new release: uvx --refresh --from ....
pip install git+https://github.com/eyriehq/plane-plus-sdk-mcp.gitOr with uv:
uv add git+https://github.com/eyriehq/plane-plus-sdk-mcp.gitfrom plane_sdk import PlaneClient
client = PlaneClient(
base_url="https://plane.example.com",
api_key="plane_api_...",
workspace_slug="my-workspace",
)
# Projects & work items
projects = client.list_projects()
project_id = projects[0]["id"]
work_item = client.create_work_item(
project_id,
name="Fix the metrics pipeline",
priority="high",
)
# Parent / child linking
epic = client.create_work_item(project_id, name="Q2 launch")
client.create_work_item(
project_id,
name="Ship GCP collector",
parent_id=epic["id"],
)
# Workspace wiki pages with markdown round-trip
page = client.create_workspace_page(
name="Launch plan",
description_html="# Goals\n\n- Fix metrics\n- Ship GCP",
content_format="markdown",
)
md = client.get_workspace_page(page["id"], response_format="markdown")
print(md["description_markdown"])The full resource surface:
| Mixin | Covers |
|---|---|
ProjectsMixin |
list, create, retrieve, update, delete projects |
WorkItemsMixin |
CRUD + parent_id for sub-items; comments; links; relations; activities |
StatesMixin |
CRUD for workflow states |
LabelsMixin |
CRUD for labels |
ModulesMixin |
CRUD + module/work-item association |
CyclesMixin |
CRUD + cycle/work-item association, transfer |
PagesMixin |
project-scoped pages with markdown round-trip |
WorkspacePagesMixin |
workspace-level wiki pages + folders |
MembersMixin |
workspace & project members |
IntakeMixin |
project intake / triage work items |
EpicsMixin |
first-class epics + analytics |
The MCP server reads its configuration from environment variables:
| Variable | Required | Example |
|---|---|---|
PLANE_BASE_URL |
yes | https://plane.example.com |
PLANE_API_KEY |
yes | plane_api_... |
PLANE_WORKSPACE_SLUG |
yes | my-workspace |
The SDK takes the same values as constructor arguments — no environment
reads. Integrators that want env-driven behavior can wrap PlaneClient
trivially:
import os
from plane_sdk import PlaneClient
client = PlaneClient(
base_url=os.environ["PLANE_BASE_URL"],
api_key=os.environ["PLANE_API_KEY"],
workspace_slug=os.environ["PLANE_WORKSPACE_SLUG"],
)In your Plane workspace:
- Click your avatar → Settings.
- Navigate to API tokens.
- Create a token with the scope you need. Copy the value — you can't view it again after this screen.
API tokens are workspace-scoped and inherit the creating user's permissions.
Clone, install in editable mode, and run the MCP server against your instance:
git clone https://github.com/eyriehq/plane-plus-sdk-mcp.git
cd plane-sdk-mcp
uv sync
export PLANE_BASE_URL=https://plane.example.com
export PLANE_API_KEY=plane_api_...
export PLANE_WORKSPACE_SLUG=my-workspace
uv run plane-mcpFor an MCP client to use your local checkout instead of the released version, point it at the directory:
{
"command": "uv",
"args": ["--directory", "/path/to/plane-sdk-mcp", "run", "plane-mcp"],
"env": { "PLANE_BASE_URL": "...", "PLANE_API_KEY": "...", "PLANE_WORKSPACE_SLUG": "..." }
}(to be added — PRs welcome)
Pull requests are welcome. For large changes, open an issue first to discuss scope.
By contributing, you agree that your contribution will be licensed under the Apache License 2.0 (see LICENSE).
Apache License 2.0. See LICENSE.
- Plane Plus — an AI-agent-first fork of Plane. This SDK is the most direct way to drive it.
- Plane — the upstream project this SDK is a client for. The core SDK surface works against any Plane instance.
- EyrieHQ — the observability platform that ships this SDK alongside Plane Plus.
Built by EyrieHQ.