Skip to main content
Glama
dpshde

WakaTime MCP Server

by dpshde
README.md
# WakaTime MCP Server

A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that provides high-signal coding analytics from your [WakaTime](https://wakatime.com/) data.

- **Direct mode**: FastMCP serves Streamable HTTP at `http://localhost:8000/mcp`
- **Proxy mode**: `mcp-proxy` exposes the server over SSE/HTTP and Caddy adds token auth (recommended for self-hosting)

## Tooling / API

| Tool | Purpose | Key arguments |
|------|---------|---------------|
| `get_coding_stats` | Detailed stats for a period | `range` (`last_7_days`, `last_30_days`, `last_6_months`, `last_year`, `all_time`) |
| `get_summary` | Activity breakdown for a date/range | `start_date`, `end_date`, `project` |
| `get_all_time` | Total coding time since account creation | `project` (optional) |
| `get_status_bar` | Current day status (like editor status bar) | (none) |
| `list_projects` | List/search tracked projects | `query` (optional) |

## Configuration

Configure via environment variables (or a `.env` file for the self-hosted scripts).

| Variable | Description | Required |
|----------|-------------|----------|
| `WAKATIME_API_KEY` | Your API key from https://wakatime.com/settings/api-key | **Yes** |
| `MCP_AUTH_KEY` | Token for auth proxy (proxy/self-hosted mode) | Proxy mode |
| `PORT` | Direct-mode port (default: `8000`) | No |

## Development (Direct mode)

1. **Install (uv required)**
   ```bash
   git clone https://github.com/dpshade/wakatime-mcp.git
   cd wakatime-mcp

   uv sync --no-install-project
   ```

2. **Run**
   ```bash
   WAKATIME_API_KEY="your_wakatime_api_key_here" uv run -- python src/server.py
   ```

3. **Connect**
   - **URL**: `http://localhost:8000/mcp`
   - **Auth**: none

## Deployment

### Option 1: Self-hosted with auth (recommended)

This mode runs the MCP server with FastMCP’s default **stdio** transport and uses `mcp-proxy` to expose it over HTTP:

```
Internet -> (optional Tailscale Funnel) -> Caddy (auth) -> mcp-proxy -> FastMCP (stdio)
                                   :8770         :8767
```

1. **Configure**
   ```bash
   cp .env.example .env
   # Edit .env: set WAKATIME_API_KEY and a strong MCP_AUTH_KEY
   ```

2. **Download Caddy (auth proxy)**
   ```bash
   curl -L https://github.com/caddyserver/caddy/releases/latest/download/caddy_linux_amd64 -o deploy/caddy
   chmod +x deploy/caddy
   ```

3. **Start**
   ```bash
   ./deploy/start.sh
   ```

4. **Endpoints**
   - **Auth proxy (recommended):**
     - SSE: `http://localhost:8770/sse`
     - Streamable HTTP: `http://localhost:8770/mcp`
   - **Internal (no auth; do not expose publicly):**
     - SSE: `http://localhost:8767/sse`
     - Streamable HTTP: `http://localhost:8767/mcp`

`mcp-proxy` also exposes a health endpoint at `http://localhost:8767/status` (and via auth proxy at `http://localhost:8770/status`).

#### Systemd (persistent)

```bash
./deploy/install-systemd.sh
sudo systemctl enable --now mcp-wakatime mcp-wakatime-auth
```

#### Optional: Tailscale Funnel

If you use Tailscale, you can publish the auth proxy port:

```bash
tailscale funnel --bg --set-path=/wakatime localhost:8770
tailscale funnel --bg 443 on
```

### Option 2: Docker

Runs `mcp-proxy` + the server in a container.

```bash
cd deploy
docker-compose up -d
```

- **Endpoint (no auth):** `http://localhost:8767/sse`
- If you want auth, run Caddy on the host (or add it to your own compose stack) and proxy to `8767`.

### Option 3: Render

This repo includes `render.yaml` for deploying the **direct** Python server.

- Set environment variable: `WAKATIME_API_KEY`
- Your service endpoint will be: `https://<your-service>/mcp`

## Client setup

### MCP Inspector

```bash
npx @modelcontextprotocol/inspector
```

Then connect using:
- Direct mode: `http://localhost:8000/mcp` (Streamable HTTP)
- Proxy mode: `http://localhost:8770/sse` (SSE)

### Poke / other hosted clients (proxy mode)

Use the auth proxy SSE endpoint and send `MCP_AUTH_KEY` via **one** of:
- `Authorization: Bearer <MCP_AUTH_KEY>`
- `X-API-Key: <MCP_AUTH_KEY>`
- `Api-Key: <MCP_AUTH_KEY>`

## Security notes

- Generate a strong auth key:
  ```bash
  openssl rand -hex 32
  ```
- Never expose the unauthenticated `mcp-proxy` port (`8767`) to the public internet.

## License

MIT