Skip to main content
Glama

Productive.io MCP Server

License: MIT Productive-Simple-MCP MCP server

A Model Context Protocol (MCP) server for integrating Productive.io into AI workflows. This server allows AI assistants and tools to access projects, folders, workflow statuses, time entries, tasks, comments, pages, attachments, todos, and people. Built with FastMCP.

This implementation is optimized for read-focused operations, with optional guarded write capabilities (for example, task creation) and LLM-friendly output options (Hybrid, JSON, and TOON). It is optimized for efficiency and simplicity, exposing only the necessary information. For a more comprehensive solution, consider BerwickGeek's implementation: Productive MCP by BerwickGeek.

Features

  • Read tools for projects, folders, workflow statuses, time entries, tasks, comments, pages, attachments, todos, people, recent activity, and quick search

  • Write tools (blocked when READ_ONLY=true): create/update/delete for tasks, comments, time entries, pages, and todos, plus page content append

  • LLM-optimized responses: noise removed, HTML stripped, webapp_url included for direct access

  • Output formats: hybrid (default), toon, and json

Related MCP server: MCP Todoist

Requirements

  • Python 3.10+

  • Productive API token

  • FastMCP 3.x

Installation

  1. Clone or download this repository

  2. Install dependencies:

pip install -r requirements.txt

or

uv venv && uv sync

Configuration

The server uses environment variables for configuration:

  • PRODUCTIVE_API_KEY: Your Productive API token (required)

  • PRODUCTIVE_ORGANIZATION: Your Productive organization ID (required)

  • PRODUCTIVE_BASE_URL: Base URL for Productive API (default: https://api.productive.io/api/v2)

  • PRODUCTIVE_TIMEOUT: Request timeout in seconds (default: 30)

  • PRODUCTIVE_ITEMS_PER_PAGE: Default page size for list tools (default: 50, max: 200)

  • OUTPUT_FORMAT: Output format for tool responses ("hybrid", "toon", or "json", default: "hybrid")

  • READ_ONLY: Global write-protection toggle for write tools — create_task, update_task, delete_task, create_comment, update_comment, delete_comment, create_time_entry, update_time_entry, delete_time_entry, create_page, update_page, append_page_content, delete_page, create_todo, update_todo, delete_todo ("true" or "false", default: "true")

Usage

Using uvx from GitHub (Recommended for MCP clients)

    "productive": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/druellan/Productive-Simple-MCP",
        "productive-mcp"
      ],
      "env": {
        "PRODUCTIVE_API_KEY": "<api-key>",
        "PRODUCTIVE_ORGANIZATION": "<organization-id>"
      }
    }

Local Development (Direct Python Execution)

    "productive": {
      "command": "python",
      "args": [
        "server.py"
      ],
      "env": {
        "PRODUCTIVE_API_KEY": "<api-key>",
        "PRODUCTIVE_ORGANIZATION": "<organization-id>"
      }
    }

Local Development Using UV

    "productive": {
      "command": "uv",
      "args": [
        "--directory", "<path-to-productive-mcp>",
        "run", "server.py"
      ],
      "env": {
        "PRODUCTIVE_API_KEY": "<api-key>",
        "PRODUCTIVE_ORGANIZATION": "<organization-id>"
      }
    }

Available Tools

MCP clients receive the full schema and descriptions for each tool automatically. The tables below summarize them.

Read Tools

Tool

Description

list_projects

List all projects

list_folders

List folders in a project (project_id required)

get_folder

Get a folder by ID

list_workflow_statuses

List workflow statuses, optionally filtered by workflow/category

list_time_entries

List time entries with date/person/project/task/service filters

list_tasks

List tasks with filtering, sorting, and pagination

get_task

Get a task by ID, enriched with recent comments, todos, and attachments

get_task_history

Get task status/assignment history, milestones, and activity summary

list_comments

List comments, optionally filtered by project/task

list_pages

List pages/documents, optionally filtered by project/creator

get_page

Get a page by ID with readable body_html

list_attachments

List attachment metadata

list_todos

List todo checklist items, optionally filtered by task

get_todo

Get a todo by ID

list_people

List team members

get_person

Get a person by ID

list_recent_activity

Summarized feed of recent activities

quick_search

Search across projects, tasks, pages, and actions

Write Tools (blocked when READ_ONLY=true)

Tool

Description

create_task / update_task / delete_task

Manage tasks

create_comment / update_comment / delete_comment

Manage comments

create_time_entry / update_time_entry / delete_time_entry

Manage time entries

create_page / update_page / delete_page

Manage pages/documents

append_page_content

Append markdown or HTML to a page

create_todo / update_todo / delete_todo

Manage todo checklist items

Output Format

The server supports three output formats configured via the OUTPUT_FORMAT environment variable:

Mode

content (text)

structured_content

Description

hybrid (default)

TOON

JSON dict

Both TOON for token efficiency and structured data for programmatic access

toon

TOON

{ "toon": toonText }

Pure TOON (Token-Optimized Object Notation) with no dual-format overhead

json

JSON string

JSON dict

Standard FastMCP JSON output

TOON (Token-Optimized Object Notation) reduces token consumption by 30-60% compared to JSON. The hybrid mode is the recommended default: it exposes the TOON rendering as the message text while preserving the full JSON dict as structured output, so agents that rely on structured data can still parse it programmatically.

All tools return filtered data optimized for LLM processing:

LLM Optimizations:

  • Unwanted fields removed (e.g., creation_method_id, email_key, placement from tasks)

  • HTML stripped from descriptions and comments

  • Empty/null values removed

  • Pagination links removed

  • List views use lightweight output (e.g., list_tasks excludes descriptions and relationships)

  • Web app URLs included: Each resource includes a webapp_url field linking directly to the Productive web interface

Response Structure:

  • data: Main resource data (array for collections, object for single items)

  • meta: Pagination and metadata

  • included: Related resource data (when applicable)

  • webapp_url: Direct link to view the resource in Productive (e.g., https://app.productive.io/12345/tasks/67890)

Error Handling

The server provides comprehensive error handling:

  • 401 Unauthorized: Invalid API token

  • 404 Not Found: Resource not found

  • 429 Rate Limited: Too many requests

  • 500 Server Error: Productive API issues

All errors are logged via MCP context with appropriate severity levels.

Security

  • API tokens are loaded from environment variables

  • No sensitive data is logged

  • HTTPS is used for all API requests

  • Error messages don't expose internal details

License

MIT License.

Available Tools

18 tools
get_folderA
Read-only

Get folder details by folder ID.

Productive exposes folders through the /folders endpoint.

Inputs: folder_id (required). Returns: object

get_pageA
Read-only

Get a specific page/document by ID, including full content body.

Use this when: You need the full content body of a specific page (not just metadata or titles).

Returns the page body as readable HTML in body_html.

Inputs: page_id (required). Returns: object

get_personA
Read-only

Get detailed information about a specific team member by ID.

Use this when: You need detailed information about a specific person (full name, email, role, title, activity timestamps, custom fields, avatar). Use list_people when you need to browse or search multiple people.

Returns:

  • Full name, email, and contact information

  • Role, title, and organizational details

  • Activity timestamps (joined, last seen)

  • Custom fields and additional metadata

  • Avatar and profile information

Inputs: person_id (required). Returns: object

get_taskA
Read-only

Get detailed task information by its internal task ID (e.g., 14677418).

Returns task details including:

  • Title, description, status (open/closed), due date, and timestamps

  • Time tracking: initial estimate, remaining, billable, and worked time (in minutes)

  • Todo counts: total and open

  • comments: the most recent comments (up to comment_limit, most recent first)

  • todos: up to 100 checklist items, with todos_truncated and todos_note when more exist

  • attachments: id and filename for each file attached to the task

Inputs: task_id (required), comment_limit. Returns: object

get_task_historyA
Read-only

Get comprehensive history for a specific task.

Returns aggregated task history including:

  • Status history: Timeline of status changes with timestamps and responsible users

  • Assignment history: Who worked on the task and when assignments changed

  • Milestones: Key deliverables and completion markers from comments and activities

  • Activity summary: Counts of comments, changes, status updates, assignments, and milestones

Examples: get_task_history(14677921) # Default 30-day history get_task_history(14677921, hours=168) # Last week only get_task_history(14677921, hours=24) # Last 24 hours

Inputs: task_id (required), hours. Returns: object

get_todoA
Read-only

Get a specific todo checklist item by ID.

Use this when: You need full details of a specific todo (including project/client context, time estimates, related comments/attachments).

Returns:

  • Checkbox item text and completion status

  • Parent task with project and client details

  • Assignee and team member information

  • Due date relative to parent task timeline

  • Time estimates vs actual completion time

  • Related comments and file attachments

Inputs: todo_id (required). Returns: object

list_attachmentsA
Read-only

List attachment/file metadata with optional filtering.

Use this when: You need to browse or search attachments (files associated with tasks, comments, expenses). Note: returns metadata only — actual file content is not included.

Attachments are files (PDFs, images, documents) associated with tasks, comments, expenses, etc.

Returns:

  • File name, type, and size

  • Associated entity relationships (task, project, etc.)

Note: returns metadata only — actual file content is not included.

Inputs: page_size, page_number, extra_filters. Returns: object

list_commentsA
Read-only

List comments with optional filtering by project or task.

Use this when: You need full comment metadata (text, author, timestamps, attachments, mentions) and want to filter by specific project, task, or discussion thread.

Returns:

  • Comment text, author, and timestamp

  • Parent entity (project or task) with details

  • Discussion threads and replies

  • Attachments and file references

  • Mentions of team members or clients

Use extra_filters with filter[discussion_id][eq] to target a specific thread.

Inputs: task_id, page_size, project_id, page_number, +1 more. Returns: object

list_foldersA
Read-only

List folders in a project.

Productive exposes folders through the /folders endpoint.

Returns folder data including:

  • Folder ID and name

  • Archived status

  • Position/order within the project

  • Hidden flag and project relationship

Inputs: project_id (required), limit, status. Returns: object

list_pagesA
Read-only

List pages/documents with optional filtering by project, creator, or parent hierarchy.

Use this when: You need to browse or search for pages by project, creator, or to retrieve page metadata/titles without full content. Also use this to discover subpages/subfolders inside a folder page or root doc.

Pages in Productive are documents that can contain rich text content, attachments, and are organized within projects and nested inside parent pages.

Returns page titles, content, metadata, and project relationships.

Examples: list_pages(project_id=1234) # All pages in a project list_pages(creator_id=567) # Pages created by a specific person list_pages(extra_filters={'filter[parent_page_id][eq]': 179857}) # Direct subpages of a folder page list_pages(extra_filters={'filter[root_page_id][eq]': 179857}) # All pages in a doc tree

Inputs: page_size, creator_id, project_id, page_number, +1 more. Returns: object

list_peopleA
Read-only

List all team members with optional pagination.

Returns:

  • Person ID, name, and email

  • Role and title information

  • Last seen and join dates

  • Avatar and contact information

Inputs: page_size, page_number. Returns: object

list_projectsA
Read-only

List all projects with basic information.

Returns project data including:

  • Project ID, name, and number

  • Creation and last activity timestamps

  • Archived status (if applicable)

  • Webapp URL for direct access

Inputs: no named parameters. Returns: object

list_recent_activityA
Read-only

Get a summarized feed of recent activities and updates.

Returns recent changes, task updates, comments, new documents and activities in chronological order.

Examples: list_recent_activity() # Last 24 hours, all activity list_recent_activity(hours=168) # Last week list_recent_activity(hours=48, project_id=343136) # Last 2 days on specific project list_recent_activity(hours=24, user_id=12345) # What a specific user did today list_recent_activity(hours=24, activity_type=1) # Only comments from last day list_recent_activity(hours=168, item_type='Task') # Task activities from last week list_recent_activity(hours=168, event_type='edit') # Task edits from last week list_tasks(extra_filters={'filter[status][eq]': 2}, sort='-updated_at', page_size=10) # Recently closed tasks

Inputs: hours, task_id, user_id, item_type, +4 more. Returns: object

list_tasksA
Read-only

List tasks with optional filtering and pagination.

Supports filtering by project, assignee, status, and other criteria. All parameters are optional - omit to fetch all tasks.

Example of extra_filters:

  • filter[status][eq]=1: Open tasks

  • filter[status][eq]=2: Closed tasks

  • filter[workflow_status_category_id][eq]=3: Workflow closed status

  • filter[board_status][eq]=1: Active board tasks

Returns: Dictionary of tasks matching the provided filters

Inputs: sort, user_id, page_size, project_id, +2 more. Returns: object

list_time_entriesA
Read-only

List time entries with optional date and relationship filters.

Returns logged work records and related references (person/service/task).

Inputs: date, after, limit, before, +5 more. Returns: object

list_todosA
Read-only

List todo checklist items with optional filtering by task.

Use this when: You need to browse or filter checklist items across tasks (e.g., find all open todos in a project, filter by assignee). Use get_todo when you need full details of a specific todo.

Returns:

  • Checkbox item text and completion status

  • Assignee information

  • Parent task details with project context

  • Due dates and priority relative to parent task

  • Estimated vs actual time for checklist items

Filter by task_id to get all checklist items for a specific task.

Inputs: task_id, page_size, page_number, extra_filters. Returns: object

list_workflow_statusesA
Read-only

List workflow statuses from Productive.

Useful for understanding valid task status values by workflow.

Inputs: limit, category_id, workflow_id. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 18 tools

    Disambiguation5/5

    Each tool targets a distinct resource or action: search, activity, projects, folders, workflow statuses, time entries, todos, tasks, task history, comments, pages, people, attachments. List/get pairs are clearly differentiated by singular vs plural and explicit descriptions, so an agent can reliably select the right tool.

    Naming Consistency5/5

    All tools use a consistent verb_noun pattern: list_* for collections, get_* for single items, plus quick_search and list_recent_activity which follow the same style. Snake_case is used throughout with no mixing of conventions, making the API predictable.

    Tool Count4/5

    18 tools is on the higher end but still reasonable for a project management server covering many entity types (projects, tasks, todos, pages, people, folders, comments, time entries, attachments, activity). Each tool serves a distinct purpose and none feel redundant, though the count slightly exceeds the typical 3-15 sweet spot.

    Completeness2/5

    The tool surface is heavily read-focused: every entity has list/get operations but no create, update, or delete methods exist for any resource. For a project management domain, this is a significant gap, as agents cannot create tasks, update statuses, add comments, or modify anything, limiting practical workflows.

    Maintenance

    ActivityStale
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      B
      quality
      D
      maintenance
      A Model Context Protocol server that provides AI agents with read-only access to Rossum API resources (queues, schemas, hooks, workspaces) for analysis purposes.
      6
      2
      -
    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      A unified Model Context Protocol server that provides a consistent interface for AI assistants to interact with productivity tools like Linear, GitHub, Slack, and Notion. It enables users to search, retrieve, and manage tasks and data across multiple workplace services from a single endpoint.
      18 npm
      MIT