Skip to main content
Glama
plane-mcp-server

plane-mcp-server

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) - Optional

  • PLANE_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_projects

List all projects in a workspace with optional pagination and filtering

create_project

Create a new project with name, identifier, and optional configuration

retrieve_project

Retrieve a project by ID

update_project

Update a project with partial data

delete_project

Delete a project by ID

get_project_worklog_summary

Get work log summary for a project

get_project_members

Get all members of a project

get_project_features

Get features configuration of a project

update_project_features

Update features configuration of a project

Work Items

Tool Name

Description

list_work_items

List all work items in a project with optional filtering and pagination

create_work_item

Create a new work item with name, assignees, labels, and other attributes

retrieve_work_item

Retrieve a work item by ID with optional field expansion

retrieve_work_item_by_identifier

Retrieve a work item by project identifier and issue sequence number

update_work_item

Update a work item with partial data

delete_work_item

Delete a work item by ID

search_work_items

Search work items across a workspace with query string

Cycles

Tool Name

Description

list_cycles

List all cycles in a project

create_cycle

Create a new cycle with name, dates, and owner

retrieve_cycle

Retrieve a cycle by ID

update_cycle

Update a cycle with partial data

delete_cycle

Delete a cycle by ID

list_archived_cycles

List archived cycles in a project

add_work_items_to_cycle

Add work items to a cycle

remove_work_item_from_cycle

Remove a work item from a cycle

list_cycle_work_items

List work items in a cycle

transfer_cycle_work_items

Transfer work items from one cycle to another

archive_cycle

Archive a cycle

unarchive_cycle

Unarchive a cycle

Modules

Tool Name

Description

list_modules

List all modules in a project

create_module

Create a new module with name, dates, status, and members

retrieve_module

Retrieve a module by ID

update_module

Update a module with partial data

delete_module

Delete a module by ID

list_archived_modules

List archived modules in a project

add_work_items_to_module

Add work items to a module

remove_work_item_from_module

Remove a work item from a module

list_module_work_items

List work items in a module

archive_module

Archive a module

unarchive_module

Unarchive a module

Initiatives

Tool Name

Description

list_initiatives

List all initiatives in a workspace

create_initiative

Create a new initiative with name, dates, state, and lead

retrieve_initiative

Retrieve an initiative by ID

update_initiative

Update an initiative with partial data

delete_initiative

Delete an initiative by ID

Intake Work Items

Tool Name

Description

list_intake_work_items

List all intake work items in a project with optional pagination

create_intake_work_item

Create a new intake work item in a project

retrieve_intake_work_item

Retrieve an intake work item by work item ID with optional field expansion

update_intake_work_item

Update an intake work item with partial data

delete_intake_work_item

Delete an intake work item by work item ID

Work Item Properties

Tool Name

Description

list_work_item_properties

List work item properties for a work item type

create_work_item_property

Create a new work item property with type, settings, and validation rules

retrieve_work_item_property

Retrieve a work item property by ID

update_work_item_property

Update a work item property with partial data

delete_work_item_property

Delete a work item property by ID

Users

Tool Name

Description

get_me

Get current authenticated user information

Total Tools: 55+ tools across 8 categories

Development

Running Tests

pytest

Code 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 tools
add_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_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_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_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_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_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

    C2.6/5.0

    Scored across 109 tools

    Disambiguation2/5

    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.

    Naming Consistency4/5

    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.

    Tool Count1/5

    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.

    Completeness3/5

    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

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      An 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
    • F
      license
      Not graded
      quality
      D
      maintenance
      MCP server and automation watcher for Plane project management, enabling Claude to interact with Plane via 40+ tools and auto-trigger on labeled issues.
      -
    • A
      license
      B
      quality
      D
      maintenance
      An MCP server that enables LLMs to fully manage a Plane workspace, including projects, work items, states, labels, cycles, modules, comments, and members.
      38
      MIT