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
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 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 |
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.
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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) |
Total Tools: 100+ tools across 20 categories
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.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- 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