Skip to main content
Glama
README.md
# @mhdd_24/worksnaps-mcp

MCP server for **Worksnaps** time tracking from [Cursor](https://cursor.com) chat. Verify your API token, list projects and tasks, and log offline time without opening the Worksnaps web UI.

Same architecture as Timelog / Flyway / Notepad++ / Caffeine / Workspace Build MCP packages.

**Full documentation:** [docs/WIKI.md](./docs/WIKI.md)

---

## How it works (30 seconds)

```
You (chat)
  → worksnaps-mcp
  → Worksnaps REST API (XML over HTTPS)
  → GET /me.xml | /projects.xml | /tasks.xml
  → POST /projects/{id}/time_entries.xml (offline time)
```

1. Configure `WORKSNAPS_API_TOKEN` (Profile & Settings → Web Service API in Worksnaps)
2. Say **"list Worksnaps projects"** to pick a project ID
3. Say **"list tasks for project 1234"** to pick a task ID
4. Say **"log 480 minutes to Worksnaps project 1234 task 56"** with an optional comment

---

## Prerequisites

| Requirement | Notes |
|-------------|--------|
| **Node.js 18+** | Uses native `fetch` |
| **Worksnaps API token** | Profile & Settings → Web Service API → Show my API Token |
| **Project + task IDs** | Use `list_projects` / `list_tasks`, or set defaults in env |

---

## Install

### Option A — npm (after publish)

```bash
npm install -g @mhdd_24/worksnaps-mcp
```

### Option B — npx

```bash
npx @mhdd_24/worksnaps-mcp
```

### Option C — clone and build

```bash
git clone https://github.com/Mhdd-24/Worksnaps-MCP.git
cd Worksnaps-MCP
npm install
npm run build
node dist/index.js
```

---

## Configure Cursor

Edit `~/.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "worksnaps": {
      "command": "npx",
      "args": ["-y", "@mhdd_24/worksnaps-mcp"],
      "env": {
        "WORKSNAPS_API_TOKEN": "<your-api-token>",
        "WORKSNAPS_DEFAULT_PROJECT_ID": "1234",
        "WORKSNAPS_DEFAULT_TASK_ID": "5678"
      }
    }
  }
}
```

**Local development:**

```json
"command": "node",
"args": ["C:/path/to/worksnaps-mcp/dist/index.js"]
```

Reload MCP after saving.

---

## Tools

| Tool | Purpose |
|------|---------|
| `whoami` | Resolve current user from API token (`GET /me.xml`) |
| `list_projects` | List accessible projects |
| `list_tasks` | List tasks in a project |
| `log_time` | Create offline time entry for yourself |

### Chat examples

- "Run whoami on Worksnaps"
- "List Worksnaps projects"
- "List tasks for Worksnaps project 3456"
- "Log 6 hours offline time to Worksnaps project 3456 task 12 — comment: Sprint development"

---

## Environment variables

| Variable | Required | Purpose |
|----------|----------|---------|
| `WORKSNAPS_API_TOKEN` | Yes* | API token (Basic auth username; password ignored) |
| `WORKSNAPS_DEFAULT_PROJECT_ID` | No | Default project for `log_time` |
| `WORKSNAPS_DEFAULT_TASK_ID` | No | Default task for `log_time` |
| `WORKSNAPS_BASE_URL` | No | API base URL (default `https://api.worksnaps.com/api`) |

\*Can be passed as `token` per tool call instead.

---

## Notes

- `log_time` creates **offline** time entries (Worksnaps API: POST `/projects/{project_id}/time_entries.xml`).
- `from_timestamp` is aligned to a **10-minute boundary** (Worksnaps API requirement).
- Default `startHour` is **9** (local time) when only a date is provided.

---

## License

ISC

TDQS

A3.7/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a distinct resource: projects, tasks, time entries, and user identity. There is no ambiguity between them.

Naming Consistency4/5

Most tools follow a verb_noun pattern (list_projects, list_tasks, log_time). 'whoami' deviates slightly but is still an imperative verb. Overall consistent.

Tool Count5/5

With 4 tools, the server is focused and well-scoped for its purpose. Each tool serves a clear need without bloat.

Completeness2/5

The tool surface lacks read operations for logged time entries and lacks CRUD for projects and tasks. Users cannot retrieve, update, or delete time entries, which is a significant gap.

Maintenance

ActivityMaintained
ResponsivenessSyncing