An MCP (Model Context Protocol) server that enables Claude Desktop, Claude Code, and other MCP-compatible clients to interact with the Productive.io API.
- Companies & Projects: List companies and projects with status filtering
- Task Management: List, create, and get individual tasks with various filters
- Task Operations: Add comments to tasks and update task status via workflow statuses
- Board & Task List Management: Create and manage boards and task lists within projects
- People Management: List people in your organization with filtering options
- Workflow Management: List and work with workflow statuses for proper task status updates
- User Context: Supports "me" references when PRODUCTIVE_USER_ID is configured
- Activity Tracking: View activities and recent updates across your organization
Install globally:
npm install -g productive-mcpOr run directly with npx (no installation required):
npx productive-mcp- Clone this repository
- Install dependencies:
npm install
- Build the project:
npm run build
To obtain your Productive.io credentials:
- Log in to Productive.io
- Go to Settings → API integrations
- Generate a new token (choose read-only for safety, or full access for task creation)
- Copy the token and organization ID
To find your user ID:
- You can use the API to list people and find your ID
- Or check the URL when viewing your profile in Productive.io
The server requires the following environment variables:
| Variable | Required | Description |
|---|---|---|
PRODUCTIVE_API_TOKEN |
Yes | Your Productive.io API token |
PRODUCTIVE_ORG_ID |
Yes | Your organization ID |
PRODUCTIVE_USER_ID |
No | Your user ID (required for my_tasks tool) |
Add the server to your Claude Desktop configuration file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"productive": {
"command": "npx",
"args": ["-y", "productive-mcp"],
"env": {
"PRODUCTIVE_API_TOKEN": "your_api_token_here",
"PRODUCTIVE_ORG_ID": "your_organization_id_here",
"PRODUCTIVE_USER_ID": "your_user_id_here"
}
}
}
}{
"mcpServers": {
"productive": {
"command": "productive-mcp",
"env": {
"PRODUCTIVE_API_TOKEN": "your_api_token_here",
"PRODUCTIVE_ORG_ID": "your_organization_id_here",
"PRODUCTIVE_USER_ID": "your_user_id_here"
}
}
}
}{
"mcpServers": {
"productive": {
"command": "node",
"args": ["/path/to/productive-mcp/build/index.js"],
"env": {
"PRODUCTIVE_API_TOKEN": "your_api_token_here",
"PRODUCTIVE_ORG_ID": "your_organization_id_here",
"PRODUCTIVE_USER_ID": "your_user_id_here"
}
}
}
}Note: PRODUCTIVE_USER_ID is optional but required for the my_tasks tool to work.
After adding the configuration, restart Claude Desktop.
Add the server to your Claude Code configuration using the CLI:
claude mcp add productive -- npx -y productive-mcpThen set your environment variables. You can either:
Option 1: Add to your shell profile (~/.zshrc or ~/.bashrc):
export PRODUCTIVE_API_TOKEN="your_api_token_here"
export PRODUCTIVE_ORG_ID="your_organization_id_here"
export PRODUCTIVE_USER_ID="your_user_id_here"Option 2: Create a wrapper script and add it as an MCP server:
-
Create a script file (e.g.,
~/scripts/productive-mcp.sh):#!/bin/bash export PRODUCTIVE_API_TOKEN="your_api_token_here" export PRODUCTIVE_ORG_ID="your_organization_id_here" export PRODUCTIVE_USER_ID="your_user_id_here" npx -y productive-mcp
-
Make it executable:
chmod +x ~/scripts/productive-mcp.sh -
Add to Claude Code:
claude mcp add productive ~/scripts/productive-mcp.sh
Option 3: Edit the Claude Code settings file directly at ~/.claude/settings.json:
{
"mcpServers": {
"productive": {
"command": "npx",
"args": ["-y", "productive-mcp"],
"env": {
"PRODUCTIVE_API_TOKEN": "your_api_token_here",
"PRODUCTIVE_ORG_ID": "your_organization_id_here",
"PRODUCTIVE_USER_ID": "your_user_id_here"
}
}
}
}Restart Claude Code after configuration.
Get the current user context and check which user ID is configured for "me" operations.
Get a list of companies/customers from Productive.io
Parameters:
status(optional): Filter by company status ('active' or 'archived')limit(optional): Number of companies to return (1-200, default: 30)
Get a list of projects from Productive.io
Parameters:
status(optional): Filter by project status ('active' or 'archived')company_id(optional): Filter projects by company IDlimit(optional): Number of projects to return (1-200, default: 30)
Get a list of boards from projects
Parameters:
project_id(optional): Filter boards by project IDlimit(optional): Number of boards to return (max 200, default: 30)
Create a new board in a Productive.io project
Parameters:
project_id(required): The ID of the project to create the board inname(required): Name of the boarddescription(optional): Description of the board
Get a list of task lists from boards
Parameters:
board_id(optional): Filter task lists by board IDlimit(optional): Number of task lists to return (max 200, default: 30)
Create a new task list in a board
Parameters:
board_id(required): The ID of the board to create the task list inproject_id(required): The ID of the projectname(required): Name of the task listdescription(optional): Description of the task list
Get a list of tasks from Productive.io
Parameters:
project_id(optional): Filter tasks by project IDassignee_id(optional): Filter tasks by assignee IDstatus(optional): Filter by task status ('open' or 'closed')limit(optional): Number of tasks to return (1-200, default: 30)
Get all tasks for a specific project
Parameters:
project_id(required): The ID of the projectstatus(optional): Filter by task status ('open' or 'closed')
Get detailed information about a specific task
Parameters:
task_id(required): The ID of the task to retrieve
Create a new task in Productive.io
Parameters:
title(required): Task titledescription(optional): Task descriptionproject_id(optional): ID of the project to add the task toboard_id(optional): ID of the board to add the task totask_list_id(optional): ID of the task list to add the task toassignee_id(optional): ID of the person to assign (use "me" for configured user)due_date(optional): Due date in YYYY-MM-DD formatstatus(optional): Task status ('open' or 'closed', default: 'open')
Update the assignee of an existing task
Parameters:
task_id(required): ID of the task to updateassignee_id(required): ID of the person to assign (use "me" for configured user, "null" to unassign)
Get tasks assigned to you (requires PRODUCTIVE_USER_ID to be configured)
Parameters:
status(optional): Filter by task status ('open' or 'closed')limit(optional): Number of tasks to return (1-200, default: 30)
Add a comment to a task
Parameters:
task_id(required): ID of the task to add the comment tocomment(required): Text content of the comment
Update the status of a task using workflow status ID
Parameters:
task_id(required): ID of the task to updateworkflow_status_id(required): ID of the workflow status to set
List workflow statuses available in Productive.io (used for task status updates)
Parameters:
workflow_id(optional): Filter by workflow IDcategory_id(optional): Filter by category (1=Not Started, 2=Started, 3=Closed)limit(optional): Number of statuses to return (1-200, default: 50)
List people in the organization with optional filters
Parameters:
company_id(optional): Filter people by company IDproject_id(optional): Filter people assigned to a specific projectis_active(optional): Filter by active statusemail(optional): Filter by email addresslimit(optional): Maximum number of people to return (default: 50, max: 100)page(optional): Page number for pagination (default: 1)
Get all people assigned to a specific project
Parameters:
project_id(required): The project ID to get people foris_active(optional): Filter by active status (default: true)limit(optional): Maximum number of people to return (default: 50, max: 100)page(optional): Page number for pagination (default: 1)
List activities and changes across your organization
Parameters:
task_id(optional): Filter activities by task IDproject_id(optional): Filter activities by project IDperson_id(optional): Filter activities by person IDitem_type(optional): Filter by item typeevent(optional): Filter by event typeafter(optional): Filter activities after this date (ISO 8601 format)before(optional): Filter activities before this date (ISO 8601 format)limit(optional): Number of activities to returnpage(optional): Page number for pagination
Get recent updates and activities in a summarized format
Parameters:
limit(optional): Number of recent updates to return (default: 20)hours(optional): Number of hours to look back (default: 24)
To update a task's status, you need to use workflow status IDs rather than simple "open"/"closed" values:
-
First, list available workflow statuses:
list_workflow_statusesThis will show you all available statuses with their IDs and categories (Not Started=1, Started=2, Closed=3).
-
Then update the task status:
update_task_status { "task_id": "12399194", "workflow_status_id": "specific_status_id_from_step_1" }
When PRODUCTIVE_USER_ID is configured, you can use "me" in several tools:
create_taskwith"assignee_id": "me"update_task_assignmentwith"assignee_id": "me"my_tasksto get your assigned taskswhoamito verify your configured user context
- Create a board:
create_board - Create task lists:
create_task_list - Create tasks:
create_task - Add comments:
add_task_comment - Update status: Use
list_workflow_statusesthenupdate_task_status - Track progress: Use
list_activitiesorget_recent_updates
- Run in development mode:
npm run dev - Build:
npm run build - Start built server:
npm start
ISC