Plate ← Docs

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.

Add this to your MCP configuration file:

{
  "mcpServers": {
    "plate": {
      "type": "http",
      "url": "https://plate.to/mcp"
    }
  }
}
ClientConfig file location
Claude Code.mcp.json in project root, or ~/.claude/.mcp.json globally
Claude DesktopmacOS: ~/Library/Application Support/Claude/claude_desktop_config.json
CursorSettings → Cursor Settings → MCP
WindsurfWindsurf Settings → MCP Servers

After adding the server, your client will prompt you to authorize via browser. Sign in with your Plate account and choose a scope. To revoke access, go to Workspace Settings → Apps in Plate.

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 rich text description and label list. When description is not empty, it is returned as a structured node array — extract the text fields from leaf nodes to get plain text.

ParameterTypeDescription
taskId*stringTask ID
list_members read

Returns all members of a workspace. Use userId as assigneeId when creating or updating tasks.

ParameterTypeDescription
workspaceId*stringWorkspace ID from list_workspaces
[{
  "userId": "user_abc",
  "name": "Jane Smith",
  "email": "jane@acme.com",
  "role": "member"
}]
list_statuses read

Returns workflow statuses for a workspace. Use the returned id as statusId when creating or updating tasks.

ParameterTypeDescription
workspaceId*stringWorkspace ID from list_workspaces
[{
  "id": "status_abc",
  "name": "In Progress",
  "color": "#4fa3e0",
  "systemType": null,
  "order": 1
}]
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.
listIdoptionalstringMove task to a different section. Must belong to the same project.
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 }
delete_task write

Permanently deletes a task. Comments and attachments are removed automatically.

ParameterTypeDescription
taskId*stringTask ID
{ "id": "task_abc", "deleted": 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.
update_project write

Renames a project or updates its description.

ParameterTypeDescription
projectId*stringProject ID
nameoptionalstringNew project name
descriptionoptionalstring | nullNew description, or null to clear
{ "id": "proj_abc" }
create_section write

Creates a new section in a project.

ParameterTypeDescription
projectId*stringProject ID
name*stringSection name
{ "id": "section_abc" }
update_section write

Renames a section.

ParameterTypeDescription
sectionId*stringSection ID
name*stringNew section name
{ "id": "section_abc" }
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" }
delete_comment write

Deletes a comment from a task.

ParameterTypeDescription
commentId*stringComment ID
{ "id": "comment_abc", "deleted": true }

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\n**Expected:** profile page opens\n**Actual:** 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

Questions? Write to us at hello@plate.to