Skip to main content
Glama

Plaky MCP Server

A Model Context Protocol server that exposes the Plaky project-management REST API to MCP-compatible AI clients (Claude Desktop, Claude Code, Cursor, etc.).

It wraps the full Plaky public API surface — spaces, boards, items/subitems, fields, comments, reactions, files, users and teams — as 26 well-described tools.

Features

  • Workspace — current user, list/get users (filter by email/status/type), list/get teams

  • Spaces & boards — list/get spaces, list boards, get board structure (groups, fields, allowed values)

  • Items — list (with view/parent/expand filters + pagination), get, create item or subitem, delete

  • Fields — update one field or many at once, by field key or title, with per-type value formats

  • Comments — list, create (incl. replies), update, delete, and set emoji reactions

  • Files — list, get, upload (from a local path), rename/describe, delete, download

  • Clean error reporting (status + API error body), 429 rate-limit awareness, 1-indexed pagination with hasMore.

Related MCP server: plaky115-mcp

Install

npm install plaky-mcp

Or run without installing globally:

npx plaky-mcp

You need a Plaky API key (Plaky → Profile settings → API). It is sent as the X-API-Key header on every request.

Client configuration

Claude Desktop / Claude Code (claude_desktop_config.json or .mcp.json)

{
  "mcpServers": {
    "plaky": {
      "command": "npx",
      "args": ["-y", "plaky-mcp"],
      "env": {
        "PLAKY_API_KEY": "your-api-key"
      }
    }
  }
}

For Claude Code you can also run:

claude mcp add plaky --env PLAKY_API_KEY=your-api-key -- npx -y plaky-mcp

Cursor

Add to your MCP settings (.cursor/mcp.json or Cursor Settings → MCP):

{
  "mcpServers": {
    "plaky": {
      "command": "npx",
      "args": ["-y", "plaky-mcp"],
      "env": {
        "PLAKY_API_KEY": "your-api-key"
      }
    }
  }
}

Development

git clone https://github.com/pavlealeksic/plaky-mcp.git
cd plaky-mcp
npm install
npm run build
export PLAKY_API_KEY="your-api-key"
npm start

Environment variables

Variable

Required

Description

PLAKY_API_KEY

yes

Plaky API key, sent as X-API-Key.

PLAKY_BASE_URL

no

Override the API base URL (default https://api.plaky.com).

Tool reference

All tools are prefixed plaky_. IDs are integers. Typical flow: plaky_list_spaces → plaky_list_boards → plaky_get_board (to learn field keys and allowed values) → plaky_list_items / plaky_create_item / plaky_update_item_fields.

Tool

Description

plaky_get_current_user

The API key's owner (verify auth).

plaky_list_users / plaky_list_teams / plaky_get_team

Workspace members and teams.

plaky_list_spaces / plaky_get_space

Spaces (optionally expand boards).

plaky_list_boards / plaky_get_board

Boards and board structure.

plaky_list_items / plaky_get_item / plaky_list_subitems

Read items.

plaky_create_item / plaky_delete_item

Create item/subitem; delete item.

plaky_update_item_field / plaky_update_item_fields

Change one / many field values.

plaky_list_item_comments / plaky_create_item_comment / plaky_update_item_comment / plaky_delete_item_comment

Comments.

plaky_set_comment_reactions

Set the caller's emoji reactions on a comment.

plaky_list_item_files / plaky_get_item_file / plaky_upload_item_file / plaky_update_item_file / plaky_delete_item_file / plaky_download_item_file

File attachments.

Field value formats

When setting fields (on create/update), keys are field keys ("status-1") or titles ("Status"). Values by type:

Type

Example

String / Rich text

"some text"

Number

13.4

Date

"2026-01-02T18:10:15.254Z"

Timeline

{ "start": "...", "end": "..." }

Status

"To do" or label id "1"

Tag

["Product", "HR"] (titles or ids)

Link

"https://..." or { "url": "...", "displayText": "..." }

Person

{ "users": [{ "id": "1" }, { "email": "x@y.com" }], "teams": [{ "id": 1 }] }

npm run dev    # tsx watch on src/index.ts
npm run build  # tsc -> dist/

Notes

  • Rate limit: 200 requests / user / minute; exceeding it returns HTTP 429.

License

MIT

Available Tools

26 tools
plaky_create_itemCreate an item or subitemA

Create a new item (row) on a board, or a subitem when parentId is set. Place it in a group via groupId or groupTitle (defaults to the first group). Set initial field values via fields: an object keyed by field key (e.g. "status-1") or field title (e.g. "Status"). Value formats by field type — String/RichText: "text"; Number: 13.4; Date: "2026-01-02T18:10:15.254Z"; Timeline: {start, end}; Status: "To do" or label id "1"; Tag: ["Product","HR"] or ids; Link: "https://..." or {url, displayText}; Person: {users:[{id}|{email}], teams:[{id}|{title}]}. Call plaky_get_board first to discover available fields and allowed values.

Inputs: boardId (required), spaceId (required), title, fields, +3 more.

plaky_create_item_commentCreate item commentB

Add a comment to an item. Set repliesToId to post the comment as a reply to an existing comment.

Inputs: text (required), itemId (required), boardId (required), spaceId (required), +1 more.

plaky_delete_itemDelete an itemA

Permanently delete an item (and its subitems) by id. This cannot be undone.

Inputs: itemId (required), boardId (required), spaceId (required).

plaky_delete_item_commentDelete item commentC

Permanently delete a comment by id.

Inputs: itemId (required), boardId (required), spaceId (required), itemCommentId (required).

plaky_delete_item_fileDelete item fileB

Permanently delete a file attached to an item.

Inputs: itemId (required), boardId (required), spaceId (required), itemFileId (required).

plaky_download_item_fileDownload item fileA

Download a file attached to an item. If the API returns JSON (e.g. a presigned download URL) that is returned directly. If it returns binary content, provide savePath to write it to disk; the tool then returns the saved path and size. Binary content is never streamed into the conversation.

Inputs: itemId (required), boardId (required), spaceId (required), itemFileId (required), +1 more.

plaky_get_boardGet board by idA

Get a single board by id, including its structure: groups, field/column definitions and their configurations (status labels, tag labels, etc.). Read this before creating or updating items so you know the available field keys/titles and allowed values.

Inputs: boardId (required), spaceId (required).

plaky_get_current_userGet current userA

Get the user that owns the API key making the request. Useful for verifying authentication and discovering the caller's user id.

Inputs: no named parameters.

plaky_get_itemGet item by idB

Get a single item by id, including its field values.

Inputs: itemId (required), boardId (required), spaceId (required), expand.

plaky_get_item_fileGet item file detailsA

Get metadata for a single file attached to an item.

Inputs: itemId (required), boardId (required), spaceId (required), itemFileId (required).

plaky_get_spaceGet space by idB

Get a single space by its id.

Inputs: spaceId (required), expand.

plaky_get_teamGet team by idB

Get a single team by its id.

Inputs: teamId (required).

plaky_list_boardsList boards in a spaceA

List the boards contained in a given space. Supports pagination.

Inputs: spaceId (required), page, pageSize.

plaky_list_item_commentsList item commentsB

List all comments on an item, including replies and reaction details.

Inputs: itemId (required), boardId (required), spaceId (required).

plaky_list_item_filesList item filesB

List the files attached to an item.

Inputs: itemId (required), boardId (required), spaceId (required).

plaky_list_itemsList board itemsA

List items (rows) on a board, with optional filtering. Supports pagination; the response includes a hasMore flag indicating whether more pages exist.

Inputs: boardId (required), spaceId (required), page, expand, +4 more.

plaky_list_spacesList spacesB

List spaces in the workspace. Spaces are top-level containers that hold boards. Use expand=["board"] to include full board objects.

Inputs: page, expand, pageSize.

plaky_list_subitemsList subitems of an itemB

List the subitems nested under a given item. Supports pagination.

Inputs: itemId (required), boardId (required), spaceId (required), page, +2 more.

plaky_list_teamsList workspace teamsB

List all teams in the workspace. Supports pagination.

Inputs: page, pageSize.

plaky_list_usersList workspace usersA

List users in the workspace. Optionally filter by emails, status, or membership type. Supports pagination.

Inputs: page, type, emails, status, +1 more.

plaky_set_comment_reactionsSet comment reactionsA

Set the authenticated user's reactions on a comment. This OVERRIDES any existing reactions by the caller; pass an empty array to remove all of them. Each reaction is an emoji's unicode codepoint without the "U+" prefix (case-insensitive) — e.g. "1f44d" (thumbs up), "2705" (check mark), "2764" (heart).

Inputs: itemId (required), boardId (required), spaceId (required), reactions (required), +1 more.

plaky_update_item_commentUpdate item commentB

Edit the text of an existing comment.

Inputs: text (required), itemId (required), boardId (required), spaceId (required), +2 more.

plaky_update_item_fieldUpdate a single item field valueA

Change the value of one field on an item, identified by the field key or title (itemFieldKey). The value format depends on the field type — String/RichText: "text"; Number: 13.4; Date: "2026-01-02T18:10:15.254Z"; Timeline: {start, end}; Status: "To do" or "1"; Tag: ["Product","HR"]; Link: "https://..." or {url, displayText}; Person: {users:[{id}|{email}], teams:[{id}|{title}]}.

Inputs: itemId (required), boardId (required), spaceId (required), itemFieldKey (required), +1 more.

plaky_update_item_fieldsUpdate multiple item field valuesA

Change several field values on an item in one request. fields is an object keyed by field key or title, with values following the same per-type formats as plaky_create_item (e.g. {"Status":"Done", "number-1":42}).

Inputs: fields (required), itemId (required), boardId (required), spaceId (required).

plaky_update_item_fileUpdate item file metadataA

Rename a file or change its description. The original file extension/type is preserved regardless of the name given.

Inputs: name (required), itemId (required), boardId (required), spaceId (required), +2 more.

plaky_upload_item_fileUpload a file to an itemA

Upload a local file and attach it to an item. Provide the absolute path to a file on the machine running this MCP server.

Inputs: itemId (required), boardId (required), spaceId (required), filePath (required), +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 26 tools

    Disambiguation5/5

    Each tool targets a distinct resource-action combination (e.g., create_item vs. create_item_comment, update_item_field vs. update_item_fields). There is no ambiguity between tools; even similar ones like list_items and list_subitems are clearly differentiated by resource.

    Naming Consistency5/5

    All tools follow the pattern 'plaky_<verb>_<noun>' in snake_case. Verbs are consistent (create, delete, get, list, update, etc.) and nouns correspond to the resource. No mixing of conventions.

    Tool Count4/5

    26 tools is on the higher side but still appropriate for a comprehensive project management MCP server covering items, comments, files, boards, spaces, users, and teams. Each tool serves a distinct purpose; the count is justified by the domain's breadth.

    Completeness4/5

    The tool surface covers core CRUD operations for items, comments, and files, plus listing for boards, spaces, users, teams, and subitems. Missing operations like creating/updating boards or spaces are minor gaps for a tool focused on item-level management.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers