Productive MCP Server

MCP server for Productive.io API integration

Local serverstdioGo

What is the Productive MCP Server?

Productive MCP lets Claude, Cursor and other MCP clients work with Productive MCP directly. MCP server for Productive.io API integration.

What Productive MCP does

An MCP (Model Context Protocol) server that enables Claude Desktop, Claude Code, and other MCP-compatible clients to interact with the Productive.io API.

Key capabilities

  • Companies & Projects — List companies and projects with status filtering
  • Folders — Full CRUD with archive/restore for organizing project content
  • Task Lists — Full lifecycle management — create, update, archive/restore, copy, move, reposition
  • Task Management — List, create, update, delete tasks with various filters
  • Subtasks — Create and list subtasks under parent tasks
  • Task Operations — Comments, status updates, sprint assignment, repositioning
  • Comments — Full CRUD with pin/unpin and reactions
  • Todos — Checklist items on tasks — create, update, close/reopen, delete

Practical notes

  • Maintained by berwickgeek, written in Go.

More MCP options

Compare MCP servers by category, or browse hosted MCP servers if you prefer an endpoint over a local process.

Maintainer setup documentation.

Recorded tools

Check the linked publisher documentation and your connected client's tool list. Names and availability can vary with the server version and account permissions.

ToolWhat it does
whoamiGet current user context and configured user ID
list_companiesList companies/customers. Filter by status (active/archived), limit
list_projectsList projects. Filter by status, company_id, limit
list_foldersList folders in a project. Filter by project_id, status (1=active, 2=archived), limit
get_folderGet folder details by folder_id
create_folderCreate a folder. Requires project_id, name
update_folderRename a folder. Requires folder_id, optional name
archive_folderArchive a folder by folder_id
restore_folderRestore an archived folder by folder_id
list_boardsList boards. Filter by project_id, limit
create_boardCreate a board. Requires project_id, name
list_task_listsList task lists. Filter by board_id, limit
create_task_listCreate a task list. Requires board_id, project_id, name
get_task_listGet task list details by task_list_id
update_task_listRename a task list. Requires task_list_id, optional name
archive_task_listArchive a task list by task_list_id
restore_task_listRestore an archived task list by task_list_id
copy_task_listCopy a task list. Requires name, template_id, project_id, board_id. Optional copy_open_tasks, copy_assignees
move_task_listMove a task list to another board. Requires task_list_id, board_id
reposition_task_listReorder a task list. Requires task_list_id, move_before_id
get_task_overviewStart here for any task ID. One call returns metadata, the full description, the most recent comments in full (default 10, comment_limit up to 50) oldest-first,
list_tasksList tasks. Filter by project_id, assignee_id, status (open/closed), limit
get_project_tasksGet all tasks for a project. Requires project_id, optional status
get_taskGet task details by task_id. Metadata only, no comments. Prefer get_task_overview
create_taskCreate a task. Requires title. Optional project_id, board_id, task_list_id, assignee_id ("me" supported), due_date, status
update_task_assignmentAssign/unassign a task. Requires task_id, assignee_id ("me" or "null" supported)
update_task_detailsUpdate title/description. Requires task_id, optional title, description, description_html
update_task_statusSet workflow status by name or ID. Requires task_id and either status_name (e.g. "In Progress", "On Hold") or workflow_status_id. Automatically resolves the tas
delete_taskDelete a task by task_id
my_tasksGet tasks assigned to you. Optional status, limit
reposition_taskReorder a task within a list
update_task_sprintMove task to a sprint/task list
move_task_to_listMove a task to a different task list
add_to_backlogMove a task to the backlog
list_task_dependenciesList dependencies for a task. Filter by task_id (what it blocks) or dependent_task_id (what blocks it)
get_task_dependencyGet dependency details by dependency_id
create_task_dependencyCreate a dependency. Requires task_id (blocker), dependent_task_id (blocked). Optional type_id: 1 = blocks (default), 2 = is blocked by, 3 = related to
delete_task_dependencyRemove a dependency by dependency_id
list_subtasksList subtasks of a parent task. Requires parent_task_id, optional limit
create_subtaskCreate a subtask. Requires parent_task_id, title. Optional project_id, task_list_id, assignee_id, due_date, description
add_task_commentAdd a comment to a task. Requires task_id, comment (supports HTML and @mentions). Optional hidden (boolean) posts an internal comment not visible to clients in
list_commentsList comments. Filter by task_id, project_id, limit. Bodies are truncated to 200 chars; to read a task's thread use get_task_overview instead
get_commentGet full comment details by comment_id
update_commentEdit a comment. Requires comment_id, body
delete_commentDelete a comment by comment_id
pin_commentPin a comment by comment_id
unpin_commentUnpin a comment by comment_id
add_comment_reactionAdd a reaction. Requires comment_id, reaction (e.g. "like")
list_todosList todos on a task. Filter by task_id, status (open/closed), limit
get_todoGet todo details by todo_id
create_todoCreate a todo. Requires description. Optional task_id, deal_id, assignee_id, due_date
update_todoUpdate a todo. Requires todo_id. Optional description, closed (boolean), due_date
delete_todoDelete a todo by todo_id
list_pagesList pages. Filter by project_id, sort (title/created_at/edited_at/updated_at), limit
get_pageGet full page content by page_id
create_pageCreate a page. Requires project_id, title. Optional body (HTML), parent_page_id, root_page_id
update_pageUpdate a page. Requires page_id. Optional title, body
delete_pageDelete a page by page_id
move_pageMove page under another. Requires page_id, target_doc_id
copy_pageCopy a page. Requires template_id. Optional project_id
list_workflow_statusesList workflow statuses. Filter by workflow_id, category_id (1=Not Started, 2=Started, 3=Closed), limit
list_time_entriesList time entries. Filter by date, after, before, person_id, project_id, task_id, service_id
create_time_entryCreate a time entry. Requires date, time (minutes), person_id, service_id. Optional task_id, note
update_time_entryAmend a time entry by time_entry_id. Optional time, note, date, service_id, billable_time. Only the fields supplied are changed
delete_time_entryPermanently delete a time entry by time_entry_id. Requires confirm: true on a second call
list_servicesList services. Filter by company_id, limit
get_project_servicesGet services for a project
list_project_dealsList deals/budgets for a project
list_deal_servicesList services for a deal/budget
list_activitiesList activities. Filter by task_id, project_id, person_id, item_type, event, after, before
get_recent_updatesGet recent updates. Optional limit, hours

How to install the Productive MCP Server

{
  "mcpServers": {
    "productive": {
      "command": "npx",
      "args": [
        "-y",
        "productive-mcp"
      ],
      "env": {
        "PRODUCTIVE_API_TOKEN": "YOUR_PRODUCTIVE_API_TOKEN",
        "PRODUCTIVE_ORG_ID": "your_organization_id_here",
        "PRODUCTIVE_USER_ID": "your_user_id_here"
      }
    }
  }
}

From the project documentation. Replace placeholders and example paths before connecting.

Configuration

VariableDescriptionRequired
PRODUCTIVE_API_TOKENDeclared in the maintainer’s client configuration.Check documentation
PRODUCTIVE_ORG_IDDeclared in the maintainer’s client configuration.Check documentation
PRODUCTIVE_USER_IDDeclared in the maintainer’s client configuration.Yes

Example prompts to try

  • “Use Productive MCP to macOS.”
  • “Use Productive MCP to Windows.”
  • “Use Productive MCP to whoami.”

Frequently asked questions

MCP server for Productive.io API integration Confirm the tools offered by your installed version in the connected client. Tool availability and permissions depend on the server and account configuration.