Plate MCP Server

チームとAIエージェントのための最小限のプロジェクト管理。

ドキュメント

← 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. Also supports looking up a task by its public number (e.g. 42 from SCD-42) — pass workspaceId + number and omit projectId.

ParameterTypeDescription
projectIdoptionalstringProject ID. Required unless number is provided.
workspaceIdoptionalstringWorkspace ID. Required when using number.
numberoptionalnumberPublic task number (digits only — e.g. 42 from SCD-42). When provided, workspaceId is required and projectId is ignored.
statusIdoptionalstringFilter by status
listIdoptionalstringFilter by section
includeCompletedoptionalbooleanInclude completed tasks (default: false)
limitoptionalnumberMax tasks to return (default: 100, max: 500)

[{ "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. Accepts three lookup forms:

  • Internal ID — pass taskId (the id field from list_tasks)
  • Prefixed reference — pass taskId: "SCD-426" and the server resolves it automatically across all your workspaces
  • Number — pass workspaceId + number: 426 for a direct lookup in a specific workspace

The response includes two description fields: descriptionText (Markdown string, ready to display) and description (raw Plate.js node array). Use descriptionText for reading and displaying content.

ParameterTypeDescription
taskIdoptionalstringInternal task ID or prefixed reference like SCD-426. Omit when using number.
workspaceIdoptionalstringWorkspace ID. Speeds up number lookup; if omitted, all workspaces are searched.
numberoptionalnumberPublic task number (digits only — e.g. 426 from SCD-426). When provided, taskId is ignored.

list_comments read

Returns a task's comments, oldest first. Like get_task's description, each comment has contentText (Markdown string, ready to display) and content (raw Plate.js node array). Use contentText for reading.

ParameterTypeDescription
taskId*stringInternal task ID (the id from list_tasks, not the public SCD-XXX number)

[{ "id": "comment_xyz", "authorId": "user_pasha", "contentText": "Fixed in projectsSaga.ts:287", "content": [ /* Plate nodes */ ], "createdAt": "2026-06-25T12:43:31.401Z" }]

list_members read

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

[{ "userId": "user_abc", "name": "Jane Smith", "email": "[email protected]", "role": "member" }]

list_statuses read

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

[{ "id": "status_abc", "name": "In Progress", "color": "#4fa3e0", "systemType": null, "order": 1 }]

list_activity read

Task change history over a time range — status changes, assignments, moves, etc. Use it for time-based questions like which tasks were completed last week, or what a person did. Each row gives the task, the status transition, who made the change, and the task's owner and assignee.

ParameterTypeDescription
workspaceId*stringWorkspace ID from list_workspaces
fromstringStart of range, ISO 8601 (e.g. 2026-06-01)
tostringEnd of range, ISO 8601
actorIdstringOnly changes made by this userId (from list_members)
typestringtask_status_changed, or completed for transitions into a Done status
projectIdstringLimit to one project
limitnumberMax rows (default 100, max 500)

[{ "at": "2026-06-05T14:12:00.000Z", "type": "task_status_changed", "task": "SCD-42", "taskName": "Review API docs", "change": "In Progress → Done", "completed": true, "actor": "Pasha", "owner": "Karl", "assignee": "Pasha" }]

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. If a project with the same name already exists in the workspace, returns the existing project instead of creating a duplicate — check created in the response to distinguish the two cases. defaultListId is null if the existing project has no sections.

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

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

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. If a section with the same name already exists in the project, returns the existing section instead of creating a duplicate — check created in the response to distinguish the two cases.

ParameterTypeDescription
projectId*stringProject ID
name*stringSection name

{ "id": "section_abc", "created": true }

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 }

Batch Tools

Batch tools let you create, update, or delete multiple items in a single call — reducing the number of confirmation prompts in AI clients that ask per-tool-call.

create_tasks write

Creates multiple tasks in a project atomically. If any validation fails, nothing is created. Maximum 50 tasks per call.

ParameterTypeDescription
projectId*stringProject ID
listIdstringDefault section ID (used when a task omits its own listId)
tasks*array (1–50)Tasks to create. Each item: name (required), listId, assigneeId, statusId, description (markdown), dueDate

{ "items": [{ "id": "task_abc", "number": 42, "name": "Task A", "listId": "list_xyz", "projectId": "proj_1", "workspaceId": "ws_1" }] }

update_tasks write

Updates multiple tasks atomically. Maximum 50 tasks per call.

ParameterTypeDescription
tasks*array (1–50)Tasks to update. Each item: taskId (required), then any of: name, listId, assigneeId, statusId, description (markdown), dueDate

{ "items": [{ "id": "task_abc" }] }

complete_tasks write

Marks multiple tasks as completed (or reopens them). Already-completed tasks are left as-is. Maximum 100 tasks per call.

ParameterTypeDescription
taskIds*array (1–100)Internal task IDs to complete
isCompletedbooleantrue to complete, false to reopen (default: true)

{ "items": [{ "id": "task_abc", "isCompleted": true }] }

delete_tasks write

Permanently deletes multiple tasks. All tasks are validated before any are deleted. Maximum 50 tasks per call.

ParameterTypeDescription
taskIds*array (1–50)Internal task IDs to delete

{ "items": [{ "id": "task_abc", "deleted": true }] }

create_sections write

Creates multiple sections in a project. Sections with duplicate names are returned as-is (created: false). Maximum 30 sections per call.

ParameterTypeDescription
projectId*stringProject ID
sections*array (1–30)Sections to create. Each item: name (required)

{ "items": [{ "id": "list_abc", "name": "Backlog", "created": true }] }

update_sections write

Renames multiple sections atomically. Maximum 30 sections per call.

ParameterTypeDescription
sections*array (1–30)Sections to update. Each item: sectionId (required), name (required)

{ "items": [{ "id": "list_abc" }] }

create_comments write

Adds multiple comments to tasks. Maximum 50 comments per call.

ParameterTypeDescription
comments*array (1–50)Comments to create. Each item: taskId (required), text (required, markdown)

{ "items": [{ "id": "comment_abc", "taskId": "task_xyz" }] }

delete_comments write

Permanently deletes multiple comments. All comments are validated before any are deleted. Maximum 50 comments per call.

ParameterTypeDescription
commentIds*array (1–50)Comment IDs to delete

{ "items": [{ "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\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

Questions? Write to us at [email protected]