everhour-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| EVERHOUR_API_KEY | Yes | Personal Everhour API key |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| everhour_get_current_userA | Returns the Everhour user account associated with the configured EVERHOUR_API_KEY. Use this to discover the caller's user ID, which is required by some endpoints (e.g. when listing time records for "me") and to verify the API key is valid before logging time. Args:
Returns: JSON shape: { "id": number, "name": string, "email": string, "role": string, "status": string, "headline"?: string, "capacity"?: number // weekly capacity in seconds } Examples:
Error Handling:
|
| everhour_list_usersA | List the workspace's team members with their Everhour user IDs. Admin access required. Use this to resolve a person's name to their numeric Everhour user ID, which you then pass as 'user_id' to everhour_log_time / everhour_log_time_batch to log time on their behalf (admins only). Args:
Returns an array of user objects: { id, name, email, role, status, ... }. Examples:
Error Handling:
|
| everhour_list_projectsA | List or search Everhour projects, optionally filtered by source platform (e.g. Asana). Useful for:
Args:
Returns: JSON shape: { "total": number, "count": number, "offset": number, "items": [{ "id": "as:...", "name": string, "platform": string, "status": string, "client"?: { "name": string }, ... }], "has_more": boolean, "next_offset"?: number } Examples:
Error Handling:
|
| everhour_get_projectA | Fetch a single project by its Everhour project ID. Args:
Returns the full project record including name, platform, status, workspace, billing, budget, and members. Examples:
Error Handling:
|
| everhour_search_tasksA | Search tasks in Everhour by name, optionally scoped to a project. This is the primary way to find an Everhour task that mirrors an Asana ticket when you only know the ticket name. Asana-synced tasks appear with IDs like 'as:'. Args:
Returns: { "total": number, "count": number, "offset": number, "items": [{ "id": "as:...", "name": string, "url": string, "status"?: string, "projects"?: string[] }], "has_more": boolean, "next_offset"?: number } Examples:
Error Handling:
|
| everhour_get_taskA | Fetch a single Everhour task by ID, including total tracked time, estimate, and per-user time breakdown. Args:
Returns the full task object with name, projects, status, estimate (seconds), time.total (seconds), URL, etc. Examples:
Error Handling:
|
| everhour_find_task_by_asana_idA | Look up an Everhour task by the underlying Asana task GID. Everhour syncs Asana tasks with IDs of the form 'as:'. This tool builds that ID and fetches the task in one step. Use this before logging time when the user gives you an Asana ticket URL or GID. Args:
Returns the full Everhour task record (same as everhour_get_task). Examples:
Error Handling:
|
| everhour_log_timeA | Log (add) tracked time against an Everhour task. This is the primary tool for recording hours worked. Args:
Returns the created time record: { "id": number, "date": "YYYY-MM-DD", "user": number, "time": number, // seconds "comment": string | null, "task": { "id": string, "name"?: string }, "createdAt": "ISO-8601" } Examples:
Error Handling:
|
| everhour_log_time_for_asana_taskA | Workflow tool: log time on the Everhour task that mirrors a given Asana task GID. Equivalent to calling everhour_log_time with task_id='as:', but spares you having to construct the ID. Use this when the user gives you an Asana ticket URL/GID and asks to log hours. Args:
Returns the created time record (same shape as everhour_log_time). Examples:
Error Handling:
|
| everhour_log_time_batchA | Log a batch of time records in a single call — one entry per (task, date). Built for the log-everhour daily/weekly/monthly workflow: pass already-resolved task IDs and already-rephrased comments. Each entry is logged sequentially. A single row failing (404 not synced, 409 already exists, etc.) does NOT abort the batch unless stop_on_error is true — failures are reported per row. Durations are normalized to increment_hours (default 30 min). Comments are checked against absolute rules; a forbidden word or empty comment rejects that row unless allow_rule_violations is true. Args:
Returns: { "results": [{ "ok": boolean, "task_id": string, "date": string, "hours": number, "rounded"?: boolean, "warnings"?: string[], "record_id"?: number, "error"?: string }], "summary": { "logged": number, "failed": number, "totalHours": number } } Examples:
Error Handling:
|
| everhour_list_time_recordsA | List time records for a user across an optional date range, with optional project/task filters. Use this to review what's already been logged before adding more, or to build a timesheet. Args:
Returns: { "total": number, "count": number, "offset": number, "items": [{ "id": number, "date": string, "time": number, "comment": string|null, "task": { "id": string, "name"?: string } }], "has_more": boolean, "next_offset"?: number } Markdown output also shows a 'total tracked' summary. Examples:
Error Handling:
|
| everhour_update_time_recordA | Modify an existing time record (change duration, date, or comment). Args:
Returns the updated time record. Examples:
Error Handling:
|
| everhour_delete_time_recordA | Permanently delete a time record. Cannot be undone. Args:
Returns a confirmation message on success. Examples:
Error Handling:
|
| everhour_start_timerA | Start the active timer on an Everhour task. Only one timer can run at a time per user; starting a new one stops the previous. Args:
You must provide exactly one of task_id or asana_task_gid. Returns the timer state (status='active', task, startedAt, today seconds, duration). Examples:
Error Handling:
|
| everhour_stop_timerA | Stop the currently running timer for the authenticated user. Everhour will commit the elapsed time as a time record on the task. Args:
Returns the timer state after stopping (status='stopped', today total seconds). Examples:
Error Handling:
|
| everhour_get_current_timerA | Return the state of the authenticated user's timer. Args:
Returns:
Examples:
|
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 16 tools
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.
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.
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.
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.