plane-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PLANE_API_KEY | Yes | Plane API key (Workspace Settings → API tokens) | |
| PLANE_API_URL | Yes | Base URL of the Plane host (e.g., https://plane.example.com or https://app.plane.so) | |
| PLANE_PROJECT_ID | Yes | UUID of the Plane project this server instance is tied to | |
| PLANE_WORKSPACE_SLUG | Yes | Workspace slug for the Plane instance |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_tasksA | List tasks in the configured project, optionally filtered. Filtering is done client-side because Plane's list endpoint silently
ignores state/assignee query params. We page through up to 500 raw
items and return at most |
| get_taskA | Retrieve a single task by UUID or by If description_html embeds Plane asset URLs (inline images), the
response also includes an |
| create_taskB | Create a new task in the configured project. |
| update_taskB | Patch any combination of fields on an existing task. |
| change_statusA | Move a task to a different state. Provide status_group OR state_id. Convenience wrapper around update_task — kept separate because it's the most common single-field update and reads cleaner in transcripts. |
| add_commentA | Post a comment on a task. body_html is run through nh3 with the default allowlist before being sent to Plane. Plane sanitizes description_html server-side but not comment_html, so we mirror its sanitizer here to keep parity. |
| list_commentsA | List comments on a task, oldest first. Returns trimmed fields useful for reading context: id, comment_html, comment_stripped, actor_id, created_at, updated_at. Comments that embed inline images also include an |
| add_comment_with_imageA | Post a comment with an embedded inline image. Workflow: upload the file as a task attachment (which gives a stable Plane asset URL), build an tag with the absolute URL, splice it into body_html, sanitize, and post the comment. The image will also appear in the task's Attachments tab — Plane's public API doesn't expose a comment-scoped asset entity type, so any inline image is also a regular attachment by design. |
| list_statesA | List workflow states for the configured project (cached 5 min). Each state has: id, name, group (backlog/unstarted/started/completed/ cancelled), color, sequence. LLMs need this to map status_group → state_id when creating or updating tasks. |
| list_membersA | List project members (cached 5 min). Returns id, display_name, email. |
| list_labelsA | List project labels (cached 5 min). Returns id, name, color. |
| upload_attachmentA | Attach a file from disk to a task. Three-step flow under the hood: request presigned S3 URL from Plane, upload the bytes directly to S3, confirm upload back to Plane. Returns the created attachment metadata. |
| list_attachmentsA | List file attachments on a task. Returns trimmed metadata only. |
| get_attachment_urlA | Get URLs for an attachment. Returns two URLs:
|
| delete_attachmentA | Soft-delete an attachment from a task. |
| read_attachment_imageA | Fetch an image attachment and return it as MCP image content. Lets vision-capable models look at a screenshot/photo on a task directly, instead of receiving a URL and having to download via a shell tool. Resolves the presigned URL, fetches the bytes, returns them as native MCP image content. Capped at 5 MB (Plane's default FILE_SIZE_LIMIT); raises if the attachment isn't an image MIME type or exceeds the cap. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/babazulu/plane-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server