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
| Scope | Permissions |
|---|---|
| read | View workspaces, projects, tasks — no changes allowed |
| read write | Full 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.
| Parameter | Type | Description |
|---|---|---|
| workspaceId* | string | Workspace ID from list_workspaces |
[{ "id": "proj_xyz", "name": "Backend", "description": null }]
list_sections read
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 }]
list_tasks read
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" }]
get_task read
Returns full details of a single task, including its description as a Plate node array and label list.
| Parameter | Type | Description |
|---|---|---|
| taskId* | string | Task ID |
create_task write
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 }
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.
| 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. |
| descriptionoptional | string | New 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.
| Parameter | Type | Description |
|---|---|---|
| taskId* | string | Task ID |
| isCompletedoptional | boolean | true 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.
| Parameter | Type | Description |
|---|---|---|
| workspaceId* | string | Workspace ID |
| name* | string | Project name |
| descriptionoptional | string | Project 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.
| Parameter | Type | Description |
|---|---|---|
| taskId* | string | Task ID |
| text* | string | Comment 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.
| 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\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 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 |