Plate MCP Server

Minimal project management for teams and AI agents.

Documentation

Plate

MCP Server

Manage your Plate tasks directly from AI assistants — Claude, Cursor, Windsurf, and any MCP-compatible client.

Endpoint https://plate.to/mcp

Setup

The Plate MCP server uses OAuth 2.0 — your AI client handles authentication automatically when you first connect. No API keys needed.

Claude Code

Create or edit .mcp.json in your project root (project-level) or ~/.claude/.mcp.json (global):

{ "mcpServers": { "plate": { "type": "http", "url": "https://plate.to/mcp" } } }

Claude Desktop

Add to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/):

Cursor

Go to Settings → Cursor Settings → MCP and add a new server:

Windsurf

Open Windsurf Settings → MCP Servers and add:

After adding the server, your client will prompt you to authorize via browser. Sign in with your Plate account and choose a scope.

Authentication

Plate uses OAuth 2.0 with PKCE. When you first use a Plate tool, your client opens a browser window where you sign into your Plate account and approve access. You receive an access token (valid 1 hour) and a refresh token (valid 30 days). Refresh is handled automatically — you won't be asked to re-authorize unless the refresh token expires.

Scopes

ScopePermissions
readView workspaces, projects, tasks — no changes allowed
read writeFull access: view and create/update tasks, projects, and comments

Tools

Read tools are always available. Write tools require the write scope.

list_workspaces read

Returns all Plate workspaces the authenticated user belongs to.

[{ "id": "ws_abc", "name": "Acme Corp", "urlId": "acme", "taskPrefix": "SCA" }]

list_projects read

Returns all projects in a workspace.

ParameterTypeDescription
workspaceId*stringWorkspace ID from list_workspaces

[{ "id": "proj_xyz", "name": "Backend", "description": null }]

list_sections read

Returns all sections in a project, ordered by position.

ParameterTypeDescription
projectId*stringProject ID from list_projects

[{ "id": "list_abc", "name": "To Do", "order": 0 }]

list_tasks read

Returns tasks in a project. Excludes completed tasks by default.

ParameterTypeDescription
projectId*stringProject ID
statusIdoptionalstringFilter by status
listIdoptionalstringFilter by section
includeCompletedoptionalbooleanInclude completed tasks (default: false)

[{ "id": "task_123", "number": 42, "name": "Fix login bug", "isCompleted": false, "statusId": "status_abc", "assigneeId": "user_xyz", "listId": "list_abc", "projectId": "proj_xyz", "workspaceId": "ws_abc", "createdAt": "2025-01-15T10:00:00.000Z" }]

get_task read

Returns full details of a single task, including its description as a Plate node array and label list.

ParameterTypeDescription
taskId*stringTask ID

create_task write

Creates a new task in a project section. Returns the new task ID and its auto-assigned number.

ParameterTypeDescription
projectId*stringProject ID
listId*stringSection ID from list_sections
name*stringTask name
statusIdoptionalstringInitial status ID
assigneeIdoptionalstringAssignee user ID

{ "id": "task_456", "number": 43 }

Free plan: max 300 tasks per workspace. Pro: unlimited.

update_task write

Updates one or more fields on a task. Only the fields you provide are changed.

ParameterTypeDescription
taskId*stringTask ID
nameoptionalstringNew task name
statusIdoptionalstringNew status ID. Also updates isCompleted.
assigneeIdoptionalstring | nullNew assignee. Pass null to unassign.
descriptionoptionalstringNew description. Markdown supported.

{ "id": "task_123" }

complete_task write

Marks a task as completed or re-opens it. Automatically sets the status to the system "done" or "todo" status.

ParameterTypeDescription
taskId*stringTask ID
isCompletedoptionalbooleantrue to complete, false to reopen (default: true)

{ "id": "task_123", "isCompleted": true }

create_project write

Creates a new project with a default "To Do" section. Returns the project ID and the default section ID.

ParameterTypeDescription
workspaceId*stringWorkspace ID
name*stringProject name
descriptionoptionalstringProject description (plain text)

{ "id": "proj_new", "defaultListId": "list_new" }

Free plan: max 3 projects per workspace. Pro: unlimited.

create_comment write

Adds a comment to a task. The comment is posted as the authenticated user.

ParameterTypeDescription
taskId*stringTask ID
text*stringComment text. Markdown supported.

{ "id": "comment_abc" }

Text Formatting

The description field in update_task and the text field in create_comment accept markdown. It is converted to rich text and rendered in the Plate editor.

SyntaxResult
# HeadingHeading 1
## HeadingHeading 2
### HeadingHeading 3
- item or * itemBullet list item
1. itemNumbered list item
> textBlockquote
**text**Bold
*text*Italic
***text***Bold + italic
~~text~~Strikethrough
`text`Inline code

Blank lines separate blocks. Consecutive plain lines without a blank line between them are merged into a single paragraph.

Example description

"## Steps to reproduce\n\n- Open settings\n- Click Profile\n\nExpected: profile page opens\nActual: 404 error"

Renders as:

Heading 2: "Steps to reproduce"

Bullet: "Open settings"

Bullet: "Click Profile"

Paragraph with bold "Expected:" and "Actual:" inline

Errors

All tools throw a descriptive error string on failure. Common causes:

Error messageCause
Access denied or workspace not foundThe authenticated user is not a member of the requested workspace
Task not foundInvalid task ID, or task belongs to a different workspace
Project not foundInvalid project ID
Section not foundInvalid section ID, or section belongs to a different project
Free plan limit reached: 300 tasks maximumWorkspace is on the free plan and has reached the task limit
Free plan limit reached: 3 projects maximumWorkspace is on the free plan and has reached the project limit