Harvest MCP Server
by southleft
README.md
# Harvest MCP Server
Connect your AI assistant to [Harvest](https://www.getharvest.com/) time tracking. Query time entries, analyze profitability, track utilization, and manage your Harvest data through natural language.
**Live Server:** https://harvest-mcp.southleft.com
---
## Quick Start
### Claude Desktop (Recommended)
1. Open Claude Desktop → **Settings** → **Connectors**
2. Click **Add Connector**
3. Enter: `https://harvest-mcp.southleft.com/mcp`
4. Click **Connect**
On first use, you'll receive an OAuth link to connect your Harvest account.
### Claude Code CLI
```bash
claude mcp add --transport http harvest https://harvest-mcp.southleft.com/mcp
```
### Manual Configuration
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"harvest": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://harvest-mcp.southleft.com/mcp"]
}
}
}
```
---
## Example Prompts
### Time Tracking
> "What did I work on today?"
> "Show me all my time entries from last week"
> "How many hours did I log on the Acme project this month?"
> "Start a timer for the Design task on Project X"
> "Stop my running timer"
### Team & Client Analysis
> "Who on my team logged the most hours last month?"
> "Show me all time entries for client Acme Corp"
> "Get the contact information for everyone at Initech"
> "What projects is Sarah working on?"
> "List all active clients"
### Profitability & Utilization
> "What's our profitability on the Acme project this quarter?"
> "Compare profitability across all clients for 2024"
> "What's our team utilization rate this month?"
> "Show me billable vs non-billable breakdown by team member"
> "Which projects are most profitable?"
### Budget Performance
> "Which employees went over their project budgets this quarter?"
> "Show me top performers who came in under budget"
> "Who are the repeat offenders going over budget on multiple projects?"
> "Compare budget variance by team member for 2024"
### Invoicing & Expenses
> "Show me all unpaid invoices"
> "What invoices are open for Acme Corp?"
> "List all expenses for the Johnson project"
> "What's been billed vs unbilled this quarter?"
### Aggregation & Reporting
> "Sum up hours by project for November"
> "Break down time by client and user for Q4"
> "Weekly hours summary for December"
> "Show me time trends by month for 2024"
---
## Available Tools (21)
### Time Tracking
| Tool | Description |
|------|-------------|
| `harvest_list_time_entries` | List and filter time entries by user, client, project, date range |
| `harvest_get_time_entry` | Get a specific time entry by ID |
| `harvest_create_time_entry` | Create new time entries with optional timer |
| `harvest_stop_timer` | Stop a running timer |
| `harvest_delete_time_entry` | Delete a time entry |
### Company & Team
| Tool | Description |
|------|-------------|
| `harvest_get_company` | Get company/account information |
| `harvest_get_current_user` | Get current user info |
| `harvest_list_users` | List all users with filters |
### Clients & Contacts
| Tool | Description |
|------|-------------|
| `harvest_list_clients` | List all clients |
| `harvest_list_contacts` | List client contacts (people associated with clients) |
### Projects & Tasks
| Tool | Description |
|------|-------------|
| `harvest_list_projects` | List all projects with filters |
| `harvest_list_tasks` | List all tasks |
### Invoicing & Expenses
| Tool | Description |
|------|-------------|
| `harvest_list_invoices` | List invoices with state/date filters |
| `harvest_list_expenses` | List expenses with filters |
### Analytics & Compute
| Tool | Description |
|------|-------------|
| `harvest_compute_profitability` | Calculate profitability (time-based, invoice-based, or hybrid) |
| `harvest_compute_utilization` | Calculate utilization with capacity tracking |
| `harvest_aggregate_time` | Aggregate time by client, project, user, date, week, or month |
| `harvest_compute_budget_performance` | Analyze employee performance based on budget adherence per project |
### Utilities
| Tool | Description |
|------|-------------|
| `harvest_get_rates` | Get cost and billable rates with fallback support |
| `harvest_resolve_entities` | Fuzzy search for entities by name |
| `harvest_get_schema` | Get schema definitions and enum values (no auth required) |
---
## Self-Hosting
### Cloudflare Workers (Recommended)
1. **Clone and install**
```bash
git clone https://github.com/southleft/harvest-mcp.git
cd harvest-mcp
npm install
```
2. **Create Harvest OAuth App**
- Go to [Harvest Developers](https://id.getharvest.com/developers)
- Create a new OAuth2 application
- Set redirect URI to `https://your-worker.workers.dev/callback`
- Note your Client ID and Client Secret
3. **Configure Cloudflare**
```bash
# Update wrangler.toml with your account_id
# Create KV namespaces
npx wrangler kv:namespace create SESSIONS
npx wrangler kv:namespace create RATES_CONFIG
# Update wrangler.toml with the namespace IDs
# Set secrets
echo "YOUR_CLIENT_ID" | npx wrangler secret put HARVEST_CLIENT_ID
echo "YOUR_CLIENT_SECRET" | npx wrangler secret put HARVEST_CLIENT_SECRET
echo "YOUR_SESSION_SECRET" | npx wrangler secret put SESSION_SECRET
```
4. **Deploy**
```bash
npm run deploy
```
### Node.js Server
```bash
cp .env.example .env
# Edit .env with your Harvest credentials
npm run dev # Development
npm run build && npm start # Production
```
---
## Environment Variables
| Variable | Description | Required |
|----------|-------------|----------|
| `HARVEST_CLIENT_ID` | Harvest OAuth Client ID | Yes |
| `HARVEST_CLIENT_SECRET` | Harvest OAuth Client Secret | Yes |
| `SESSION_SECRET` | Secret for session encryption | Yes |
| `SESSION_TTL_HOURS` | Session lifetime (default: 24) | No |
| `ALLOWED_ORIGINS` | CORS allowed origins | No |
| `DEFAULT_COST_RATE` | Fallback cost rate | No |
---
## Architecture
```
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Claude/MCP │────▶│ Cloudflare │────▶│ Harvest │
│ Client │◀────│ Workers │◀────│ API │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌──────────────────┐
│ Cloudflare KV │
│ (Sessions) │
└──────────────────┘
```
**Stack:**
- [Hono](https://hono.dev/) - Web framework
- [MCP SDK](https://github.com/modelcontextprotocol/sdk) - Model Context Protocol
- [Cloudflare KV](https://developers.cloudflare.com/kv/) - Session storage
- [Harvest API v2](https://help.getharvest.com/api-v2/) - Time tracking API
---
## API Endpoints
| Endpoint | Method | Description |
|----------|--------|-------------|
| `/` | GET | Landing page |
| `/health` | GET | Health check |
| `/mcp` | POST | MCP protocol endpoint |
| `/callback` | GET | OAuth callback |
---
## Development
```bash
npm install # Install dependencies
npm run dev:workers # Run locally with wrangler
npm test # Run tests
npm run lint # Lint code
npm run format # Format code
```
---
## Project Structure
```
src/
├── workers/ # Cloudflare Workers entry point
│ ├── index.ts # Hono app with MCP endpoint
│ ├── config.ts # Workers config loader
│ └── kv-session-store.ts
├── tools/ # MCP tool implementations
│ └── index.ts # All tool registrations
├── harvest/ # Harvest API client
│ ├── client.ts # API client with caching
│ ├── types.ts # TypeScript types
│ ├── cache.ts # LRU cache
│ └── rate-limiter.ts
├── compute/ # Analytics engines
│ ├── profitability.ts
│ ├── utilization.ts
│ └── aggregation.ts
├── auth/ # OAuth implementation
├── session/ # Session management
├── rates/ # Rate resolution service
├── entities/ # Entity resolution (fuzzy search)
└── schema/ # Schema documentation
```
---
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
---
## License
MIT License - see [LICENSE](LICENSE) for details.
---
Built by [Southleft](https://southleft.com)
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues