Minimal project management for teams and AI agents.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Mark an existing task as completed or reopen it. Use this instead of create_task when the task already exists and you only need to change its completion state. The taskId is the internal document ID from list_tasks — NOT the public task number (e.g. SCD-408). To resolve a public number to an internal ID, call list_tasks with workspaceId + number first.
Internal task ID (from list_tasks `id` field, not the public SCD-XXX number)
True to complete, false to reopen (default: true)
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Mark an existing task as completed or reopen it. Use this instead of create_task when the task already exists and you only need to change its completion state. The taskId is the internal document ID from list_tasks — NOT the public task number (e.g. SCD-408). To resolve a public number to an internal ID, call list_tasks with workspaceId + number first.
| Argument | Type | Description |
|---|---|---|
| taskId* | string | Internal task ID (from list_tasks `id` field, not the public SCD-XXX number) |
| isCompleted | boolean | True to complete, false to reopen (default: true) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"taskId"
],
"properties": {
"taskId": {
"type": "string",
"description": "Internal task ID (from list_tasks `id` field, not the public SCD-XXX number)"
},
"isCompleted": {
"type": "boolean",
"description": "True to complete, false to reopen (default: true)"
}
}
}Mark multiple tasks as completed in one action. Use this instead of calling complete_task multiple times. Already-completed tasks are left as-is.
| Argument | Type | Description |
|---|---|---|
| taskIds* | array | Internal task IDs to complete (1–100) |
| isCompleted | boolean | True to complete, false to reopen (default: true) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"taskIds"
],
"properties": {
"taskIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"description": "Internal task IDs to complete (1–100)"
},
"isCompleted": {
"type": "boolean",
"description": "True to complete, false to reopen (default: true)"
}
}
}Add a comment to a task. The taskId is the internal document ID from list_tasks — NOT the public task number (e.g. SCD-408).
| Argument | Type | Description |
|---|---|---|
| text* | string | Comment text. Supports markdown: # headings, - bullets, 1. numbered lists, **bold**, *italic*, `code`, > blockquote. |
| taskId* | string | Internal task ID (from list_tasks `id` field, not the public SCD-XXX number) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"taskId",
"text"
],
"properties": {
"text": {
"type": "string",
"description": "Comment text. Supports markdown: # headings, - bullets, 1. numbered lists, **bold**, *italic*, `code`, > blockquote."
},
"taskId": {
"type": "string",
"description": "Internal task ID (from list_tasks `id` field, not the public SCD-XXX number)"
}
}
}Add multiple comments to tasks in one action. Use this instead of calling create_comment multiple times.
| Argument | Type | Description |
|---|---|---|
| comments* | array | Comments to create (1–50) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"comments"
],
"properties": {
"comments": {
"type": "array",
"items": {
"type": "object",
"required": [
"taskId",
"text"
],
"properties": {
"text": {
"type": "string",
"description": "Comment text (markdown supported)"
},
"taskId": {
"type": "string",
"description": "Internal task ID"
}
}
},
"maxItems": 50,
"minItems": 1,
"description": "Comments to create (1–50)"
}
}
}Create a new project in a workspace. If a project with the same name already exists in the workspace, returns the existing project instead of creating a duplicate — check the `created` field in the response to tell the two cases apart.
| Argument | Type | Description |
|---|---|---|
| name* | string | Project name |
| description | string | Project description |
| workspaceId* | string | Workspace ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"workspaceId",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Project name"
},
"description": {
"type": "string",
"description": "Project description"
},
"workspaceId": {
"type": "string",
"description": "Workspace ID"
}
}
}Create a new section (column) 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 the `created` field in the response to tell the two cases apart.
| Argument | Type | Description |
|---|---|---|
| name* | string | Section name |
| projectId* | string | Project ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Section name"
},
"projectId": {
"type": "string",
"description": "Project ID"
}
}
}Create multiple sections in a project in one action. Use this instead of calling create_section multiple times.
| Argument | Type | Description |
|---|---|---|
| sections* | array | Sections to create (1–30) |
| projectId* | string | Project ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId",
"sections"
],
"properties": {
"sections": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Section name"
}
}
},
"maxItems": 30,
"minItems": 1,
"description": "Sections to create (1–30)"
},
"projectId": {
"type": "string",
"description": "Project ID"
}
}
}Create a new task in a project section. Only call this tool when creating a brand-new task that does not yet exist. To change the name, status, assignee, or description of an existing task, call update_task instead. To mark an existing task as done, call complete_task instead. If unsure whether a task already exists, call list_tasks first.
| Argument | Type | Description |
|---|---|---|
| name* | string | Task name |
| labels | array | Label IDs or names (from list_labels). Names match case-insensitively. Labels are never created automatically — an unknown one is an error. |
| listId* | string | Section ID |
| statusId | string | Initial status ID |
| projectId* | string | Project ID |
| assigneeId | string | Assignee user ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId",
"listId",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Task name"
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Label IDs or names (from list_labels). Names match case-insensitively. Labels are never created automatically — an unknown one is an error."
},
"listId": {
"type": "string",
"description": "Section ID"
},
"statusId": {
"type": "string",
"description": "Initial status ID"
},
"projectId": {
"type": "string",
"description": "Project ID"
},
"assigneeId": {
"type": "string",
"description": "Assignee user ID"
}
}
}Create multiple tasks in a project in one action. Use this instead of calling create_task multiple times when the user asks to create several tasks at once. All tasks are created atomically — if validation fails for any item, nothing is created.
| Argument | Type | Description |
|---|---|---|
| tasks* | array | Tasks to create (1–50) |
| listId | string | Default section ID for all tasks (can be overridden per task) |
| projectId* | string | Project ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId",
"tasks"
],
"properties": {
"tasks": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Task name"
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Label IDs or names (from list_labels); names match case-insensitively. Unknown labels are an error — they are never created automatically."
},
"listId": {
"type": "string",
"description": "Section ID for this task (overrides default listId)"
},
"dueDate": {
"type": "string",
"description": "Due date (ISO date string)"
},
"statusId": {
"type": "string",
"description": "Status ID"
},
"assigneeId": {
"type": "string",
"description": "Assignee user ID"
},
"description": {
"type": "string",
"description": "Description (markdown)"
}
}
},
"maxItems": 50,
"minItems": 1,
"description": "Tasks to create (1–50)"
},
"listId": {
"type": "string",
"description": "Default section ID for all tasks (can be overridden per task)"
},
"projectId": {
"type": "string",
"description": "Project ID"
}
}
}Delete a comment from a task.
| Argument | Type | Description |
|---|---|---|
| commentId* | string | Comment ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"commentId"
],
"properties": {
"commentId": {
"type": "string",
"description": "Comment ID"
}
}
}Delete multiple comments in one action. Use this instead of calling delete_comment multiple times. All comments are validated before any are deleted.
| Argument | Type | Description |
|---|---|---|
| commentIds* | array | Comment IDs to delete (1–50) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"commentIds"
],
"properties": {
"commentIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Comment IDs to delete (1–50)"
}
}
}Permanently delete a task. Comments and attachments are removed automatically. The taskId is the internal document ID from list_tasks — NOT the public task number (e.g. SCD-408).
| Argument | Type | Description |
|---|---|---|
| taskId* | string | Internal task ID (from list_tasks `id` field, not the public SCD-XXX number) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"taskId"
],
"properties": {
"taskId": {
"type": "string",
"description": "Internal task ID (from list_tasks `id` field, not the public SCD-XXX number)"
}
}
}Permanently delete multiple tasks in one action. Use this instead of calling delete_task multiple times. All tasks are validated before any are deleted.
| Argument | Type | Description |
|---|---|---|
| taskIds* | array | Internal task IDs to delete (1–50) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"taskIds"
],
"properties": {
"taskIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Internal task IDs to delete (1–50)"
}
}
}Get full details of a task. You can look up by internal taskId OR by public task identifier. To resolve a public ID like 'TES-1' or 'SCD-409', pass it as taskId — the prefix is used to find the correct workspace automatically. Alternatively, pass workspaceId + number (digits only).
| Argument | Type | Description |
|---|---|---|
| number | number | Public task number (digits only — e.g. 409 from SCD-409). Requires workspaceId unless taskId contains the prefix. |
| taskId | string | Internal task ID OR full public task identifier (e.g. 'TES-1', 'SCD-409'). When a prefixed ID is passed, the prefix is used to locate the correct workspace automatically. |
| workspaceId | string | Workspace ID. Used when looking up by number without a prefix. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"number": {
"type": "number",
"description": "Public task number (digits only — e.g. 409 from SCD-409). Requires workspaceId unless taskId contains the prefix."
},
"taskId": {
"type": "string",
"description": "Internal task ID OR full public task identifier (e.g. 'TES-1', 'SCD-409'). When a prefixed ID is passed, the prefix is used to locate the correct workspace automatically."
},
"workspaceId": {
"type": "string",
"description": "Workspace ID. Used when looking up by number without a prefix."
}
}
}List task activity history (status changes, assignments, moves, etc.) over a time range. Use it for time-based questions like which tasks were completed last week or what someone did. Filters: from/to (ISO 8601 dates), actorId (who made the change — get userIds from list_members), type ('task_status_changed', or 'completed' for transitions into a Done status), and projectId. Each row gives the task identifier, the status change, who did it, and the task's owner and assignee.
| Argument | Type | Description |
|---|---|---|
| to | string | End of range, ISO 8601 |
| from | string | Start of range, ISO 8601 (e.g. 2026-06-01) |
| type | string | Event type, e.g. 'task_status_changed' or 'completed' |
| limit | number | Max rows (default 100, max 500) |
| actorId | string | Only changes made by this userId |
| projectId | string | Limit to one project |
| workspaceId* | string | Workspace ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"workspaceId"
],
"properties": {
"to": {
"type": "string",
"description": "End of range, ISO 8601"
},
"from": {
"type": "string",
"description": "Start of range, ISO 8601 (e.g. 2026-06-01)"
},
"type": {
"type": "string",
"description": "Event type, e.g. 'task_status_changed' or 'completed'"
},
"limit": {
"type": "number",
"description": "Max rows (default 100, max 500)"
},
"actorId": {
"type": "string",
"description": "Only changes made by this userId"
},
"projectId": {
"type": "string",
"description": "Limit to one project"
},
"workspaceId": {
"type": "string",
"description": "Workspace ID"
}
}
}List a task's comments, oldest first. The taskId is the internal document ID from list_tasks — NOT the public SCD-XXX number.
| Argument | Type | Description |
|---|---|---|
| taskId* | string | Internal task ID (from list_tasks `id` field, not the public SCD-XXX number) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"taskId"
],
"properties": {
"taskId": {
"type": "string",
"description": "Internal task ID (from list_tasks `id` field, not the public SCD-XXX number)"
}
}
}List task labels for a workspace. Use the returned IDs (or names) as `labels` when creating or updating tasks.
| Argument | Type | Description |
|---|---|---|
| workspaceId* | string | Workspace ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"workspaceId"
],
"properties": {
"workspaceId": {
"type": "string",
"description": "Workspace ID"
}
}
}List workspace members with their userId, name, email, and role. Use userId as assigneeId when creating or updating tasks.
| Argument | Type | Description |
|---|---|---|
| workspaceId* | string | Workspace ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"workspaceId"
],
"properties": {
"workspaceId": {
"type": "string",
"description": "Workspace ID"
}
}
}List projects in a workspace.
| Argument | Type | Description |
|---|---|---|
| workspaceId* | string | Workspace ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"workspaceId"
],
"properties": {
"workspaceId": {
"type": "string",
"description": "Workspace ID"
}
}
}List sections (columns) in a project.
| Argument | Type | Description |
|---|---|---|
| projectId* | string | Project ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId"
],
"properties": {
"projectId": {
"type": "string",
"description": "Project ID"
}
}
}List workflow statuses for a workspace. Use the returned IDs as statusId when creating or updating tasks.
| Argument | Type | Description |
|---|---|---|
| workspaceId* | string | Workspace ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"workspaceId"
],
"properties": {
"workspaceId": {
"type": "string",
"description": "Workspace ID"
}
}
}List tasks in a project, or look up a specific task by its public number. To resolve a public ID like 'TES-1': pass taskPrefix='TES' and number=1 — the prefix locates the correct workspace automatically (do NOT hardcode workspaceId when the prefix belongs to a different workspace). Alternatively pass workspaceId + number when you are certain of the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max number of tasks to return (default: 100, max: 500) |
| listId | string | Filter by section ID |
| number | number | Look up a task by its public number (digits only — e.g. 1 from TES-1). Requires either taskPrefix or workspaceId. projectId is ignored when number is provided. |
| statusId | string | Filter by status ID |
| projectId | string | Project ID. Required unless number is provided. |
| taskPrefix | string | Task prefix (e.g. 'TES' from TES-1). When provided with number, the workspace is located by prefix automatically — use this instead of workspaceId when the prefix is known. |
| workspaceId | string | Workspace ID. Use when searching by number and you know the workspace. Ignored when taskPrefix is provided. |
List all Plate workspaces the user is a member of.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Rename a project or update its description.
| Argument | Type | Description |
|---|---|---|
| name | string | New project name |
| projectId* | string | Project ID |
| description | any | New project description (null to clear) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"projectId"
],
"properties": {
"name": {
"type": "string",
"description": "New project name"
},
"projectId": {
"type": "string",
"description": "Project ID"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "New project description (null to clear)"
}
}
}Rename a section.
| Argument | Type | Description |
|---|---|---|
| name* | string | New section name |
| sectionId* | string | Section ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sectionId",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "New section name"
},
"sectionId": {
"type": "string",
"description": "Section ID"
}
}
}Rename multiple sections in one action. Use this instead of calling update_section multiple times.
| Argument | Type | Description |
|---|---|---|
| sections* | array | Sections to update (1–30) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sections"
],
"properties": {
"sections": {
"type": "array",
"items": {
"type": "object",
"required": [
"sectionId",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "New section name"
},
"sectionId": {
"type": "string",
"description": "Section ID"
}
}
},
"maxItems": 30,
"minItems": 1,
"description": "Sections to update (1–30)"
}
}
}Update one or more fields on an existing task. Use this instead of create_task when the task already exists. The taskId is the internal document ID from list_tasks — NOT the public task number (e.g. SCD-408). To resolve a public number to an internal ID, call list_tasks with workspaceId + number first.
| Argument | Type | Description |
|---|---|---|
| name | string | New task name |
| labels | array | Replace the task's labels with these IDs or names (from list_labels). Names match case-insensitively; pass [] to clear. This REPLACES the list, it does not append. Labels are never created automatically — an unknown one is an error. |
| listId | string | Move to a different section (must belong to the same project) |
| taskId* | string | Internal task ID (from list_tasks `id` field, not the public SCD-XXX number) |
| statusId | string | New status ID |
| assigneeId | any | New assignee user ID (null to unassign) |
| description | string | New description. Supports markdown: # headings, - bullets, 1. numbered lists, **bold**, *italic*, `code`, > blockquote. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"taskId"
],
"properties": {
"name": {
"type": "string",
"description": "New task name"
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Replace the task's labels with these IDs or names (from list_labels). Names match case-insensitively; pass [] to clear. This REPLACES the list, it does not append. Labels are never created automatically — an unknown one is an error."
},
"listId": {
"type": "string",
"description": "Move to a different section (must belong to the same project)"
},
"taskId": {
"type": "string",
"description": "Internal task ID (from list_tasks `id` field, not the public SCD-XXX number)"
},
"statusId": {
"type": "string",
"description": "New status ID"
},
"assigneeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "New assignee user ID (null to unassign)"
},
"description": {
"type": "string",
"description": "New description. Supports markdown: # headings, - bullets, 1. numbered lists, **bold**, *italic*, `code`, > blockquote."
}
}
}Update multiple existing tasks in one action. Use this instead of calling update_task multiple times when the user asks to change several tasks at once. All updates are applied atomically.
| Argument | Type | Description |
|---|---|---|
| tasks* | array | Tasks to update (1–50) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tasks"
],
"properties": {
"tasks": {
"type": "array",
"items": {
"type": "object",
"required": [
"taskId"
],
"properties": {
"name": {
"type": "string",
"description": "New task name"
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "REPLACE this task's labels with these IDs or names (from list_labels); [] clears them. Unknown labels are an error — they are never created automatically."
},
"listId": {
"type": "string",
"description": "Move to a different section"
},
"taskId": {
"type": "string",
"description": "Internal task ID"
},
"dueDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "New due date (ISO date string, null to clear)"
},
"statusId": {
"type": "string",
"description": "New status ID"
},
"assigneeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "New assignee user ID (null to unassign)"
},
"description": {
"type": "string",
"description": "New description (markdown)"
}
}
},
"maxItems": 50,
"minItems": 1,
"description": "Tasks to update (1–50)"
}
}
}| includeCompleted | boolean | Include completed tasks (default: false) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "number",
"description": "Max number of tasks to return (default: 100, max: 500)"
},
"listId": {
"type": "string",
"description": "Filter by section ID"
},
"number": {
"type": "number",
"description": "Look up a task by its public number (digits only — e.g. 1 from TES-1). Requires either taskPrefix or workspaceId. projectId is ignored when number is provided."
},
"statusId": {
"type": "string",
"description": "Filter by status ID"
},
"projectId": {
"type": "string",
"description": "Project ID. Required unless number is provided."
},
"taskPrefix": {
"type": "string",
"description": "Task prefix (e.g. 'TES' from TES-1). When provided with number, the workspace is located by prefix automatically — use this instead of workspaceId when the prefix is known."
},
"workspaceId": {
"type": "string",
"description": "Workspace ID. Use when searching by number and you know the workspace. Ignored when taskPrefix is provided."
},
"includeCompleted": {
"type": "boolean",
"description": "Include completed tasks (default: false)"
}
}
}