Manage your Plate tasks directly from AI assistants — Claude, Cursor, Windsurf, and any MCP-compatible client.
https://plate.to/mcp
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"
}
}
}
| Client | Config file location |
|---|---|
| Claude Code | .mcp.json in project root, or ~/.claude/.mcp.json globally |
| Claude Desktop | macOS: ~/Library/Application Support/Claude/claude_desktop_config.json |
| Cursor | Settings → Cursor Settings → MCP |
| Windsurf | Windsurf 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.
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.
| Scope | Permissions |
|---|---|
read | View workspaces, projects, tasks — no changes allowed |
read write | Full access: view and create/update tasks, projects, and comments |
Read tools are always available. Write tools require the write scope.
Returns all Plate workspaces the authenticated user belongs to.
[{
"id": "ws_abc",
"name": "Acme Corp",
"urlId": "acme",
"taskPrefix": "SCA"
}]
Returns all projects in a workspace.
| Parameter | Type | Description |
|---|---|---|
workspaceId* | string | Workspace ID from list_workspaces |
[{
"id": "proj_xyz",
"name": "Backend",
"description": null
}]
Returns all sections in a project, ordered by position.
| Parameter | Type | Description |
|---|---|---|
projectId* | string | Project ID from list_projects |
[{
"id": "list_abc",
"name": "To Do",
"order": 0
}]
Returns tasks in a project. Excludes completed tasks by default.
| Parameter | Type | Description |
|---|---|---|
projectId* | string | Project ID |
statusIdoptional | string | Filter by status |
listIdoptional | string | Filter by section |
includeCompletedoptional | boolean | Include 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"
}]
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.
| Parameter | Type | Description |
|---|---|---|
taskId* | string | Task ID |
Returns all members of a workspace. Use userId as assigneeId when creating or updating tasks.
| Parameter | Type | Description |
|---|---|---|
workspaceId* | string | Workspace ID from list_workspaces |
[{
"userId": "user_abc",
"name": "Jane Smith",
"email": "jane@acme.com",
"role": "member"
}]
Returns workflow statuses for a workspace. Use the returned id as statusId when creating or updating tasks.
| Parameter | Type | Description |
|---|---|---|
workspaceId* | string | Workspace ID from list_workspaces |
[{
"id": "status_abc",
"name": "In Progress",
"color": "#4fa3e0",
"systemType": null,
"order": 1
}]
Creates a new task in a project section. Returns the new task ID and its auto-assigned number.
| Parameter | Type | Description |
|---|---|---|
projectId* | string | Project ID |
listId* | string | Section ID from list_sections |
name* | string | Task name |
statusIdoptional | string | Initial status ID |
assigneeIdoptional | string | Assignee user ID |
{ "id": "task_456", "number": 43 }
Updates one or more fields on a task. Only the fields you provide are changed.
| Parameter | Type | Description |
|---|---|---|
taskId* | string | Task ID |
nameoptional | string | New task name |
statusIdoptional | string | New status ID. Also updates isCompleted. |
assigneeIdoptional | string | null | New assignee. Pass null to unassign. |
listIdoptional | string | Move task to a different section. Must belong to the same project. |
descriptionoptional | string | New description. Markdown supported. |
{ "id": "task_123" }
Marks a task as completed or re-opens it. Automatically sets the status to the system "done" or "todo" status.
| Parameter | Type | Description |
|---|---|---|
taskId* | string | Task ID |
isCompletedoptional | boolean | true to complete, false to reopen (default: true) |
{ "id": "task_123", "isCompleted": true }
Permanently deletes a task. Comments and attachments are removed automatically.
| Parameter | Type | Description |
|---|---|---|
taskId* | string | Task ID |
{ "id": "task_abc", "deleted": true }
Creates a new project with a default "To Do" section. Returns the project ID and the default section ID.
| Parameter | Type | Description |
|---|---|---|
workspaceId* | string | Workspace ID |
name* | string | Project name |
descriptionoptional | string | Project description (plain text) |
{ "id": "proj_new", "defaultListId": "list_new" }
Renames a project or updates its description.
| Parameter | Type | Description |
|---|---|---|
projectId* | string | Project ID |
nameoptional | string | New project name |
descriptionoptional | string | null | New description, or null to clear |
{ "id": "proj_abc" }
Creates a new section in a project.
| Parameter | Type | Description |
|---|---|---|
projectId* | string | Project ID |
name* | string | Section name |
{ "id": "section_abc" }
Renames a section.
| Parameter | Type | Description |
|---|---|---|
sectionId* | string | Section ID |
name* | string | New section name |
{ "id": "section_abc" }
Adds a comment to a task. The comment is posted as the authenticated user.
| Parameter | Type | Description |
|---|---|---|
taskId* | string | Task ID |
text* | string | Comment text. Markdown supported. |
{ "id": "comment_abc" }
Deletes a comment from a task.
| Parameter | Type | Description |
|---|---|---|
commentId* | string | Comment ID |
{ "id": "comment_abc", "deleted": true }
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.
| Syntax | Result |
|---|---|
# Heading | Heading 1 |
## Heading | Heading 2 |
### Heading | Heading 3 |
- item or * item | Bullet list item |
1. item | Numbered list item |
> text | Blockquote |
**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
All tools throw a descriptive error string on failure. Common causes:
| Error message | Cause |
|---|---|
Access denied or workspace not found | The authenticated user is not a member of the requested workspace |
Task not found | Invalid task ID, or task belongs to a different workspace |
Project not found | Invalid project ID |
Section not found | Invalid section ID, or section belongs to a different project |
Free plan limit reached: 300 tasks maximum | Workspace is on the free plan and has reached the task limit |
Free plan limit reached: 3 projects maximum | Workspace is on the free plan and has reached the project limit |
Questions? Write to us at hello@plate.to