/ Directory / Playground / Plane MCP Server
● Official makeplane 🔑 Needs your key

Plane MCP Server

by makeplane · makeplane/plane-mcp-server

Plane's first-party MCP — full workspace control from your agent: 55+ tools across projects, work items, cycles, modules, initiatives, and more.

plane-mcp-server is the official MCP server from Plane. With an API key and workspace slug, agents can create and update projects, manage work items end-to-end (CRUD + search), run cycles and modules, steer workspace-level initiatives, triage the intake queue, configure custom work-item properties, and look up the current user. Supports stdio (local) via uvx, and also HTTP/remote transports with OAuth or PAT headers for hosted clients.

Why use it

Key features

Live Demo

What it looks like in practice

plane-mcp-server.replay ▶ ready
0/0

Install

Pick your client

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "plane-mcp-server": {
      "command": "uvx",
      "args": [
        "plane-mcp-server",
        "stdio"
      ],
      "env": {
        "PLANE_API_KEY": "<from Plane → Settings → API tokens>",
        "PLANE_WORKSPACE_SLUG": "your-workspace-slug",
        "PLANE_BASE_URL": "https://api.plane.so"
      }
    }
  }
}

Open Claude Desktop → Settings → Developer → Edit Config. Restart after saving.

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "plane-mcp-server": {
      "command": "uvx",
      "args": [
        "plane-mcp-server",
        "stdio"
      ],
      "env": {
        "PLANE_API_KEY": "<from Plane → Settings → API tokens>",
        "PLANE_WORKSPACE_SLUG": "your-workspace-slug",
        "PLANE_BASE_URL": "https://api.plane.so"
      }
    }
  }
}

Cursor uses the same mcpServers schema as Claude Desktop. Project config wins over global.

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "plane-mcp-server": {
      "command": "uvx",
      "args": [
        "plane-mcp-server",
        "stdio"
      ],
      "env": {
        "PLANE_API_KEY": "<from Plane → Settings → API tokens>",
        "PLANE_WORKSPACE_SLUG": "your-workspace-slug",
        "PLANE_BASE_URL": "https://api.plane.so"
      }
    }
  }
}

Click the MCP Servers icon in the Cline sidebar, then "Edit Configuration".

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "plane-mcp-server": {
      "command": "uvx",
      "args": [
        "plane-mcp-server",
        "stdio"
      ],
      "env": {
        "PLANE_API_KEY": "<from Plane → Settings → API tokens>",
        "PLANE_WORKSPACE_SLUG": "your-workspace-slug",
        "PLANE_BASE_URL": "https://api.plane.so"
      }
    }
  }
}

Same shape as Claude Desktop. Restart Windsurf to pick up changes.

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "plane-mcp-server",
      "command": "uvx",
      "args": [
        "plane-mcp-server",
        "stdio"
      ]
    }
  ]
}

Continue uses an array of server objects rather than a map.

~/.config/zed/settings.json
{
  "context_servers": {
    "plane-mcp-server": {
      "command": {
        "path": "uvx",
        "args": [
          "plane-mcp-server",
          "stdio"
        ]
      }
    }
  }
}

Add to context_servers. Zed hot-reloads on save.

claude mcp add plane-mcp-server -- uvx plane-mcp-server stdio

One-liner. Verify with claude mcp list. Remove with claude mcp remove.

Use Cases

Real-world ways to use Plane MCP Server

Triage the Plane intake queue from chat

👤 Team leads and PMs fielding incoming requests ⏱ ~15 min beginner

When to use: New requests land in intake; you want to bulk-classify and route them.

Prerequisites
  • Plane API key — Plane → Settings → API tokens → Create
  • Workspace slug — Look at the URL segment after /app/
Flow
  1. List intake items
    List the last 20 intake work items; I'll triage them.✓ Copied
    → Rows with id, title, submitter, age
  2. Classify + move
    For each: propose target project and label; after I confirm, accept into the project.✓ Copied
    → Accepts route items into the right project; rest stay in intake

Outcome: Fewer intake items, better routed, without opening the UI.

Pitfalls
  • Bulk-accepting without review — Always require human confirmation between classification and acceptance
Combine with: github · linear

Plan a sprint by moving items into the next cycle

👤 Engineering teams running Plane cycles ⏱ ~30 min intermediate

When to use: Cycle planning time; you need to pull the right items in and set estimates.

Flow
  1. Propose the cycle list
    Candidate items for Sprint 24 in project 'acme-api': anything labeled 'ready' with estimate ≤ 5.✓ Copied
    → Ranked, estimate-capped list
  2. Move them into the cycle
    After I confirm, add these work items to Sprint 24.✓ Copied
    → Cycle now contains the approved set
  3. Set the initiative link
    Associate the cycle with the 'Billing retries' initiative.✓ Copied
    → Initiative shows the cycle as a contributor

Outcome: Sprint staged in one pass, with initiative lineage captured.

Pitfalls
  • Estimate drift because Claude guessed values — Ask for items with existing estimates; don't let the agent invent points
Combine with: github

Create an initiative that spans multiple projects

👤 Staff-plus engineers or PMs coordinating across teams ⏱ ~25 min intermediate

When to use: A strategic effort crosses project boundaries and you want a workspace-level view.

Flow
  1. Create the initiative
    Create initiative 'Ship SOC 2 Type II' for Q3-Q4 2026.✓ Copied
    → Initiative ID returned
  2. Link contributing projects and items
    Link the 'platform' and 'billing' projects; pull in 6 compliance-labeled items from each.✓ Copied
    → Items tagged with the initiative

Outcome: Initiative dashboard populated with real work, not an empty container.

Combine with: notion

Add a custom 'risk' property to a project

👤 Teams enriching work items beyond the default fields ⏱ ~15 min intermediate

When to use: You need a field Plane doesn't provide out of the box.

Flow
  1. Create the property
    Add a custom property 'risk' (enum: low/med/high) to project 'acme-api'.✓ Copied
    → Property configured; visible in the UI
  2. Backfill values
    Set risk=med for all open items labeled 'unknown-scope'.✓ Copied
    → Items updated in bulk

Outcome: Richer data model without opening Plane settings manually.

Combinations

Pair with other MCPs for X10 leverage

plane-mcp-server + github

Link merged PRs back to the Plane work item they closed

When PR #412 merges, append the merge link to work item 'ACME-221' and set status to Done.✓ Copied
plane-mcp-server + linear

Mirror work: create Plane items from Linear issues, or vice versa

For each Linear issue labeled 'plane-mirror', create a matching Plane work item with the same title and description.✓ Copied
plane-mcp-server + notion

Push cycle summaries into Notion for stakeholder readouts

At sprint end, summarize Sprint 24 in Plane and post into the 'Eng Updates' Notion page.✓ Copied

Tools

What this MCP exposes

ToolInputsWhen to callCost
projects.* varies List/create/update projects and members 1 API call
work_items.* varies Full CRUD + search on work items 1 API call
cycles.* varies Manage sprints/cycles and their items 1 API call
modules.* varies Manage modules and transfers 1 API call
initiatives.* varies Workspace-level strategic planning 1 API call
intake.* varies Accept, reject, or route intake 1 API call
properties.* project_id + schema Custom property configuration 1 API call

Cost & Limits

What this costs to run

API quota
Bound by your Plane plan's API limits
Tokens per call
Small for most ops; large when fetching item descriptions with attachments
Monetary
Free — included with your Plane plan
Tip
List with narrow filters (labels, state, cycle) rather than fetching everything and filtering in Claude.

Security

Permissions, secrets, blast radius

Credential storage: PLANE_API_KEY belongs in env vars — never commit. Rotate from the Plane UI if leaked.
Data egress: Traffic goes to your configured PLANE_BASE_URL only (Plane Cloud or your self-hosted instance).

Troubleshooting

Common errors and fixes

401 Unauthorized

PLANE_API_KEY missing/expired, or wrong workspace. Regenerate the token.

Verify: curl -H 'X-API-Key: $PLANE_API_KEY' $PLANE_BASE_URL/api/v1/workspaces/
Workspace slug mismatch

PLANE_WORKSPACE_SLUG must exactly match the URL segment in /app/<slug>/.

Verify: Open Plane in the browser; copy the slug from the URL
Rate limit

Add pauses between bulk ops; Plane API rate-limits per workspace.

Verify: Inspect response headers for rate-limit fields

Alternatives

Plane MCP Server vs others

AlternativeWhen to use it insteadTradeoff
linearYour team lives in Linear, not PlaneDifferent tool, different shape
mondayYour team is on Monday.comDifferent data model
shrimp-task-managerYou just want a local task manager, not a full PM platformNo team collaboration

More

Resources

📖 Read the official README on GitHub

🐙 Browse open issues

🔍 Browse all 400+ MCP servers and Skills