Skip to main content
Glama
jais2402
by jais2402
README.md
# everhour-mcp-server

MCP server for [Everhour](https://everhour.com) time tracking, with first-class
support for **logging hours against Asana tickets**.

Asana tasks synced into Everhour have IDs of the form `as:<asanaGid>`. The
server exposes tools to look them up, log time, run timers, and review
timesheets — both directly via Everhour task IDs and via raw Asana GIDs.

## Tools

| Tool | Purpose |
|------|---------|
| `everhour_get_current_user` | Verify the API key and read your Everhour user ID |
| `everhour_list_projects` | List/search projects, filterable by platform (e.g. `asana`) |
| `everhour_get_project` | Fetch a project by ID |
| `everhour_search_tasks` | Find Everhour tasks by name (also matches synced Asana tasks) |
| `everhour_get_task` | Fetch a task by Everhour ID |
| `everhour_find_task_by_asana_id` | Resolve an Asana task GID → Everhour task |
| `everhour_log_time` | **Log hours on an Everhour task** |
| `everhour_log_time_for_asana_task` | **Log hours given an Asana GID** (workflow shortcut) |
| `everhour_log_time_batch` | **Log many entries at once** (day/week/month), with per-row results |
| `everhour_list_time_records` | Review your timesheet (date range, project, task filters) |
| `everhour_update_time_record` | Edit an existing time record |
| `everhour_delete_time_record` | Delete a time record |
| `everhour_start_timer` | Start the active timer on a task |
| `everhour_stop_timer` | Stop the active timer |
| `everhour_get_current_timer` | Check whether a timer is running |

## Setup

1. **Get your Everhour API key:** profile → Settings → API integration:
   <https://app.everhour.com/#/account/profile>

2. **Install & build:**
   ```bash
   npm install
   npm run build
   ```

3. **Run locally with the MCP Inspector:**
   ```bash
   EVERHOUR_API_KEY=ev_xxx npm run inspect
   ```

## Configure for Claude Code / Claude Desktop

Add an entry under `mcpServers` in your client config. For Claude Desktop on
macOS, `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "everhour": {
      "command": "node",
      "args": ["/absolute/path/to/mcp everhour/dist/index.js"],
      "env": {
        "EVERHOUR_API_KEY": "ev_your_personal_api_key"
      }
    }
  }
}
```

For Claude Code (`~/.claude.json` or `.claude/settings.json`):

```json
{
  "mcpServers": {
    "everhour": {
      "command": "node",
      "args": ["/absolute/path/to/mcp everhour/dist/index.js"],
      "env": { "EVERHOUR_API_KEY": "ev_..." }
    }
  }
}
```

Restart the client. The 15 tools listed above will appear.

## Typical workflows

**Log time on an Asana ticket from its URL.**
The user pastes `https://app.asana.com/0/1234567890/1208034567890123` and says
"log 2 hours, fixed the retry bug":

1. Extract the GID `1208034567890123` from the URL.
2. Call `everhour_log_time_for_asana_task` with
   `asana_task_gid=1208034567890123`, `duration={ hours: 2 }`,
   `comment="fixed the retry bug"`.

**Find a task by name and start tracking.**

1. `everhour_search_tasks` with `query="login bug"`.
2. Pick the right task ID (`as:1208...`) from results.
3. `everhour_start_timer` with that `task_id`.
4. Later: `everhour_stop_timer`.

**Review what you logged this week.**

`everhour_list_time_records` with `from=YYYY-MM-DD` (Mon), `to=YYYY-MM-DD` (Sun).

## Daily logging workflow (log-everhour skill)

The `.claude/skills/log-everhour/` skill logs a day, week, or month of Asana-ticket work
in one pass. You give per-day entries (ticket + hours + a rough comment); it
resolves each ticket, **rephrases the comments to the Time Registration
Guidelines** (`.claude/skills/log-everhour/rephrasing-rules.md`), normalizes hours to
30-minute increments, warns about duplicates, shows a preview table, and logs
everything via `everhour_log_time_batch` after a single confirmation.

## Notes on Asana sync

Everhour pulls Asana tasks via the official integration. A task is only
visible in Everhour after:

- The Asana project has been added in Everhour (Settings → Integrations →
  Asana), or
- A user with the Everhour browser extension opens the task in Asana.

If `everhour_find_task_by_asana_id` returns a 404, sync hasn't happened yet.

## Environment variables

| Var | Required | Description |
|-----|----------|-------------|
| `EVERHOUR_API_KEY` | yes | Personal Everhour API key |

## License

MIT

TDQS

A4.6/5.0

Scored across 16 tools

Disambiguation5/5

Every tool has a clearly distinct purpose with detailed descriptions. Potential overlaps like everhour_log_time and everhour_log_time_for_asana_task are clearly differentiated as a convenience wrapper, and all timer, task, project, user, and time record tools have unambiguous scopes.

Naming Consistency5/5

All tools follow a consistent 'everhour_<action>_<target>' pattern using snake_case. Actions like get, list, log, start, stop, search, find, update, delete are used consistently, and longer names are descriptive without mixing conventions.

Tool Count5/5

16 tools is well-scoped for a time tracking server. Each tool earns its place covering CRUD for time records, timer management, task/project queries, and user management, without being excessive.

Completeness5/5

The tool surface covers the full lifecycle of time tracking: creating, reading, updating, deleting time records; timer start/stop/status; task and project lookups; and user information. No obvious gaps for the intended domain.

Maintenance

ActivityMaintained
ResponsivenessSyncing