Productive.io

โต้ตอบกับ API ของ Productive.io สำหรับการจัดการโครงการและงานด้านประสิทธิภาพ

เอกสาร

Productive.io MCP Server

npm version

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

Features

  • 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
  • Pages/Docs: Full document management with nested page hierarchies, move, and copy
  • People Management: List people in your organization with filtering options
  • Workflow Management: List and work with workflow statuses for proper task status updates
  • Time Tracking: List and create time entries with service/deal integration
  • User Context: Supports "me" references when PRODUCTIVE_USER_ID is configured
  • Activity Tracking: View activities and recent updates across your organization

Installation

Via npm (Recommended)

Install globally:

npm install -g productive-mcp

Or run directly with npx (no installation required):

npx productive-mcp

From Source

  1. Clone this repository
  2. Install dependencies:
    npm install
    
  3. Build the project:
    npm run build
    

Configuration

Getting Your Credentials

To obtain your Productive.io credentials:

  1. Log in to Productive.io
  2. Go to Settings → API integrations
  3. Generate a new token (choose read-only for safety, or full access for task creation)
  4. 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

Environment Variables

The server requires the following environment variables:

VariableRequiredDescription
PRODUCTIVE_API_TOKENYesYour Productive.io API token
PRODUCTIVE_ORG_IDYesYour organization ID
PRODUCTIVE_USER_IDNoYour user ID (required for my_tasks tool)

Usage with Claude Desktop

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

Using npx (Recommended)

{
  "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"
      }
    }
  }
}

Using Global Installation

{
  "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"
      }
    }
  }
}

Using Local Build

{
  "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.

Usage with Claude Code

Add the server to your Claude Code configuration using the CLI:

claude mcp add productive -- npx -y productive-mcp

Then 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:

  1. 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
    
  2. Make it executable:

    chmod +x ~/scripts/productive-mcp.sh
    
  3. 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.

Available Tools

User & Context Tools

ToolDescription
whoamiGet current user context and configured user ID

Company & Project Tools

ToolDescription
list_companiesList companies/customers. Filter by status (active/archived), limit
list_projectsList projects. Filter by status, company_id, limit

Folder Tools

ToolDescription
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

Board & Task List Tools

ToolDescription
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

Task Management Tools

ToolDescription
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
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 task's project workflow, supports custom statuses
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

Task Dependency Tools

ToolDescription
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

Subtask Tools

ToolDescription
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

Comment Tools

ToolDescription
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 the client portal
list_commentsList comments. Filter by task_id, project_id, limit
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")

Todo Tools

ToolDescription
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

Page/Document Tools

ToolDescription
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

Workflow Tools

ToolDescription
list_workflow_statusesList workflow statuses. Filter by workflow_id, category_id (1=Not Started, 2=Started, 3=Closed), limit

Time Tracking Tools

ToolDescription
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
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

Activity & Updates Tools

ToolDescription
list_activitiesList activities. Filter by task_id, project_id, person_id, item_type, event, after, before
get_recent_updatesGet recent updates. Optional limit, hours

Common Workflows

Updating Task Status

You can update a task's status by name — no need to look up IDs:

update_task_status {
  "task_id": "12399194",
  "status_name": "On Hold"
}

The tool automatically resolves the task's project workflow and matches the status name (case-insensitive, supports partial matching). This works with custom workflow statuses too.

If the name doesn't match or is ambiguous, it returns the available statuses for that project:

No workflow status matching "banana" found.

Available statuses:
  • "Pending" (ID: 102305) — Not Started
  • "Open" (ID: 102291) — Started
  • "On Hold" (ID: 102306) — Started
  • "Waiting" (ID: 102307) — Started
  • "Closed" (ID: 102292) — Closed

You can also pass workflow_status_id directly if you already know the ID.

Working with "me" Context

When PRODUCTIVE_USER_ID is configured, you can use "me" in several tools:

  • create_task with "assignee_id": "me"
  • update_task_assignment with "assignee_id": "me"
  • my_tasks to get your assigned tasks
  • whoami to verify your configured user context

Creating Complete Task Workflows

  1. Create a folder: create_folder
  2. Create task lists: create_task_list
  3. Create tasks: create_task
  4. Break down work: create_subtask for sub-items, create_todo for checklists
  5. Add comments: add_task_comment
  6. Update status: update_task_status with status_name (e.g. "Open", "On Hold", "Closed")
  7. Track progress: Use list_activities or get_recent_updates

Building Documentation

  1. Create a root page: create_page with project_id and title
  2. Add child pages: create_page with parent_page_id and root_page_id set to the root
  3. Nest deeper: Set parent_page_id to the parent and root_page_id to the root page
  4. Reorganize: Use move_page to reparent pages, copy_page to duplicate

Development

  • Run in development mode: npm run dev
  • Build: npm run build
  • Start built server: npm start

License

ISC