Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
PLANE_API_KEYYesPlane API key (Workspace Settings → API tokens)
PLANE_API_URLYesBase URL of the Plane host (e.g., https://plane.example.com or https://app.plane.so)
PLANE_PROJECT_IDYesUUID of the Plane project this server instance is tied to
PLANE_WORKSPACE_SLUGYesWorkspace slug for the Plane instance

Capabilities

Features and capabilities supported by this server

CapabilityDetails
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

NameDescription
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 limit matches. If next_cursor is null, the filtered range has been exhausted.

get_taskA

Retrieve a single task by UUID or by PROJECT-N identifier.

If description_html embeds Plane asset URLs (inline images), the response also includes an inline_assets array with short-lived presigned URLs the agent can fetch anonymously — the URLs Plane renders in HTML require a Plane session cookie and reject API keys, so they're not directly downloadable from MCP.

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 inline_assets array with short-lived presigned URLs — Plane renders embedded images with /api/assets/v2/ URLs that require a session cookie (API keys aren't accepted there), so without this mapping an agent reading the comment can't actually fetch the image. The presigned URLs are anonymous and curl-able for ~1 hour.

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:

  • url — stable Plane URL that never expires. Only follows for browsers with an active Plane session (API key auth is NOT accepted on this path). Use this for embedding in HTML rendered inside Plane (comments, descriptions, etc.) — works because the user's session cookie resolves it.

  • presigned_url — short-lived signed URL, no auth needed. Use this when you want an agent to fetch the bytes right now. May be null if the asset isn't uploaded yet.

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

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