add_comment_reaction
Add a reaction (e.g. "like") to a comment in Productive.io.
Run Productive.io from the conversation — tasks, boards, comments, todos, docs and dependencies — with the timesheet path laid out step by step so time lands on the right budget.
LABSCO SUMMARY
Breadth is the obvious part — tasks, boards, comments, todos, documents and dependencies are all here. The design detail worth noticing is time tracking: logging time in Productive needs the right deal and the right service, and these tools name their own order, so an agent walks project, deal, service, task, entry rather than guessing and filing hours against the wrong budget. Read-only tokens are supported, which is a sensible starting point given delete_task and delete_page sit in the same set.
A server over the Productive.io API covering most of the project-management surface: companies and projects, boards, task lists and folders, tasks with subtasks and dependencies, comments and todos, pages and documents, people, workflow statuses, activity feeds and time entries.
Published as productive-mcp and launched over stdio with npx, or installed globally. PRODUCTIVE_API_TOKEN and PRODUCTIVE_ORG_ID are required; the token is generated under Settings → API integrations in Productive.io and can be read-only if you only want reads. PRODUCTIVE_USER_ID is optional and is what makes my_tasks and the "me" references resolve.
One command plus a key — npm install -g productive-mcp, then supply credentials
USE CASES
Confirm which user you are configured as, pull what is assigned to you, and read what changed across the organisation since yesterday.
Walk the sequence the tools describe — the project's deals, that deal's services, the project's tasks — and only then create the entry.
Create the task, break it into subtasks, and leave the context as a comment with formatting and mentions intact.
Read the workflow statuses the board actually defines, set the one you want, and hand the task to the right person.
Create the board, copy the task lists you reuse every time, and add the ones specific to this piece of work.
Create a typed dependency between two tasks and list the existing ones for a task before promising a date.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
add_comment_reactionAdd a reaction (e.g. "like") to a comment in Productive.io.
add_task_commentAdd a comment to a task in Productive.io. Supports HTML formatting and @mentions (e.g. @Jarrod Lawson). Mentions are automatically resolved to notify the mentioned person. Set hidden to true to post an internal comment that is not visible to clients in the client portal (hidden comments are not available in internal projects).
add_to_backlogAdd a task to the project backlog. Creates a Backlog task list if it doesn't exist.
archive_folderArchive a folder in Productive.io
archive_task_listArchive a task list in Productive.io.
copy_pageCopy a page/document from a template in Productive.io.
copy_task_listCopy a task list from a template in Productive.io.
create_boardCreate a new board in a Productive.io project
create_folderCreate a new folder in a Productive.io project
create_pageCreate a new page/document in Productive.io. The body supports HTML formatting.
create_subtaskCreate a subtask under a parent task in Productive.io
create_taskCreate a new task in Productive.io. If PRODUCTIVE_USER_ID is configured, you can use "me" to refer to the configured user when assigning.
create_task_dependencyCreate a dependency between two tasks. Use type_id 1 for "blocks" (task must finish before dependent_task can start), 2 for "is blocked by", 3 for "related to".
create_task_listCreate a new task list in a Productive.io board. Task lists help organize tasks within boards.
create_time_entrySTEP 5 (FINAL) of timesheet workflow: Create a time entry with detailed work description. COMPLETE WORKFLOW: 1) list_projects → 2) list_project_deals → 3) list_deal_services → 4) list_project_tasks (recommended) → 5) create_time_entry. You MUST provide: valid service_id from the hierarchy, detailed work notes (minimum 10 chars), and optionally link to a specific task_id. This tool requires confirmation before creating. If PRODUCTIVE_USER_ID is configured, use "me" for person_id.
create_todoCreate a new todo in Productive.io.
delete_commentDelete a comment by ID from Productive.io.
delete_pageDelete a page/document from Productive.io.
delete_taskDelete a task from Productive.io by its ID
delete_task_dependencyDelete a task dependency by ID.
delete_todoDelete a todo from Productive.io.
get_commentGet a single comment by ID from Productive.io with all attributes.
get_folderGet details of a specific folder from Productive.io
get_pageGet a single page/document from Productive.io by ID, including full body content, creator, and project details.
get_personGet details of a specific person by their ID.
get_project_servicesDEPRECATED: Use the proper workflow instead: list_projects → list_project_deals → list_deal_services → create_time_entry. This tool does not properly handle the project → deal/budget → service hierarchy required for timesheet entries.
get_project_tasksGet all tasks for a specific project. ALSO used as STEP 4 in timesheet workflow to find task_id for linking time entries to specific tasks. Workflow: list_projects → list_project_deals → list_deal_services → get_project_tasks → create_time_entry.
get_recent_updatesGet a summary of recent updates and changes in the last N days, with detailed breakdown by item type
get_taskGet detailed information about a specific task by ID
get_task_dependencyGet details of a specific task dependency by ID.
get_task_listGet a single task list by ID from Productive.io.
get_todoGet a single todo by ID from Productive.io with all attributes.
list_activitiesList activities (changes/updates) from Productive.io with filtering options for tracking recent work
list_boardsGet a list of boards from Productive.io
list_commentsList comments in Productive.io, optionally filtered by task or project.
list_companiesGet a list of companies/customers from Productive.io
list_deal_servicesSTEP 3 of timesheet workflow: Get services for a specific deal/budget. COMPLETE WORKFLOW: 1) list_projects → 2) list_project_deals → 3) list_deal_services → 4) list_project_tasks (recommended) → 5) create_time_entry. After this, optionally use list_project_tasks to find specific tasks to link your time entry to.
list_foldersGet a list of folders from Productive.io
list_pagesList pages/documents from Productive.io. Optionally filter by project and sort by various fields.
list_peopleList people/members in the organization. Use project_id to see who is on a specific project. Returns person IDs that can be used with update_task_assignment.
list_project_dealsSTEP 2 of timesheet workflow: Get deals/budgets for a specific project. COMPLETE WORKFLOW: 1) list_projects → 2) list_project_deals → 3) list_deal_services → 4) list_project_tasks (recommended) → 5) create_time_entry. This follows: Project → Deal/Budget → Service → Task → Time Entry.
list_projectsGet a list of projects from Productive.io
list_servicesList all services in the organization. NOTE: For timesheet entries, use the proper workflow instead: list_projects → list_project_deals → list_deal_services → create_time_entry. This tool shows all services but does not indicate which project/budget they belong to.
list_subtasksList subtasks of a parent task in Productive.io
list_task_dependenciesList task dependencies (blockers/related tasks). Filter by task_id to see what a task blocks, or dependent_task_id to see what blocks a task.
list_task_listsGet a list of task lists from Productive.io. Task lists organize tasks within boards.
list_tasksGet a list of tasks from Productive.io
list_time_entriesView existing time entries from Productive.io with detailed information including service and budget relationships. Use this to see what time has been logged and to which projects/services. If PRODUCTIVE_USER_ID is configured, you can use "me" to refer to the configured user for person_id.
list_todosList todos from Productive.io, optionally filtered by task and status.
list_workflow_statusesList workflow statuses available in Productive.io. These are used to set task status (Not Started=1, Started=2, Closed=3).
move_pageMove a page/document under another page in Productive.io.
move_task_listMove a task list to a different board in Productive.io.
move_task_to_listMove a task to a different task list within the same project
my_tasksGet tasks assigned to you (requires PRODUCTIVE_USER_ID to be configured)
pin_commentPin a comment in Productive.io so it appears prominently.
reposition_taskReposition a task in a task list
reposition_task_listReposition a task list before another task list in Productive.io.
restore_folderRestore an archived folder in Productive.io
restore_task_listRestore a previously archived task list in Productive.io.
unpin_commentUnpin a previously pinned comment in Productive.io.
update_commentUpdate the body of an existing comment in Productive.io. Supports @mentions (e.g. @Jarrod Lawson) which are automatically resolved.
update_folderUpdate an existing folder in Productive.io
update_pageUpdate an existing page/document in Productive.io. Supports updating title and/or body.
update_task_assignmentUpdate the assignee of an existing task. If PRODUCTIVE_USER_ID is configured, you can use "me" to refer to the configured user. To unassign, use "null" as a string.
update_task_detailsUpdate the title (name) and/or description of an existing task. At least one field must be provided.
update_task_listUpdate an existing task list in Productive.io.
update_task_sprintUpdate the sprint(s) assigned to a task. Sprints are tracked using a custom field.
update_task_statusUpdate the status of a task in Productive.io. You can provide a status_name (e.g. "In Progress", "Done", "QA Review") and it will automatically resolve to the correct workflow status for that task. Supports custom workflow statuses. Falls back to workflow_status_id if provided directly.
update_todoUpdate an existing todo in Productive.io.
whoamiGet the current user context. Shows which user ID is configured as "me" for all operations.
BEFORE YOU INSTALL
70 tools when we connected; the project documents 72. get_task_overview, the tool the documentation says to call first, and get_attachment may be missing on older builds; get_task plus list_comments still works but truncates comment bodies to 200 characters.
INSTALLATION
npm install -g productive-mcp{
"mcpServers": {
"productive": {
"command": "npx",
"args": [
"-y",
"productive-mcp"
],
"env": {
"PRODUCTIVE_API_TOKEN": "<YOUR_PRODUCTIVE_API_TOKEN>",
"PRODUCTIVE_ORG_ID": "<YOUR_PRODUCTIVE_ORG_ID>",
"PRODUCTIVE_USER_ID": "<YOUR_PRODUCTIVE_USER_ID>"
}
}
}
}{
"mcpServers": {
"productive": {
"command": "productive-mcp",
"env": {
"PRODUCTIVE_API_TOKEN": "<YOUR_PRODUCTIVE_API_TOKEN>",
"PRODUCTIVE_ORG_ID": "<YOUR_PRODUCTIVE_ORG_ID>",
"PRODUCTIVE_USER_ID": "<YOUR_PRODUCTIVE_USER_ID>"
}
}
}
}git clone https://github.com/berwickgeek/productive-mcp.git
cd productive-mcp
npm install
npm run build{
"mcpServers": {
"productive": {
"command": "node",
"args": [
"<YOUR_PATH_TO_PRODUCTIVE_MCP>/build/index.js"
],
"env": {
"PRODUCTIVE_API_TOKEN": "<YOUR_PRODUCTIVE_API_TOKEN>",
"PRODUCTIVE_ORG_ID": "<YOUR_PRODUCTIVE_ORG_ID>",
"PRODUCTIVE_USER_ID": "<YOUR_PRODUCTIVE_USER_ID>"
}
}
}
}<YOUR_PATH_TO_PRODUCTIVE_MCP> is the folder you cloned.