plane-mcp-server
Click on "Deploy 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-mcp-server show me all projects in my workspace"
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 MCP Server
A Model Context Protocol (MCP) server for Plane integration. This server provides tools and resources for interacting with Plane through AI agents.
Features
🔧 Plane Integration: Interact with Plane APIs and services
🔌 Multiple Transports: Supports stdio, SSE, and streamable HTTP transports
🌐 Remote & Local: Works both locally and as a remote service
🛠️ Extensible: Easy to add new tools and resources
Related MCP server: claude-plane
Usage
The server supports three transport methods. We recommend using uvx as it doesn't require installation.
1. Stdio Transport (for local use)
MCP Client Configuration (using uvx - recommended):
{
"mcpServers": {
"plane": {
"command": "uvx",
"args": ["plane-mcp-server", "stdio"],
"env": {
"PLANE_API_KEY": "<your-api-key>",
"PLANE_WORKSPACE_SLUG": "<your-workspace-slug>",
"PLANE_BASE_URL": "https://api.plane.so"
}
}
}
}2. Remote HTTP Transport with OAuth
Connect to the hosted Plane MCP server using OAuth authentication.
URL: https://mcp.plane.so/http/mcp
MCP Client Configuration (for tools like Claude Desktop without native remote MCP support):
{
"mcpServers": {
"plane": {
"command": "npx",
"args": ["mcp-remote@latest", "https://mcp.plane.so/http/mcp"]
}
}
}Note: OAuth authentication will be handled automatically when connecting to the remote server.
3. Remote HTTP Transport using PAT Token
Connect to the hosted Plane MCP server using a Personal Access Token (PAT).
URL: https://mcp.plane.so/api-key/mcp
Headers:
Authorization: Bearer <PAT_TOKEN>X-Workspace-slug: <SLUG>
MCP Client Configuration (for tools like Claude Desktop without native remote MCP support):
{
"mcpServers": {
"plane": {
"command": "npx",
"args": ["mcp-remote@latest", "https://mcp.plane.so/http/api-key/mcp"],
"headers": {
"Authorization": "Bearer <PAT_TOKEN>",
"X-Workspace-slug": "<SLUG>"
}
}
}
}4. SSE Transport (Legacy)
⚠️ Legacy Transport: SSE (Server-Sent Events) transport is maintained for backward compatibility. New implementations should use the HTTP transport (sections 2 or 3) instead.
Connect to the hosted Plane MCP server using OAuth authentication via Server-Sent Events.
URL: https://mcp.plane.so/sse
MCP Client Configuration (for tools that support SSE transport):
{
"mcpServers": {
"plane": {
"command": "npx",
"args": ["mcp-remote@latest", "https://mcp.plane.so/sse"]
}
}
}Note: OAuth authentication will be handled automatically when connecting to the remote server. This transport is deprecated in favor of the HTTP transport.
Configuration
Authentication
The server requires authentication via environment variables:
PLANE_BASE_URL: Base URL for Plane API (default:https://api.plane.so) - OptionalPLANE_API_KEY: API key for authentication (required for stdio transport)PLANE_WORKSPACE_SLUG: Workspace slug identifier (required for stdio transport)PLANE_ACCESS_TOKEN: Access token for authentication (alternative to API key)
Example (for stdio transport):
export PLANE_BASE_URL="https://api.plane.so"
export PLANE_API_KEY="your-api-key"
export PLANE_WORKSPACE_SLUG="your-workspace-slug"Note: For remote HTTP transports (OAuth or PAT), authentication is handled via the connection method (OAuth flow or PAT headers) and does not require these environment variables.
Available Tools
The server provides comprehensive tools for interacting with Plane. 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 |
| Get features configuration 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 all cycles in a project |
| 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 |
| List archived cycles in a project |
| Add work items to a cycle |
| Remove a work item from a cycle |
| List work items in a cycle |
| Transfer work items from one cycle to another |
| Archive a cycle |
| Unarchive a cycle |
Modules
Tool Name | Description |
| List all modules in a project |
| 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 |
| List archived modules in a project |
| Add work items to a module |
| Remove a work item from a module |
| List work items in a module |
| Archive a module |
| 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 |
Users
Tool Name | Description |
| Get current authenticated user information |
Total Tools: 55+ tools across 8 categories
Development
Running Tests
pytestCode Formatting
black plane_mcp/
ruff check plane_mcp/License
MIT License - see LICENSE for details.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Deprecation Notice
⚠️ The Node.js-based plane-mcp-server is deprecated and no longer maintained.
This repository represents the new Python+FastMCP based implementation of the Plane MCP server. If you were using the previous Node.js version, please migrate to this Python-based version for continued support and updates.
The new implementation offers:
Better type safety with Pydantic models
Improved performance with FastMCP
Enhanced tool coverage
Active maintenance and development
For migration assistance, please refer to the configuration examples in this README or open an issue for support.
Old Node.js Configuration (Deprecated):
If you were using the previous Node.js-based @makeplane/plane-mcp-server, your configuration looked like this:
{
"mcpServers": {
"plane": {
"command": "npx",
"args": [
"-y",
"@makeplane/plane-mcp-server"
],
"env": {
"PLANE_API_KEY": "<YOUR_API_KEY>",
"PLANE_API_HOST_URL": "<HOST_URL_FOR_SELF_HOSTED>",
"PLANE_WORKSPACE_SLUG": "<YOUR_WORKSPACE_SLUG>"
}
}
}
}Please migrate to the new Python-based configuration shown in the Usage section above.
Available Tools
109 toolsadd_work_items_to_cycleC
Add work items to a cycle.
Inputs: project_id (required), cycle_id (required), issue_ids (required).
add_work_items_to_milestoneB
Add work items to a milestone.
Inputs: project_id (required), milestone_id (required), issue_ids (required).
add_work_items_to_moduleC
Add work items to a module.
Inputs: project_id (required), module_id (required), issue_ids (required).
archive_cycleC
Archive a cycle.
Inputs: project_id (required), cycle_id (required). Returns: result
archive_moduleC
Archive a module.
Inputs: project_id (required), module_id (required).
create_cycleC
Create a new cycle.
Inputs: project_id (required), name (required), owned_by (required), description, +5 more. Returns: Cycle model.
create_epicC
Create a new epic.
Inputs: project_id (required), name (required), assignees, labels, +13 more. Returns: Epic model.
create_initiativeC
Create a new initiative in the workspace.
Inputs: name (required), description_html, start_date, end_date, +3 more. Returns: Initiative model.
create_intake_work_itemB
Create a new intake work item in a project.
Inputs: project_id (required), data (required). Returns: Intake work item model.
create_labelC
Create a new label.
Inputs: project_id (required), name (required), color, description, +4 more. Returns: Label model.
create_milestoneC
Create a new milestone.
Inputs: project_id (required), title (required), target_date, external_source, +1 more. Returns: Milestone model.
create_moduleC
Create a new module.
Inputs: project_id (required), name (required), description, start_date, +6 more. Returns: Module model.
create_projectC
Create a new project.
Inputs: name (required), identifier (required), description, project_lead, +15 more. Returns: Project model.
create_project_pageC
Create a project page.
Inputs: project_id (required), name (required), description_html (required), access, +7 more. Returns: Page model.
create_stateC
Create a new state.
Inputs: project_id (required), name (required), color (required), description, +6 more. Returns: State model.
create_work_itemC
Create a new work item.
Inputs: project_id (required), name (required), assignees, labels, +15 more. Returns: Work item model.
create_work_item_commentC
Create a comment for a work item.
Inputs: project_id (required), work_item_id (required), comment_html, comment_json, +3 more. Returns: Work item comment model.
create_work_item_linkC
Create a link for a work item.
Inputs: project_id (required), work_item_id (required), url (required). Returns: Work item link model.
create_work_item_propertyB
Create a new work item property.
Inputs: project_id (required), type_id (required), display_name (required), property_type (required), +11 more. Returns: Work item property model.
create_work_item_relationC
Create relations for a work item.
Inputs: project_id (required), work_item_id (required), relation_type (required), issues (required).
create_work_item_typeC
Create a new work item type.
Inputs: project_id (required), name (required), description, project_ids, +4 more. Returns: Work item type model.
create_work_logB
Create a work log for a work item.
Inputs: project_id (required), work_item_id (required), duration, description. Returns: Work item work log model.
create_workspace_pageC
Create a workspace page.
Inputs: name (required), description_html (required), access, color, +6 more. Returns: Page model.
delete_cycleB
Delete a cycle by ID.
Inputs: project_id (required), cycle_id (required).
delete_epicC
Delete an epic by ID.
Inputs: project_id (required), epic_id (required).
delete_initiativeB
Delete an initiative by ID.
Inputs: initiative_id (required).
delete_intake_work_itemA
Delete an intake work item by work item ID.
Inputs: project_id (required), work_item_id (required).
delete_labelC
Delete a label by ID.
Inputs: project_id (required), label_id (required).
delete_milestoneB
Delete a milestone by ID.
Inputs: project_id (required), milestone_id (required).
delete_moduleB
Delete a module by ID.
Inputs: project_id (required), module_id (required).
delete_projectA
Delete a project by ID.
Inputs: project_id (required).
delete_stateC
Delete a state by ID.
Inputs: project_id (required), state_id (required).
delete_work_itemB
Delete a work item by ID.
Inputs: project_id (required), work_item_id (required).
delete_work_item_commentB
Delete a comment for a work item.
Inputs: project_id (required), work_item_id (required), comment_id (required).
delete_work_item_linkB
Delete a link for a work item.
Inputs: project_id (required), work_item_id (required), link_id (required).
delete_work_item_propertyC
Delete a work item property by ID.
Inputs: project_id (required), type_id (required), work_item_property_id (required).
delete_work_item_typeC
Delete a work item type by ID.
Inputs: project_id (required), work_item_type_id (required).
delete_work_logB
Delete a work log for a work item.
Inputs: project_id (required), work_item_id (required), work_log_id (required).
get_meA
Get current user information.
Returns: UserLite object containing current user information
Inputs: no named parameters. Returns: Lite user information.
get_project_featuresC
Get features of a project.
Inputs: project_id (required). Returns: Project feature model.
get_project_membersC
Get all members of a project.
Inputs: project_id (required), params. Returns: result
get_project_worklog_summaryB
Get work log summary for a project.
Inputs: project_id (required). Returns: result
get_workspace_featuresC
Get features of the current workspace.
Returns: WorkspaceFeature object containing feature flags
Inputs: no named parameters. Returns: Workspace feature model.
get_workspace_membersA
Get all members of the current workspace.
Returns: List of UserLite objects representing workspace members
Inputs: no named parameters. Returns: result
list_archived_cyclesB
List archived cycles in a project.
Inputs: project_id (required), params. Returns: result
list_archived_modulesA
List archived modules in a project.
Inputs: project_id (required), params. Returns: result
list_cyclesC
List all cycles in a project.
Inputs: project_id (required), params. Returns: result
list_cycle_work_itemsB
List work items in a cycle.
Inputs: project_id (required), cycle_id (required), params. Returns: result
list_epicsC
List all epics in a project.
Inputs: project_id (required), cursor, per_page. Returns: result
list_initiativesB
List all initiatives in a workspace.
Inputs: params. Returns: result
list_intake_work_itemsB
List all intake work items in a project.
Inputs: project_id (required), params. Returns: result
list_labelsC
List all labels in a project.
Inputs: project_id (required), params. Returns: result
list_milestonesB
List all milestones in a project.
Inputs: project_id (required), params. Returns: result
list_milestone_work_itemsC
List work items in a milestone.
Inputs: project_id (required), milestone_id (required), params. Returns: result
list_modulesC
List all modules in a project.
Inputs: project_id (required), params. Returns: result
list_module_work_itemsB
List work items in a module.
Inputs: project_id (required), module_id (required), params. Returns: result
list_projectsC
List all projects in a workspace.
Inputs: cursor, per_page, expand, fields, +1 more. Returns: result
list_statesB
List all states in a project.
Inputs: project_id (required), params. Returns: result
list_work_item_activitiesC
List activities for a work item.
Inputs: project_id (required), work_item_id (required), params. Returns: result
list_work_item_commentsC
List comments for a work item.
Inputs: project_id (required), work_item_id (required), params. Returns: result
list_work_item_linksA
List links for a work item.
Inputs: project_id (required), work_item_id (required), params. Returns: result
list_work_item_propertiesB
List work item properties for a work item type.
Inputs: project_id (required), type_id (required), params. Returns: result
list_work_item_relationsC
List relations for a work item.
Inputs: project_id (required), work_item_id (required). Returns: Response model for work item relations.
list_work_itemsA
List work items in a project or search across the workspace.
When any filter parameter is provided (assignee_ids, state_ids, state_groups, priorities, label_ids, type_ids, cycle_ids, module_ids, is_archived, created_by_ids, or query), this uses the advanced search endpoint which supports powerful filtering. Otherwise it uses the standard list endpoint.
Inputs: project_id, query, assignee_ids, state_ids, +17 more. Returns: result
list_work_item_typesB
List all work item types in a project.
Inputs: project_id (required), params. Returns: result
list_work_logsC
List work logs for a work item.
Inputs: project_id (required), work_item_id (required), params. Returns: result
remove_work_item_from_cycleB
Remove a work item from a cycle.
Inputs: project_id (required), cycle_id (required), work_item_id (required).
remove_work_item_from_moduleB
Remove a work item from a module.
Inputs: project_id (required), module_id (required), work_item_id (required).
remove_work_item_relationC
Remove a relation from a work item.
Inputs: project_id (required), work_item_id (required), related_issue (required).
remove_work_items_from_milestoneC
Remove work items from a milestone.
Inputs: project_id (required), milestone_id (required), issue_ids (required).
retrieve_cycleB
Retrieve a cycle by ID.
Inputs: project_id (required), cycle_id (required). Returns: Cycle model.
retrieve_epicC
Retrieve an epic by ID.
Inputs: project_id (required), epic_id (required). Returns: Epic model.
retrieve_initiativeB
Retrieve an initiative by ID.
Inputs: initiative_id (required). Returns: Initiative model.
retrieve_intake_work_itemC
Retrieve an intake work item by work item ID.
Inputs: project_id (required), work_item_id (required), params. Returns: Intake work item model.
retrieve_labelA
Retrieve a label by ID.
Inputs: project_id (required), label_id (required). Returns: Label model.
retrieve_milestoneB
Retrieve a milestone by ID.
Inputs: project_id (required), milestone_id (required). Returns: Milestone model.
retrieve_moduleC
Retrieve a module by ID.
Inputs: project_id (required), module_id (required). Returns: Module model.
retrieve_projectB
Retrieve a project by ID.
Inputs: project_id (required). Returns: Project model.
retrieve_project_pageC
Retrieve a project page by ID.
Inputs: project_id (required), page_id (required). Returns: Page model.
retrieve_stateA
Retrieve a state by ID.
Inputs: project_id (required), state_id (required). Returns: State model.
retrieve_work_itemC
Retrieve a work item by ID.
Inputs: project_id (required), work_item_id (required), expand, fields, +3 more. Returns: Detailed work item with expanded relationships.
retrieve_work_item_activityB
Retrieve a specific activity for a work item.
Inputs: project_id (required), work_item_id (required), activity_id (required). Returns: Work item activity model.
retrieve_work_item_by_identifierB
Retrieve a work item by project identifier and issue sequence number.
Inputs: project_identifier (required), issue_identifier (required), expand, fields, +3 more. Returns: Detailed work item with expanded relationships.
retrieve_work_item_commentB
Retrieve a specific comment for a work item.
Inputs: project_id (required), work_item_id (required), comment_id (required). Returns: Work item comment model.
retrieve_work_item_linkB
Retrieve a specific link for a work item.
Inputs: project_id (required), work_item_id (required), link_id (required). Returns: Work item link model.
retrieve_work_item_propertyC
Retrieve a work item property by ID.
Inputs: project_id (required), type_id (required), work_item_property_id (required). Returns: Work item property model.
retrieve_work_item_typeB
Retrieve a work item type by ID.
Inputs: project_id (required), work_item_type_id (required). Returns: Work item type model.
retrieve_workspace_pageC
Retrieve a workspace page by ID.
Inputs: page_id (required). Returns: Page model.
search_work_itemsC
Search work items across a workspace.
Inputs: query (required), expand, fields, external_id, +2 more. Returns: Work item search results.
transfer_cycle_work_itemsC
Transfer work items from one cycle to another.
Inputs: project_id (required), cycle_id (required), new_cycle_id (required).
unarchive_cycleB
Unarchive a cycle.
Inputs: project_id (required), cycle_id (required). Returns: result
unarchive_moduleB
Unarchive a module.
Inputs: project_id (required), module_id (required).
update_cycleC
Update a cycle by ID.
Inputs: project_id (required), cycle_id (required), name, description, +6 more. Returns: Cycle model.
update_epicB
Update an epic by ID.
Inputs: project_id (required), epic_id (required), name, assignees, +13 more. Returns: Epic model.
update_initiativeB
Update an initiative by ID.
Inputs: initiative_id (required), name, description_html, start_date, +4 more. Returns: Initiative model.
update_intake_work_itemC
Update an intake work item by work item ID.
Inputs: project_id (required), work_item_id (required), data (required). Returns: Intake work item model.
update_labelC
Update a label by ID.
Inputs: project_id (required), label_id (required), name, color, +5 more. Returns: Label model.
update_milestoneB
Update a milestone by ID.
Inputs: project_id (required), milestone_id (required), title, target_date, +2 more. Returns: Milestone model.
update_moduleC
Update a module by ID.
Inputs: project_id (required), module_id (required), name, description, +7 more. Returns: Module model.
update_projectB
Update a project by ID.
Inputs: project_id (required), name, description, project_lead, +19 more. Returns: Project model.
update_project_featuresC
Update features of a project.
Inputs: project_id (required), epics, modules, cycles, +4 more. Returns: Project feature model.
update_stateC
Update a state by ID.
Inputs: project_id (required), state_id (required), name, color, +7 more. Returns: State model.
update_work_itemC
Update a work item by ID.
Inputs: project_id (required), work_item_id (required), name, assignees, +16 more. Returns: Work item model.
update_work_item_commentC
Update a comment for a work item.
Inputs: project_id (required), work_item_id (required), comment_id (required), comment_html, +4 more. Returns: Work item comment model.
update_work_item_linkC
Update a link for a work item.
Inputs: project_id (required), work_item_id (required), link_id (required), url. Returns: Work item link model.
update_work_item_propertyB
Update a work item property by ID.
Inputs: project_id (required), type_id (required), work_item_property_id (required), display_name, +11 more. Returns: Work item property model.
update_work_item_typeB
Update a work item type by ID.
Inputs: project_id (required), work_item_type_id (required), name, description, +5 more. Returns: Work item type model.
update_work_logC
Update a work log for a work item.
Inputs: project_id (required), work_item_id (required), work_log_id (required), duration, +1 more. Returns: Work item work log model.
update_workspace_featuresB
Update features of the current workspace.
Inputs: project_grouping, initiatives, teams, customers, +2 more. Returns: Workspace feature model.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 109 tools
Several tools have overlapping boundaries: list_work_items already accepts module_ids/cycle_ids and can search across the workspace, duplicating list_module_work_items, list_cycle_work_items, and search_work_items. The additional split between get_* and retrieve_* methods, plus work_item_links vs work_item_relations, creates further ambiguity at this scale.
Most resources follow a consistent list_/create_/retrieve_/update_/delete_ CRUD pattern. Minor deviations exist: get_me, get_project_*, and get_workspace_* use get_ instead of retrieve_, and a few container actions are inconsistent in singular/plural phrasing.
At 109 tools, this is an extreme-sized MCP surface, far beyond the 3-15 tool sweet spot and well past the 25+ 'too many' threshold. Even if each endpoint maps to a real API operation, the tool count creates excessive selection overhead for agents.
Core resources like projects, work items, cycles, modules, epics, milestones, states, labels, and types have solid CRUD/lifecycle coverage. However, pages only have create/retrieve with no list/update/delete, and work item relations lack retrieve/update operations, leaving noticeable gaps.
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn 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.MIT
- FlicenseNot gradedqualityDmaintenanceMCP server and automation watcher for Plane project management, enabling Claude to interact with Plane via 40+ tools and auto-trigger on labeled issues.-
- AlicenseBqualityDmaintenanceAn MCP server that enables LLMs to fully manage a Plane workspace, including projects, work items, states, labels, cycles, modules, comments, and members.38MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for integrating AI agents with the Plane project management platform, providing tools to manage projects, work items, cycles, modules, and more.MIT