plane-mcp-server-ce 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- plane_mcp_server_ce-0.3.0/LICENSE +22 -0
- plane_mcp_server_ce-0.3.0/PKG-INFO +498 -0
- plane_mcp_server_ce-0.3.0/README.md +472 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/__init__.py +1 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/__main__.py +208 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/auth/__init__.py +7 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/auth/plane_header_auth_provider.py +73 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/auth/plane_oauth_provider.py +374 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/aws_secrets.py +102 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/ce_compat.py +87 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/client.py +74 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/instructions.py +13 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/middleware.py +21 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/server.py +95 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/storage.py +166 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/__init__.py +146 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/cycles.py +402 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/initiatives.py +266 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/intake.py +173 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/labels.py +154 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/milestones.py +202 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/modules.py +334 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/pages.py +201 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/pql.py +34 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/pql_reference.py +345 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/projects.py +676 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/roles.py +56 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/states.py +177 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/users.py +21 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/work_item_activities.py +73 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/work_item_attachments.py +378 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/work_item_comments.py +188 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/work_item_links.py +149 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/work_item_properties.py +720 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/work_item_relation_definitions.py +147 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/work_item_relations.py +98 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/work_item_types.py +289 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/work_items.py +689 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/work_logs.py +130 -0
- plane_mcp_server_ce-0.3.0/plane_mcp/tools/workspaces.py +145 -0
- plane_mcp_server_ce-0.3.0/plane_mcp_server_ce.egg-info/PKG-INFO +498 -0
- plane_mcp_server_ce-0.3.0/plane_mcp_server_ce.egg-info/SOURCES.txt +51 -0
- plane_mcp_server_ce-0.3.0/plane_mcp_server_ce.egg-info/dependency_links.txt +1 -0
- plane_mcp_server_ce-0.3.0/plane_mcp_server_ce.egg-info/entry_points.txt +2 -0
- plane_mcp_server_ce-0.3.0/plane_mcp_server_ce.egg-info/requires.txt +12 -0
- plane_mcp_server_ce-0.3.0/plane_mcp_server_ce.egg-info/top_level.txt +1 -0
- plane_mcp_server_ce-0.3.0/pyproject.toml +64 -0
- plane_mcp_server_ce-0.3.0/setup.cfg +4 -0
- plane_mcp_server_ce-0.3.0/tests/test_aws_secrets.py +482 -0
- plane_mcp_server_ce-0.3.0/tests/test_ce_tool_filtering.py +40 -0
- plane_mcp_server_ce-0.3.0/tests/test_integration.py +420 -0
- plane_mcp_server_ce-0.3.0/tests/test_oauth_security.py +239 -0
- plane_mcp_server_ce-0.3.0/tests/test_stateless_http.py +105 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Plane MCP Server Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: plane-mcp-server-ce
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Community Edition and self-hosted focused MCP server for Plane
|
|
5
|
+
Author-email: Surya Prashanth <surya.prashanth@plane.so>, Plane Engineering <support@plane.so>, tancou <commun@app.optimis.io>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/tancou/plane-mcp-server-ce
|
|
8
|
+
Project-URL: Repository, https://github.com/tancou/plane-mcp-server-ce
|
|
9
|
+
Project-URL: Issues, https://github.com/tancou/plane-mcp-server-ce/issues
|
|
10
|
+
Keywords: mcp,plane,fastmcp,ai,automation
|
|
11
|
+
Requires-Python: >=3.10
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: fastmcp==3.2.0
|
|
15
|
+
Requires-Dist: plane-sdk==0.2.19
|
|
16
|
+
Requires-Dist: py-key-value-aio[redis]<0.5.0,>=0.4.4
|
|
17
|
+
Requires-Dist: mcp==1.26.0
|
|
18
|
+
Requires-Dist: PyJWT>=2.12.0
|
|
19
|
+
Requires-Dist: authlib>=1.6.9
|
|
20
|
+
Requires-Dist: boto3>=1.34.0
|
|
21
|
+
Requires-Dist: fakeredis[lua]<2.35.0,>=2.32.1
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
24
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
25
|
+
Dynamic: license-file
|
|
26
|
+
|
|
27
|
+
# Plane MCP Server CE
|
|
28
|
+
|
|
29
|
+
> [!IMPORTANT]
|
|
30
|
+
> ## Community Edition and self-hosted first
|
|
31
|
+
>
|
|
32
|
+
> This fork exists to provide the broadest possible MCP compatibility with the
|
|
33
|
+
> free, self-hosted **Plane Community Edition**. It is not intended for upstream
|
|
34
|
+
> contribution: its focus is making every capability that CE actually exposes
|
|
35
|
+
> usable by AI agents, while keeping Cloud-only and paid features out of their
|
|
36
|
+
> tool list.
|
|
37
|
+
>
|
|
38
|
+
> Issues and pull requests that improve Plane CE or self-hosted compatibility
|
|
39
|
+
> are warmly welcome. Contributions authored with AI coding agents are welcome
|
|
40
|
+
> too, provided they are clean, reviewed, and remain aligned with this CE and
|
|
41
|
+
> self-hosted focus.
|
|
42
|
+
|
|
43
|
+
A Model Context Protocol (MCP) server for Plane integration. This package is
|
|
44
|
+
published on PyPI as `plane-mcp-server-ce` and provides tools and resources for
|
|
45
|
+
interacting with self-hosted Plane CE through AI agents.
|
|
46
|
+
|
|
47
|
+
## Features
|
|
48
|
+
|
|
49
|
+
* 🔧 **Plane Integration**: Interact with Plane APIs and services
|
|
50
|
+
* 🔌 **Multiple Transports**: Supports stdio, SSE, and streamable HTTP transports
|
|
51
|
+
* 🌐 **Remote & Local**: Works both locally and as a remote service
|
|
52
|
+
* 🛠️ **Extensible**: Easy to add new tools and resources
|
|
53
|
+
|
|
54
|
+
## Usage
|
|
55
|
+
|
|
56
|
+
The server supports three transport methods. **We recommend using `uvx`** as it doesn't require installation.
|
|
57
|
+
|
|
58
|
+
**Requirements**:
|
|
59
|
+
- **Python 3.10+** (for stdio transport, via `uvx`)
|
|
60
|
+
- **Node.js 22+** (for remote transports, via `npx`)
|
|
61
|
+
|
|
62
|
+
### 1. Stdio Transport (for local use)
|
|
63
|
+
|
|
64
|
+
**MCP Client Configuration** (using uvx - recommended):
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"mcpServers": {
|
|
69
|
+
"plane": {
|
|
70
|
+
"command": "uvx",
|
|
71
|
+
"args": ["plane-mcp-server-ce", "stdio"],
|
|
72
|
+
"env": {
|
|
73
|
+
"PLANE_API_KEY": "<your-api-key>",
|
|
74
|
+
"PLANE_WORKSPACE_SLUG": "<your-workspace-slug>",
|
|
75
|
+
"PLANE_BASE_URL": "https://<your-self-hosted-plane-url>",
|
|
76
|
+
"PLANE_MCP_EDITION": "community"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 2. Remote HTTP Transport with OAuth
|
|
84
|
+
|
|
85
|
+
Connect to the hosted Plane MCP server using OAuth authentication.
|
|
86
|
+
|
|
87
|
+
**URL**: `https://mcp.plane.so/http/mcp`
|
|
88
|
+
|
|
89
|
+
**MCP Client Configuration** (for tools like Claude Desktop without native remote MCP support):
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"mcpServers": {
|
|
94
|
+
"plane": {
|
|
95
|
+
"command": "npx",
|
|
96
|
+
"args": ["mcp-remote@latest", "https://mcp.plane.so/http/mcp"]
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Note**: OAuth authentication will be handled automatically when connecting to the remote server.
|
|
103
|
+
|
|
104
|
+
### 3. Remote HTTP Transport using PAT Token
|
|
105
|
+
|
|
106
|
+
Connect to the hosted Plane MCP server using a Personal Access Token (PAT).
|
|
107
|
+
|
|
108
|
+
**URL**: `https://mcp.plane.so/http/api-key/mcp`
|
|
109
|
+
|
|
110
|
+
**Headers**:
|
|
111
|
+
- `Authorization: Bearer <PAT_TOKEN>`
|
|
112
|
+
- `X-Workspace-slug: <SLUG>`
|
|
113
|
+
|
|
114
|
+
**MCP Client Configuration** (for tools like Claude Desktop without native remote MCP support):
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"mcpServers": {
|
|
119
|
+
"plane": {
|
|
120
|
+
"command": "npx",
|
|
121
|
+
"args": ["mcp-remote@latest", "https://mcp.plane.so/http/api-key/mcp"],
|
|
122
|
+
"headers": {
|
|
123
|
+
"Authorization": "Bearer <PAT_TOKEN>",
|
|
124
|
+
"X-Workspace-slug": "<SLUG>"
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 4. SSE Transport (Legacy)
|
|
132
|
+
|
|
133
|
+
⚠️ **Legacy Transport**: SSE (Server-Sent Events) transport is maintained for backward compatibility. New implementations should use the HTTP transport (sections 2 or 3) instead.
|
|
134
|
+
|
|
135
|
+
Connect to the hosted Plane MCP server using OAuth authentication via Server-Sent Events.
|
|
136
|
+
|
|
137
|
+
**URL**: `https://mcp.plane.so/sse`
|
|
138
|
+
|
|
139
|
+
**MCP Client Configuration** (for tools that support SSE transport):
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"mcpServers": {
|
|
144
|
+
"plane": {
|
|
145
|
+
"command": "npx",
|
|
146
|
+
"args": ["mcp-remote@latest", "https://mcp.plane.so/sse"]
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Note**: OAuth authentication will be handled automatically when connecting to the remote server. This transport is deprecated in favor of the HTTP transport.
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
## Configuration
|
|
156
|
+
|
|
157
|
+
### Authentication
|
|
158
|
+
|
|
159
|
+
The server requires authentication via environment variables:
|
|
160
|
+
|
|
161
|
+
- `PLANE_BASE_URL`: Base URL for Plane API (default: `https://api.plane.so`) - Optional
|
|
162
|
+
- `PLANE_API_KEY`: API key for authentication (required for stdio transport)
|
|
163
|
+
- `PLANE_WORKSPACE_SLUG`: Workspace slug identifier (required for stdio transport)
|
|
164
|
+
- `PLANE_ACCESS_TOKEN`: Access token for authentication (alternative to API key)
|
|
165
|
+
- `PLANE_MCP_EDITION`: Tool discovery mode: `community` (or `ce`) exposes only
|
|
166
|
+
tools verified against Plane CE; `cloud` (or `all`) exposes the complete SDK
|
|
167
|
+
surface; `auto` is the default and treats a configured non-`*.plane.so` API
|
|
168
|
+
URL as self-hosted. Set `community` explicitly for predictable self-hosted
|
|
169
|
+
deployments, especially if you use a custom Cloud domain.
|
|
170
|
+
|
|
171
|
+
**Example** (for stdio transport):
|
|
172
|
+
```bash
|
|
173
|
+
export PLANE_BASE_URL="https://api.plane.so"
|
|
174
|
+
export PLANE_API_KEY="your-api-key"
|
|
175
|
+
export PLANE_WORKSPACE_SLUG="your-workspace-slug"
|
|
176
|
+
export PLANE_MCP_EDITION="community"
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**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.
|
|
180
|
+
|
|
181
|
+
### OAuth redirect URIs
|
|
182
|
+
|
|
183
|
+
For the OAuth HTTP/SSE transports, the server validates each client's redirect URI against an allowlist. Common MCP clients (Cursor, VS Code, Claude.ai, ChatGPT connectors, localhost) are allowed by default.
|
|
184
|
+
|
|
185
|
+
To onboard a new client without a code change or release, append extra patterns via an environment variable:
|
|
186
|
+
|
|
187
|
+
- `PLANE_OAUTH_ALLOWED_REDIRECT_URIS`: Comma-separated redirect URI patterns appended to the built-in allowlist.
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
export PLANE_OAUTH_ALLOWED_REDIRECT_URIS="https://newclient.com/cb,https://other.app/oauth/*"
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Patterns support glob matching (`*` matches any port, path segment, or subdomain). For security, keep the host pinned and wildcard only the port/path.
|
|
194
|
+
|
|
195
|
+
### Logging
|
|
196
|
+
|
|
197
|
+
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.
|
|
198
|
+
|
|
199
|
+
- `LOG_USER_INFO`: When `true`, include user info (PII such as the display name) in logs alongside the opaque user id. Defaults to `false` so PII is never logged unless explicitly opted in. Only the OAuth and PAT (header) HTTP transports carry a display name; stdio is unaffected.
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
export LOG_USER_INFO="true"
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Available Tools
|
|
206
|
+
|
|
207
|
+
The server provides comprehensive tools for interacting with Plane. All tools use Pydantic models from the Plane SDK for type safety and validation.
|
|
208
|
+
|
|
209
|
+
### Community Edition availability
|
|
210
|
+
|
|
211
|
+
Set `PLANE_MCP_EDITION=community` to prevent unavailable tools from being
|
|
212
|
+
advertised to an agent. This keeps the MCP tool list focused on functionality
|
|
213
|
+
that exists on the free, self-hosted edition instead of returning cryptic 404
|
|
214
|
+
errors. The detailed endpoint evidence is maintained in [CE_COMPAT.md](CE_COMPAT.md).
|
|
215
|
+
|
|
216
|
+
| Capability group | Available in CE mode | Notes |
|
|
217
|
+
|---|---:|---|
|
|
218
|
+
| Projects, members, cycles, modules, labels, states, intake items | Yes | CE-compatible endpoints, including the CE fallback for `*-lite` lists. |
|
|
219
|
+
| Work items, search, activities, comments, links, attachments | Yes | Detail reads automatically expand assignees and labels. |
|
|
220
|
+
| Work item relations | Partial | Listing and creating the eight built-in relation types work; CE stable exposes no deletion route. |
|
|
221
|
+
| Work item property definitions and options | Partial | Definition tools remain exposed; per-item property values are not available. |
|
|
222
|
+
| Feature flags, roles, initiatives, milestones | No | Cloud-only / paid API surface. |
|
|
223
|
+
| Work logs, archived work items, estimates | No | Endpoints are absent from the tested CE API. |
|
|
224
|
+
| Pages, work item types, custom relation definitions | No | Pages exist in the CE UI, but only through legacy session-authenticated `/api/...` routes; PAT-based MCP access is unavailable. The other endpoints are absent. |
|
|
225
|
+
|
|
226
|
+
The category tables below describe the full SDK surface. Rows marked **No** or
|
|
227
|
+
**Partial** above are deliberately omitted from MCP discovery in Community
|
|
228
|
+
Edition mode.
|
|
229
|
+
|
|
230
|
+
### Projects
|
|
231
|
+
|
|
232
|
+
| Tool Name | Description |
|
|
233
|
+
|-----------|-------------|
|
|
234
|
+
| `list_projects` | List all projects in a workspace with optional pagination and filtering |
|
|
235
|
+
| `create_project` | Create a new project with name, identifier, and optional configuration |
|
|
236
|
+
| `retrieve_project` | Retrieve a project by ID |
|
|
237
|
+
| `update_project` | Update a project with partial data |
|
|
238
|
+
| `delete_project` | Delete a project by ID |
|
|
239
|
+
| `get_project_worklog_summary` | Get work log summary for a project |
|
|
240
|
+
| `get_project_members` | Get all members of a project |
|
|
241
|
+
| `update_project_features` | Update features configuration of a project |
|
|
242
|
+
|
|
243
|
+
### Work Items
|
|
244
|
+
|
|
245
|
+
| Tool Name | Description |
|
|
246
|
+
|-----------|-------------|
|
|
247
|
+
| `list_work_items` | List all work items in a project with optional filtering and pagination |
|
|
248
|
+
| `create_work_item` | Create a new work item with name, assignees, labels, and other attributes |
|
|
249
|
+
| `retrieve_work_item` | Retrieve a work item by ID with optional field expansion |
|
|
250
|
+
| `retrieve_work_item_by_identifier` | Retrieve a work item by project identifier and issue sequence number |
|
|
251
|
+
| `update_work_item` | Update a work item with partial data |
|
|
252
|
+
| `delete_work_item` | Delete a work item by ID |
|
|
253
|
+
| `search_work_items` | Search work items across a workspace with query string |
|
|
254
|
+
|
|
255
|
+
### Cycles
|
|
256
|
+
|
|
257
|
+
| Tool Name | Description |
|
|
258
|
+
|-----------|-------------|
|
|
259
|
+
| `list_cycles` | List cycles in a project (set `archived=true` for archived) |
|
|
260
|
+
| `create_cycle` | Create a new cycle with name, dates, and owner |
|
|
261
|
+
| `retrieve_cycle` | Retrieve a cycle by ID |
|
|
262
|
+
| `update_cycle` | Update a cycle with partial data |
|
|
263
|
+
| `delete_cycle` | Delete a cycle by ID |
|
|
264
|
+
| `manage_cycle_work_items` | Add and/or remove work items on a cycle |
|
|
265
|
+
| `list_cycle_work_items` | List work items in a cycle |
|
|
266
|
+
| `transfer_cycle_work_items` | Transfer work items from one cycle to another |
|
|
267
|
+
| `manage_cycle_archive` | Archive or unarchive a cycle |
|
|
268
|
+
|
|
269
|
+
### Modules
|
|
270
|
+
|
|
271
|
+
| Tool Name | Description |
|
|
272
|
+
|-----------|-------------|
|
|
273
|
+
| `list_modules` | List modules in a project (set `archived=true` for archived) |
|
|
274
|
+
| `create_module` | Create a new module with name, dates, status, and members |
|
|
275
|
+
| `retrieve_module` | Retrieve a module by ID |
|
|
276
|
+
| `update_module` | Update a module with partial data |
|
|
277
|
+
| `delete_module` | Delete a module by ID |
|
|
278
|
+
| `manage_module_work_items` | Add and/or remove work items on a module |
|
|
279
|
+
| `list_module_work_items` | List work items in a module |
|
|
280
|
+
| `manage_module_archive` | Archive or unarchive a module |
|
|
281
|
+
|
|
282
|
+
### Initiatives
|
|
283
|
+
|
|
284
|
+
| Tool Name | Description |
|
|
285
|
+
|-----------|-------------|
|
|
286
|
+
| `list_initiatives` | List all initiatives in a workspace |
|
|
287
|
+
| `create_initiative` | Create a new initiative with name, dates, state, and lead |
|
|
288
|
+
| `retrieve_initiative` | Retrieve an initiative by ID |
|
|
289
|
+
| `update_initiative` | Update an initiative with partial data |
|
|
290
|
+
| `delete_initiative` | Delete an initiative by ID |
|
|
291
|
+
|
|
292
|
+
### Intake Work Items
|
|
293
|
+
|
|
294
|
+
| Tool Name | Description |
|
|
295
|
+
|-----------|-------------|
|
|
296
|
+
| `list_intake_work_items` | List all intake work items in a project with optional pagination |
|
|
297
|
+
| `create_intake_work_item` | Create a new intake work item in a project |
|
|
298
|
+
| `retrieve_intake_work_item` | Retrieve an intake work item by work item ID with optional field expansion |
|
|
299
|
+
| `update_intake_work_item` | Update an intake work item with partial data |
|
|
300
|
+
| `delete_intake_work_item` | Delete an intake work item by work item ID |
|
|
301
|
+
|
|
302
|
+
### Work Item Properties
|
|
303
|
+
|
|
304
|
+
| Tool Name | Description |
|
|
305
|
+
|-----------|-------------|
|
|
306
|
+
| `list_work_item_properties` | List work item properties for a work item type |
|
|
307
|
+
| `create_work_item_property` | Create a new work item property with type, settings, and validation rules |
|
|
308
|
+
| `retrieve_work_item_property` | Retrieve a work item property by ID |
|
|
309
|
+
| `update_work_item_property` | Update a work item property with partial data |
|
|
310
|
+
| `delete_work_item_property` | Delete a work item property by ID |
|
|
311
|
+
|
|
312
|
+
### Milestones
|
|
313
|
+
|
|
314
|
+
| Tool Name | Description |
|
|
315
|
+
|-----------|-------------|
|
|
316
|
+
| `list_milestones` | List all milestones in a project |
|
|
317
|
+
| `create_milestone` | Create a new milestone |
|
|
318
|
+
| `retrieve_milestone` | Retrieve a milestone by ID |
|
|
319
|
+
| `update_milestone` | Update a milestone by ID |
|
|
320
|
+
| `delete_milestone` | Delete a milestone by ID |
|
|
321
|
+
| `manage_milestone_work_items` | Add and/or remove work items on a milestone |
|
|
322
|
+
| `list_milestone_work_items` | List work items in a milestone |
|
|
323
|
+
|
|
324
|
+
### Labels
|
|
325
|
+
|
|
326
|
+
| Tool Name | Description |
|
|
327
|
+
|-----------|-------------|
|
|
328
|
+
| `list_labels` | List all labels in a project |
|
|
329
|
+
| `create_label` | Create a new label |
|
|
330
|
+
| `retrieve_label` | Retrieve a label by ID |
|
|
331
|
+
| `update_label` | Update a label by ID |
|
|
332
|
+
| `delete_label` | Delete a label by ID |
|
|
333
|
+
|
|
334
|
+
### States
|
|
335
|
+
|
|
336
|
+
| Tool Name | Description |
|
|
337
|
+
|-----------|-------------|
|
|
338
|
+
| `list_states` | List all states in a project |
|
|
339
|
+
| `create_state` | Create a new state |
|
|
340
|
+
| `retrieve_state` | Retrieve a state by ID |
|
|
341
|
+
| `update_state` | Update a state by ID |
|
|
342
|
+
| `delete_state` | Delete a state by ID |
|
|
343
|
+
|
|
344
|
+
### Work Item Comments
|
|
345
|
+
|
|
346
|
+
| Tool Name | Description |
|
|
347
|
+
|-----------|-------------|
|
|
348
|
+
| `list_work_item_comments` | List comments for a work item |
|
|
349
|
+
| `retrieve_work_item_comment` | Retrieve a specific comment for a work item |
|
|
350
|
+
| `create_work_item_comment` | Create a comment for a work item |
|
|
351
|
+
| `update_work_item_comment` | Update a comment for a work item |
|
|
352
|
+
| `delete_work_item_comment` | Delete a comment for a work item |
|
|
353
|
+
|
|
354
|
+
### Work Item Links
|
|
355
|
+
|
|
356
|
+
| Tool Name | Description |
|
|
357
|
+
|-----------|-------------|
|
|
358
|
+
| `list_work_item_links` | List links for a work item |
|
|
359
|
+
| `retrieve_work_item_link` | Retrieve a specific link for a work item |
|
|
360
|
+
| `create_work_item_link` | Create a link for a work item |
|
|
361
|
+
| `update_work_item_link` | Update a link for a work item |
|
|
362
|
+
| `delete_work_item_link` | Delete a link for a work item |
|
|
363
|
+
|
|
364
|
+
### Work Item Types
|
|
365
|
+
|
|
366
|
+
| Tool Name | Description |
|
|
367
|
+
|-----------|-------------|
|
|
368
|
+
| `list_work_item_types` | List all work item types in a project |
|
|
369
|
+
| `create_work_item_type` | Create a new work item type |
|
|
370
|
+
| `retrieve_work_item_type` | Retrieve a work item type by ID |
|
|
371
|
+
| `update_work_item_type` | Update a work item type by ID |
|
|
372
|
+
| `delete_work_item_type` | Delete a work item type by ID |
|
|
373
|
+
| `import_work_item_types_to_project` | Bulk-link workspace-level work item types to a project |
|
|
374
|
+
| `resolve_work_item_type` | Find or create a named type for a project, auto-handling workspace vs project scope and import |
|
|
375
|
+
|
|
376
|
+
### Work Item Relations
|
|
377
|
+
|
|
378
|
+
| Tool Name | Description |
|
|
379
|
+
|-----------|-------------|
|
|
380
|
+
| `list_work_item_relations` | List relations for a work item |
|
|
381
|
+
| `create_work_item_relation` | Create relations for a work item |
|
|
382
|
+
| `remove_work_item_relation` | Remove a relation from a work item |
|
|
383
|
+
|
|
384
|
+
### Work Item Relation Definitions
|
|
385
|
+
|
|
386
|
+
| Tool Name | Description |
|
|
387
|
+
|-----------|-------------|
|
|
388
|
+
| `list_work_item_relation_definitions` | List workspace custom relation definitions |
|
|
389
|
+
| `create_work_item_relation_definition` | Create a workspace relation definition |
|
|
390
|
+
| `update_work_item_relation_definition` | Update a relation definition |
|
|
391
|
+
| `delete_work_item_relation_definition` | Delete a relation definition |
|
|
392
|
+
|
|
393
|
+
### Work Item Activities
|
|
394
|
+
|
|
395
|
+
| Tool Name | Description |
|
|
396
|
+
|-----------|-------------|
|
|
397
|
+
| `list_work_item_activities` | List activities for a work item |
|
|
398
|
+
| `retrieve_work_item_activity` | Retrieve a specific activity for a work item |
|
|
399
|
+
|
|
400
|
+
### Work Logs
|
|
401
|
+
|
|
402
|
+
| Tool Name | Description |
|
|
403
|
+
|-----------|-------------|
|
|
404
|
+
| `list_work_logs` | List work logs for a work item |
|
|
405
|
+
| `create_work_log` | Create a work log for a work item |
|
|
406
|
+
| `update_work_log` | Update a work log for a work item |
|
|
407
|
+
| `delete_work_log` | Delete a work log for a work item |
|
|
408
|
+
|
|
409
|
+
### Pages
|
|
410
|
+
|
|
411
|
+
| Tool Name | Description |
|
|
412
|
+
|-----------|-------------|
|
|
413
|
+
| `list_pages` | List pages (workspace, or a project's if `project_id` given) |
|
|
414
|
+
| `retrieve_page` | Retrieve a page by ID (workspace, or project's if `project_id` given) |
|
|
415
|
+
| `create_page` | Create a workspace or project page |
|
|
416
|
+
|
|
417
|
+
### Workspaces
|
|
418
|
+
|
|
419
|
+
| Tool Name | Description |
|
|
420
|
+
|-----------|-------------|
|
|
421
|
+
| `get_workspace_members` | Get all members of the current workspace |
|
|
422
|
+
| `get_features` | Get feature flags (workspace, or a project's if `project_id` given) |
|
|
423
|
+
| `update_workspace_features` | Update features of the current workspace |
|
|
424
|
+
|
|
425
|
+
### Users
|
|
426
|
+
|
|
427
|
+
| Tool Name | Description |
|
|
428
|
+
|-----------|-------------|
|
|
429
|
+
| `get_me` | Get current authenticated user information |
|
|
430
|
+
|
|
431
|
+
**Total Tools**: 100+ tools across 20 categories
|
|
432
|
+
|
|
433
|
+
## Development
|
|
434
|
+
|
|
435
|
+
### Running Tests
|
|
436
|
+
|
|
437
|
+
```bash
|
|
438
|
+
pytest
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### Code Formatting
|
|
442
|
+
|
|
443
|
+
```bash
|
|
444
|
+
black plane_mcp/
|
|
445
|
+
ruff check plane_mcp/
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
## License
|
|
449
|
+
|
|
450
|
+
MIT License - see LICENSE for details.
|
|
451
|
+
|
|
452
|
+
## Contributing
|
|
453
|
+
|
|
454
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
455
|
+
|
|
456
|
+
## Deprecation Notice
|
|
457
|
+
|
|
458
|
+
⚠️ **The Node.js-based `plane-mcp-server` is deprecated and no longer maintained.**
|
|
459
|
+
|
|
460
|
+
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.
|
|
461
|
+
|
|
462
|
+
The new implementation offers:
|
|
463
|
+
- Better type safety with Pydantic models
|
|
464
|
+
- Improved performance with FastMCP
|
|
465
|
+
- Enhanced tool coverage
|
|
466
|
+
- Active maintenance and development
|
|
467
|
+
|
|
468
|
+
For migration assistance, please refer to the configuration examples in this README or open an issue for support.
|
|
469
|
+
|
|
470
|
+
**Old Node.js Configuration (Deprecated):**
|
|
471
|
+
|
|
472
|
+
If you were using the previous Node.js-based `@makeplane/plane-mcp-server`, your configuration looked like this:
|
|
473
|
+
|
|
474
|
+
```json
|
|
475
|
+
{
|
|
476
|
+
"mcpServers": {
|
|
477
|
+
"plane": {
|
|
478
|
+
"command": "npx",
|
|
479
|
+
"args": [
|
|
480
|
+
"-y",
|
|
481
|
+
"@makeplane/plane-mcp-server"
|
|
482
|
+
],
|
|
483
|
+
"env": {
|
|
484
|
+
"PLANE_API_KEY": "<YOUR_API_KEY>",
|
|
485
|
+
"PLANE_API_HOST_URL": "<HOST_URL_FOR_SELF_HOSTED>",
|
|
486
|
+
"PLANE_WORKSPACE_SLUG": "<YOUR_WORKSPACE_SLUG>"
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
**Please migrate to the new Python-based configuration shown in the Usage section above.**
|
|
494
|
+
|
|
495
|
+
## Releasing `plane-mcp-server-ce`
|
|
496
|
+
|
|
497
|
+
Maintainers should follow [RELEASING.md](RELEASING.md). The first publication
|
|
498
|
+
creates the PyPI project; never commit a PyPI token to this repository.
|