A Model Context Protocol (MCP) server that provides integration with Productive.io, enabling AI assistants like Claude to interact with your Productive.io workspace for project management, task tracking, time entries, and more.
- Task Management: List, filter, and retrieve task details with smart pagination
- Project Access: Query projects and their details
- Time Tracking: Manage time entries
- Business Development: Access deals and companies
- Team Management: Query people and team members
- Knowledge Base: Access Productive.io pages
- Configurable Tools: Enable/disable specific tools via YAML configuration
- Multiple Transport Options: stdio, HTTP, SSE, or streamable-HTTP
- Docker Support: Ready-to-deploy containerized setup
- Productive.io account with API access
- Docker and Docker Compose (recommended)
- OR Python 3.12+ and uv for local installation
Docker is the easiest way to get started with the Productive.io MCP server.
- Clone the repository:
git clone https://github.com/yourusername/productive-io-mcp-server.git
cd productive-io-mcp-server- Create a
.envfile with your credentials:
PRODUCTIVE_API_TOKEN=your_api_token_here
PRODUCTIVE_ORG_ID=your_organization_id_here- Build and start the server:
docker compose up -dThe server will be available at http://localhost:9000/productive-mcp
If you prefer to run without Docker:
- Clone the repository:
git clone https://github.com/yourusername/productive-io-mcp-server.git
cd productive-io-mcp-server- Install dependencies using uv:
uv syncOr using pip:
pip install -e .Create a .env file in the project root:
PRODUCTIVE_API_TOKEN=your_api_token_here
PRODUCTIVE_ORG_ID=your_organization_id_hereTo obtain your API credentials:
- Log into your Productive.io account
- Navigate to Settings > API
- Generate an API token
- Note your Organization ID from the URL or settings
Create a config.yaml file to enable/disable specific tools:
tools:
projects: true
tasks: true
time_entries: true
deals: true
companies: true
people: true
pages: true- Start the server using Docker Compose:
docker compose up -d- Connect Claude Desktop to the server:
claude mcp add --transport http productive http://localhost:9000/productive-mcp- That's it! You can now use Productive.io tools in Claude Desktop.
Check server status and logs:
docker compose logs -fStop the server:
docker compose downRestart the server:
docker compose restartWith the Docker container running, add the server to Claude Desktop:
claude mcp add --transport http productive http://localhost:9000/productive-mcpIf running locally without Docker, you can use stdio transport:
claude mcp add productive --transport stdio --command "uv" --arg "run" --arg "python" --arg "/absolute/path/to/productive-io-mcp-server/mcp_server_productive/server.py" --arg "--transport" --arg "stdio"Set environment variables:
export PRODUCTIVE_API_TOKEN=your_api_token_here
export PRODUCTIVE_ORG_ID=your_organization_id_hereYou can also manually edit your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
For Docker/HTTP transport:
{
"mcpServers": {
"productive": {
"transport": "http",
"url": "http://localhost:9000/productive-mcp"
}
}
}For local stdio transport:
{
"mcpServers": {
"productive": {
"command": "uv",
"args": [
"run",
"python",
"/absolute/path/to/productive-io-mcp-server/mcp_server_productive/server.py",
"--transport",
"stdio"
],
"env": {
"PRODUCTIVE_API_TOKEN": "your_api_token_here",
"PRODUCTIVE_ORG_ID": "your_organization_id_here"
}
}
}
}uv run python mcp_server_productive/server.py \
--transport streamable-http \
--endpoint /productive-mcpThe server will be available at http://localhost:9000/productive-mcp
uv run python mcp_server_productive/server.py --transport stdiouv run python mcp_server_productive/server.py \
--service-config-file config.yaml \
--transport stdio-
count_tasks: Get count of tasks matching filters (useful before pagination)- Filters:
project_id,assignee_id,closed
- Filters:
-
list_tasks: List tasks with smart pagination and summarization- Filters:
project_id,assignee_id,closed - Parameters:
page,page_size(max 20) - Returns: Summarized task data to reduce token usage
- Filters:
-
get_task: Get full details of a specific task- Parameters:
task_id
- Parameters:
Additional tools for projects, time entries, deals, companies, people, and pages are being added.
--api-token Productive.io API token (or use PRODUCTIVE_API_TOKEN env var)
--org-id Organization ID (or use PRODUCTIVE_ORG_ID env var)
--service-config-file Path to YAML configuration file
--transport Transport type: stdio, http, sse, streamable-http (default: stdio)
--endpoint Custom endpoint path (default: /productive-mcp)
| Variable | Description | Required |
|---|---|---|
PRODUCTIVE_API_TOKEN |
Your Productive.io API token | Yes |
PRODUCTIVE_ORG_ID |
Your organization ID | Yes |
SERVICE_CONFIG_FILE |
Path to YAML config file | No |
PRODUCTIVE_MCP_ENDPOINT |
Custom endpoint path | No |
# Install with dev dependencies
uv sync --all-extras
# Run tests
uv run pytest
# Format code
uv run black mcp_server_productive/
# Lint code
uv run ruff check mcp_server_productive/productive-io-mcp-server/
├── mcp_server_productive/
│ └── server.py # Main server implementation
├── docker/
│ └── server/
│ └── Dockerfile # Docker container definition
├── docker-compose.yaml # Docker Compose configuration
├── pyproject.toml # Project metadata and dependencies
├── uv.lock # Locked dependencies
└── README.md # This file
The server is built using:
- FastMCP: Framework for building MCP servers
- httpx: Async HTTP client for Productive.io API
- python-dotenv: Environment variable management
- PyYAML: Configuration file parsing
ProductiveService: Core service class handling API authentication and requests- Tool Initialization: Dynamic tool registration based on configuration
- Smart Pagination: Automatic task summarization to reduce token usage
- Lifespan Management: Proper resource initialization and cleanup
The server implements several strategies to minimize token usage:
- Summarized Listings:
list_tasksreturns only essential fields - Pagination Guidance:
count_tasksprovides recommendations before large queries - On-Demand Details:
get_taskfetches full data only when needed - Configurable Page Sizes: Control how much data is returned per request
- Always use
count_tasksbefore listing large datasets - Request small page sizes (10-20) for initial exploration
- Use specific filters to narrow down results
- Use
get_taskfor detailed information on specific items
Issue: "API token and organization ID are required"
Solution: Ensure both PRODUCTIVE_API_TOKEN and PRODUCTIVE_ORG_ID are set in your environment or .env file
Issue: Cannot connect to Productive.io API Solution:
- Verify your API token is valid and not expired
- Check your organization ID is correct
- Ensure you have network connectivity
Issue: Container fails to start Solution:
- Check environment variables in
docker-compose.yaml - Verify the Docker image built successfully
- Check logs with
docker compose logs
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
[Add your license here]
For issues and questions:
- Open an issue on GitHub
- Check Productive.io API documentation: https://developer.productive.io/
- Review MCP documentation: https://modelcontextprotocol.io/
- Built with FastMCP
- Powered by Productive.io API
- Part of the Model Context Protocol ecosystem