@studiometa/productive-mcp
v0.3.0
Published
MCP server for Productive.io API - Model Context Protocol integration for Claude Desktop
Maintainers
Readme
@studiometa/productive-mcp
MCP (Model Context Protocol) server for Productive.io API integration. Enables Claude Desktop and other MCP clients to interact with Productive.io for project management, time tracking, and task management.
Features
- ✅ Full Productive.io API access via MCP
- 🔧 Support for projects, tasks, time entries, services, and people
- 🔐 Two modes: local (stdio) and remote (HTTP)
- 🌐 Deploy once, share with your team via Claude Desktop custom connectors
- 🐳 Docker-ready for easy deployment
- 📦 Built on @studiometa/productive-cli
Usage Modes
This package supports two modes:
| Mode | Command | Use Case |
|------|---------|----------|
| Local (stdio) | productive-mcp | Personal use via Claude Desktop config |
| Remote (HTTP) | productive-mcp-server | Team use via Claude Desktop custom connector |
Mode 1: Local (stdio) - Personal Use
Use this mode when you want to run the MCP server locally on your machine.
Installation
npm install -g @studiometa/productive-mcpClaude Desktop Configuration
Edit your Claude Desktop config:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%/Claude/claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"productive": {
"command": "productive-mcp"
}
}
}Restart Claude Desktop, then ask Claude:
"Configure my Productive.io credentials"
Claude will guide you through the setup.
Alternative: Environment Variables
{
"mcpServers": {
"productive": {
"command": "productive-mcp",
"env": {
"PRODUCTIVE_ORG_ID": "your-org-id",
"PRODUCTIVE_API_TOKEN": "your-auth-token",
"PRODUCTIVE_USER_ID": "your-user-id"
}
}
}
}Mode 2: Remote (HTTP) - Team Use
Deploy once, share with your entire team via Claude Desktop's custom connector feature.
How It Works
- Deploy the HTTP server to a URL (e.g.,
https://productive.mcp.example.com) - Each team member generates their own Bearer token with their Productive credentials
- Team members add the custom connector in Claude Desktop with their personal token
Deploy the Server
Option A: Docker
# Build
docker build -t productive-mcp-server -f packages/productive-mcp/Dockerfile .
# Run
docker run -d \
--name productive-mcp-server \
--restart unless-stopped \
-p 3000:3000 \
productive-mcp-serverOption B: Node.js
npm install -g @studiometa/productive-mcp
# Start server
PORT=3000 productive-mcp-serverOption C: Docker Compose
version: '3.8'
services:
productive-mcp:
build:
context: .
dockerfile: packages/productive-mcp/Dockerfile
restart: unless-stopped
ports:
- "3000:3000"
environment:
PORT: 3000
HOST: 0.0.0.0Generate Your Token
Each team member generates their own token containing their Productive credentials:
# Format: base64(organizationId:apiToken:userId)
echo -n "YOUR_ORG_ID:YOUR_API_TOKEN:YOUR_USER_ID" | base64Example:
echo -n "12345:pk_abc123xyz:67890" | base64
# Output: MTIzNDU6cGtfYWJjMTIzeHl6OjY3ODkwConfigure Claude Desktop Custom Connector
- Open Claude Desktop Settings
- Go to Custom Connectors (beta)
- Click Add custom connector
- Configure:
- Name:
Productive - Remote MCP server URL:
https://productive.mcp.example.com/mcp - Leave OAuth fields empty (we use Bearer token)
- Name:
- When making requests, Claude will include your token in the
Authorizationheader
Note: As of now, Claude Desktop custom connectors may require OAuth. If Bearer token auth isn't supported directly, you can use a reverse proxy to inject the Authorization header, or wait for Claude Desktop to support custom headers.
Server Endpoints
| Endpoint | Method | Description |
|----------|--------|-------------|
| /mcp | POST | MCP JSON-RPC endpoint |
| /health | GET | Health check |
| / | GET | Server info |
Available Tools
Projects
productive_list_projects- List projects with optional filtersproductive_get_project- Get project details by ID
Tasks
productive_list_tasks- List tasks with optional filtersproductive_get_task- Get task details by ID
Time Entries
productive_list_time_entries- List time entries with filtersproductive_get_time_entry- Get time entry details by IDproductive_create_time_entry- Create a new time entryproductive_update_time_entry- Update an existing time entryproductive_delete_time_entry- Delete a time entry
Services
productive_list_services- List services (budget line items)
People
productive_list_people- List people in the organizationproductive_get_person- Get person details by IDproductive_get_current_user- Get current authenticated user
Configuration (Local mode only)
productive_configure- Configure credentialsproductive_get_config- View current configuration
Get Your Productive.io Credentials
- Log into Productive.io
- Go to Settings → Integrations → API
- Generate an API token
- Note your Organization ID (visible in URL or API settings)
- Note your User ID (click your profile, visible in URL)
Usage Examples
First Time Setup (Local Mode)
You: "Configure my Productive.io credentials"
Claude: "I'll help you set up. Please provide your Organization ID and API Token..."Common Queries
- "Show me all active projects in Productive"
- "Create a time entry for 2 hours today on project X"
- "List all tasks assigned to me"
- "What did I work on last week?"
- "Show me the services/budgets for project 12345"
Development
# Clone the repository
git clone https://github.com/studiometa/productive-cli
cd productive-cli
# Install dependencies
npm install
# Build all packages
npm run build
# Or build only MCP package
npm run build -w @studiometa/productive-mcp
# Development mode (watch)
npm run dev -w @studiometa/productive-mcp
# Test local server
node packages/productive-mcp/dist/index.js
# Test HTTP server
node packages/productive-mcp/dist/server.jsTesting the HTTP Server
# Start the server
PORT=3000 node packages/productive-mcp/dist/server.js
# Generate a test token
TOKEN=$(echo -n "YOUR_ORG_ID:YOUR_API_TOKEN:YOUR_USER_ID" | base64)
# Test health endpoint
curl http://localhost:3000/health
# Test MCP endpoint
curl -X POST http://localhost:3000/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/list","params":{},"id":1}'
# List projects
curl -X POST http://localhost:3000/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"productive_list_projects","arguments":{}},"id":2}'Troubleshooting
Local mode: Credentials not found
# Check environment variables
echo $PRODUCTIVE_ORG_ID
echo $PRODUCTIVE_API_TOKEN
# Or use the configure tool via ClaudeHTTP mode: 401 Unauthorized
- Verify your token is correctly base64-encoded
- Check that orgId:apiToken:userId are separated by colons
- Ensure no newlines in the base64 output
Docker: View logs
docker logs productive-mcp-server -fTest server manually (local mode)
echo '{"jsonrpc":"2.0","method":"tools/list","params":{},"id":1}' | productive-mcpRequirements
- Node.js 20+
- Productive.io account with API access
- Docker (optional, for server deployment)
Architecture
productive-mcp/
├── src/
│ ├── index.ts # Stdio transport (local mode)
│ ├── server.ts # HTTP transport (remote mode)
│ ├── tools.ts # Tool definitions (shared)
│ ├── handlers.ts # Tool execution (shared)
│ └── auth.ts # Bearer token parsing
├── Dockerfile
└── README.mdRelated Packages
- @studiometa/productive-cli - CLI tool for Productive.io
- @modelcontextprotocol/sdk - Official MCP SDK
- h3 - HTTP framework for the server
License
MIT © Studio Meta
