plane-ce-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@plane-ce-mcplist all tasks in the current cycle"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
plane-ce-mcp
Unofficial MCP server for self-hosted Plane (Community Edition).
A Model Context Protocol server exposing Plane's project management API as MCP tools, built for people who run Plane themselves. Based on makeplane/plane-mcp-server (MIT). Not affiliated with Plane / makeplane.
Why this exists
The upstream server targets Plane Cloud. Run it against a self-hosted Community Edition instance and you hit missing "lite" endpoints, raw SDK stack traces on every 404, and no pages support. This project fixes what upstream didn't:
Central compatibility layer (plane_mcp/compat.py): every Plane API error becomes an actionable message - missing endpoint vs missing resource vs auth vs timeout. No raw SDK exceptions reach the MCP client.
Transparent endpoint fallbacks: lite endpoints absent on CE fall back to the full endpoints (projects, cycles, modules, project/workspace members), with the fallback logged for diagnosability.
PAT-only HTTP mode: the HTTP transport runs without any OAuth configuration - header auth alone (
/http/api-key/mcp).Pages tools on CE: list/retrieve/search/create pages via Plane's internal API (CE has no public pages API), with content truncation for LLM-sized outputs.
Documented CE vs Cloud differences: docs/plane-api-compat.md.
May still work against Plane Cloud - untested, unmaintained, not a goal.
Related MCP server: plane-mcp-server
Quick start
Requirements: Python 3.10+ and uv. No clone, no
install - uvx runs the server straight from GitHub.
1. Get your credentials from Plane:
API key: Plane → Workspace Settings → API tokens → create token
Workspace slug: the part of your Plane URL after the host (
https://plane.your-domain.tld/<slug>/)
2. Smoke-test the server (optional, confirms connectivity):
PLANE_API_KEY=<your-api-key> \
PLANE_WORKSPACE_SLUG=<your-workspace-slug> \
PLANE_BASE_URL=https://plane.your-domain.tld \
uvx --from git+https://github.com/Bl4nk44/plane-ce-mcp plane-ce-mcp stdioServer starts and waits for MCP messages on stdin - Ctrl+C to exit. Errors at this point mean wrong URL or key, not a client problem.
3. Add to your MCP client (Claude Code, Claude Desktop, Cursor, ...):
{
"mcpServers": {
"plane": {
"command": "uvx",
"args": ["--from", "git+https://github.com/Bl4nk44/plane-ce-mcp", "plane-ce-mcp", "stdio"],
"env": {
"PLANE_API_KEY": "<your-api-key>",
"PLANE_WORKSPACE_SLUG": "<your-workspace-slug>",
"PLANE_BASE_URL": "https://plane.your-domain.tld"
}
}
}
}For Claude Code that's one command:
claude mcp add plane \
-e PLANE_API_KEY=<your-api-key> \
-e PLANE_WORKSPACE_SLUG=<your-workspace-slug> \
-e PLANE_BASE_URL=https://plane.your-domain.tld \
-- uvx --from git+https://github.com/Bl4nk44/plane-ce-mcp plane-ce-mcp stdioPLANE_BASE_URL must point at your instance's API - the default is Plane Cloud
(https://api.plane.so), so self-host setups must set it.
Run from source
git clone https://github.com/Bl4nk44/plane-ce-mcp.git
cd plane-ce-mcp
uv pip install -e .
PLANE_API_KEY=... PLANE_WORKSPACE_SLUG=... PLANE_BASE_URL=... python -m plane_mcp stdioHTTP transport (self-hosted, PAT auth)
Run the server next to your Plane instance (port 8211):
PLANE_BASE_URL=https://plane.your-domain.tld python -m plane_mcp httpConnect with a Personal Access Token - no OAuth setup required:
URL: http://<server>:8211/http/api-key/mcp
Headers:
Authorization: Bearer <PAT_TOKEN>(orx-api-key: <PAT_TOKEN>)X-Workspace-slug: <SLUG>
{
"mcpServers": {
"plane": {
"command": "npx",
"args": ["mcp-remote@latest", "http://<server>:8211/http/api-key/mcp"],
"headers": {
"Authorization": "Bearer <PAT_TOKEN>",
"X-Workspace-slug": "<SLUG>"
}
}
}
}An OAuth endpoint (/oauth/mcp) and a legacy SSE transport also exist for setups
with a configured Plane OAuth app - see Configuration. Deployment
recipes (Docker Compose, Caddy, Tailscale) live in deploy/ and
docs/tailscale-deployment.md.
Configuration
Variable | Required for | Purpose |
| all (self-host: required) | Your Plane API URL (default: |
| stdio | API key (workspace settings → API tokens) |
| stdio | Target workspace |
| http/sse (optional) | Internal URL for server-to-server calls (e.g. |
| pages tools | Plane account used by the internal-API adapter (CE has no public pages API); the account needs membership in the relevant projects |
| optional (default: | Comma-separated tool groups to register: |
| optional (default: | Size cap for |
| optional (default: | Retries after the first attempt for transient Plane API failures (429/503 for any call; 502/504/timeouts for read-only calls only, to avoid duplicate writes). |
| optional (default: | Base seconds for exponential backoff with jitter between retries (capped at 10s). |
| optional | Default truncation for |
| http/sse (optional) | Token storage (falls back to in-memory) |
| http/sse OAuth only | OAuth client credentials and base URL |
| http/sse OAuth (optional) | Comma-separated redirect URI patterns appended to the built-in allowlist |
| optional (default: | When |
| optional (default: | When |
Logging
The server emits structured JSON logs. Each tool call is logged with its tool name, duration, status, and (when available) the opaque user id and workspace slug. Endpoint fallbacks are logged when they trigger (which endpoint failed, which was used instead), so CE quirks are diagnosable from logs.
Health check
In HTTP mode the server exposes an unauthenticated GET /healthz returning
{"status": "ok", "server_version": ...}. It reports the server's own liveness
and does not call Plane, so a Plane outage never marks the MCP server unhealthy.
The Docker image ships a HEALTHCHECK against it.
Available Tools
All tools use Pydantic models from the Plane SDK for type safety and validation.
Projects
Tool Name | Description |
| List all projects in a workspace with optional pagination and filtering |
| Create a new project with name, identifier, and optional configuration |
| Retrieve a project by ID |
| Update a project with partial data |
| Delete a project by ID |
| Get work log summary for a project |
| Get all members of a project |
| Update features configuration of a project |
| Archive or unarchive a project |
Work Items
Tool Name | Description |
| List all work items in a project with optional filtering and pagination |
| Create a new work item with name, assignees, labels, and other attributes |
| Retrieve a work item by ID with optional field expansion |
| Retrieve a work item by project identifier and issue sequence number |
| Update a work item with partial data |
| Delete a work item by ID |
| Search work items across a workspace with query string |
| Count work items across the workspace with optional grouping |
| List archived work items in a project with optional PQL filtering |
| Archive or unarchive a work item |
| Add or remove a single assignee without replacing the full list |
| Add or remove a single label without replacing the full list |
Cycles
Tool Name | Description |
| List cycles in a project (set |
| Create a new cycle with name, dates, and owner |
| Retrieve a cycle by ID |
| Update a cycle with partial data |
| Delete a cycle by ID |
| Add and/or remove work items on a cycle |
| List work items in a cycle |
| Transfer work items from one cycle to another |
| Archive or unarchive a cycle |
| Complete (close) a cycle by setting its end date to today |
Modules
Tool Name | Description |
| List modules in a project (set |
| Create a new module with name, dates, status, and members |
| Retrieve a module by ID |
| Update a module with partial data |
| Delete a module by ID |
| Add and/or remove work items on a module |
| List work items in a module |
| Archive or unarchive a module |
Initiatives
Tool Name | Description |
| List all initiatives in a workspace |
| Create a new initiative with name, dates, state, and lead |
| Retrieve an initiative by ID |
| Update an initiative with partial data |
| Delete an initiative by ID |
| List projects linked to an initiative |
| Link or unlink projects of an initiative |
Intake Work Items
Tool Name | Description |
| List all intake work items in a project with optional pagination |
| Create a new intake work item in a project |
| Retrieve an intake work item by work item ID with optional field expansion |
| Update an intake work item with partial data |
| Delete an intake work item by work item ID |
Work Item Properties
Tool Name | Description |
| List work item properties for a work item type |
| Create a new work item property with type, settings, and validation rules |
| Retrieve a work item property by ID |
| Update a work item property with partial data |
| Delete a work item property by ID |
| List options for a work item property |
| Create an option on a work item property |
| Retrieve a single option from a work item property |
| Update an option on a work item property |
| Delete an option from a work item property |
| Get the value(s) of a custom property on a work item |
| Set (create or update) the value of a custom property on a work item |
| Delete the value(s) of a custom property on a work item |
Milestones
Tool Name | Description |
| List all milestones in a project |
| Create a new milestone |
| Retrieve a milestone by ID |
| Update a milestone by ID |
| Delete a milestone by ID |
| Add and/or remove work items on a milestone |
| List work items in a milestone |
Labels
Tool Name | Description |
| List all labels in a project |
| Create a new label |
| Retrieve a label by ID |
| Update a label by ID |
| Delete a label by ID |
States
Tool Name | Description |
| List all states in a project |
| Create a new state |
| Retrieve a state by ID |
| Update a state by ID |
| Delete a state by ID |
Work Item Comments
Tool Name | Description |
| List comments for a work item |
| Retrieve a specific comment for a work item |
| Create a comment for a work item |
| Update a comment for a work item |
| Delete a comment for a work item |
Work Item Links
Tool Name | Description |
| List links for a work item |
| Retrieve a specific link for a work item |
| Create a link for a work item |
| Update a link for a work item |
| Delete a link for a work item |
Work Item Types
Tool Name | Description |
| List all work item types in a project |
| Create a new work item type |
| Retrieve a work item type by ID |
| Update a work item type by ID |
| Delete a work item type by ID |
| Bulk-link workspace-level work item types to a project |
| Find or create a named type for a project, auto-handling workspace vs project scope and import |
| Attach or detach properties on a work item type in a single call |
Work Item Relations
Tool Name | Description |
| List relations for a work item |
| Create relations for a work item |
| Remove a relation from a work item |
Work Item Relation Definitions
Tool Name | Description |
| List workspace custom relation definitions |
| Create a workspace relation definition |
| Update a relation definition |
| Delete a relation definition |
Work Item Activities
Tool Name | Description |
| List activities for a work item |
| Retrieve a specific activity for a work item |
Work Logs
Tool Name | Description |
| List work logs for a work item |
| Create a work log for a work item |
| Update a work log for a work item |
| Delete a work log for a work item |
Pages
Tool Name | Description |
| List pages - metadata only (workspace, or a project's if |
| Retrieve a page incl. content; optional |
| Search pages by title, optionally inside content (client-side, case-insensitive) |
| Create a workspace or project page |
| Link a page to a work item |
| Remove a page link from a work item |
| List all pages linked to a work item |
Work Item Attachments
Tool Name | Description |
| List all attachments for a work item |
| Get a presigned download URL for a work item attachment |
| Fetch an attachment's content so the LLM can read or analyze it |
| Fetch a file from a public URL and attach it to a work item |
| Delete an attachment from a work item |
Estimates
Tool Name | Description |
| Get the estimate configuration for a project |
| Create a new estimate for a project |
| Update the estimate for a project |
| Delete the estimate for a project |
| Link an estimate to a project, making it the active estimate system |
| List all valid estimate points for a project |
| Create estimate points for a project estimate |
| Update a single estimate point |
| Delete a single estimate point |
Roles
Tool Name | Description |
| List role definitions in the workspace |
| Retrieve a role definition by ID |
PQL
Tool Name | Description |
| Return the Plane Query Language (PQL) syntax reference (also exposed as the |
Workspaces
Tool Name | Description |
| Get all members of the current workspace |
| Get feature flags (workspace, or a project's if |
| Update features of the current workspace |
Users
Tool Name | Description |
| Get current authenticated user information |
Instance
Tool Name | Description |
| Get edition/version of the connected Plane instance and its known API limitations (e.g. Community Edition) |
| List the tool groups (toolsets) this server supports and which are active |
Total Tools: 142 tools across 24 categories (scripts/check_tool_docs.py keeps these tables in sync)
Development
# Install (uses uv)
uv pip install -e ".[dev]"
# Tests
pytest
# Format + lint
ruff format plane_mcp/
ruff check plane_mcp/Integration tests run against a live Plane instance - copy .env.test to
.env.test.local with real values, then export $(cat .env.test.local | xargs) && pytest tests/ -v.
Attribution & License
MIT License - see LICENSE.
Based on makeplane/plane-mcp-server (MIT, © 2025 Plane MCP Server Contributors). This is an independent, unofficial project: not affiliated with, endorsed by, or supported by Plane / makeplane. "Plane" is a trademark of its respective owner.
Contributing
Contributions welcome - especially fixes for self-hosted Community Edition quirks. See CONTRIBUTING.md.
Maintenance
Related MCP Servers
- Alicense-qualityDmaintenanceAn MCP server for the Plane project management platform that enables users to manage workspaces, projects, and work items. It supports full CRUD operations for issues while providing access to cycles, modules, labels, and workflow states.Last updatedMIT
- AlicenseBqualityDmaintenanceMCP server for Plane integration, enabling AI agents to interact with Plane APIs and services for project management tasks.Last updated100MIT
- Alicense-qualityCmaintenanceAn MCP server that enables LLMs to fully manage a Plane workspace, including projects, work items, states, labels, cycles, modules, comments, and members.Last updatedMIT
- Alicense-qualityCmaintenanceMCP server for integrating AI agents with the Plane project management platform, providing tools to manage projects, work items, cycles, modules, and more.Last updatedMIT
Related MCP Connectors
MCP server for generating rough-draft project plans from natural-language prompts.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Official MCP server for Qase — manage test cases, runs, suites, defects via AI tools.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Bl4nk44/plane-ce-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server