First-party app
Everhour

Everhour

Everhour time tracking: projects, tasks, time records, timers, timecards, timesheets, expenses, invoices, clients, schedule, time off and reports.

stable ProductivityProject ManagementFinance & Accounting

About

Everhour ships in the w6w first-party pack. It declares 97 actions, 3 health checks, and the host runs its code in a sandbox that never sees the credential.

App id
io.w6w.everhour
Version
0.1.0
Author
w6w
Licence
MIT
Categories
Productivity · Project Management · Finance & Accounting

Overview

Everhour is a time tracker that lives inside the project tools a team already uses. This app drives its REST API from a workflow: read and manage projects, sections and tasks (including task estimates and custom fields), log time or run a timer against a task, and read per-user, per-task and per-project time.

Beyond time entries it covers the rest of the Everhour account: clients and their budgets, expenses and expense categories, invoices (create, refresh from tracked time, mark draft/sent/paid, export), the resource-planner schedule, time off with its types and allocations, timecards (clock in/out), weekly timesheets with approval, project/client/user reports, and webhooks for reacting to Everhour events.

Authentication is a single personal API key sent as the X-Api-Key header. The key acts as its owner, so what a workflow can see and change follows that user’s role.

Build with Everhour

Three routes to the same 97 actions. The Workflow tab is generated from Everhour's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.

Create Time-Off Allocation

allocation-create

Allocate time-off days to users.

Delete Time-Off Allocation

allocation-delete

Delete a time-off allocation.

List Time-Off Allocations

allocation-list

List time-off allocations.

Update Time-Off Allocation

allocation-update

Update a time-off allocation.

Create Assignment

assignment-create

Schedule time for one or more users.

Delete Assignment

assignment-delete

Delete a resource-planner assignment.

List Assignments

assignment-list

List resource-planner assignments, optionally filtered.

Update Assignment

assignment-update

Update a resource-planner assignment.

Create Attachment

attachment-create

Upload an attachment (base64) to attach to an expense or time off.

Delete Attachment

attachment-delete

Delete an attachment.

Delete Client Budget

client-budget-delete

Remove a client's budget.

Set Client Budget

client-budget-set

Set or replace a client's budget.

Create Client

client-create

Create a client.

Get Client

client-get

Fetch one client, including its budget.

List Clients

client-list

List clients, optionally filtered by name.

Clients Report

client-report

Totals per client (time in seconds, amounts in cents).

Update Client

client-update

Update a client's name, linked projects or business details.

Add Attachment To Expense

expense-attachment-add

Upload an attachment (base64) directly onto an expense.

Create Expense Category

expense-category-create

Create an expense category.

Delete Expense Category

expense-category-delete

Delete an expense category, moving or deleting its expenses.

List Expense Categories

expense-category-list

List expense categories.

Update Expense Category

expense-category-update

Update an expense category.

Create Expense

expense-create

Record an expense.

Delete Expense

expense-delete

Delete an expense.

List Expenses

expense-list

List all expenses.

Update Expense

expense-update

Update an expense.

Create Project Field

field-create

Create a custom field in a project.

Delete Field

field-delete

Delete a custom field.

List Project Fields

field-list

List a project's custom field configuration.

Reorder Project Fields

field-reorder

Set the order of a project's custom fields.

Update Field

field-update

Update a custom field.

Create Invoice

invoice-create

Create an invoice for a client from tracked time and expenses.

Delete Invoice

invoice-delete

Delete an invoice.

Export Invoice

invoice-export

Export an invoice to the connected accounting system (Xero, QuickBooks or FreshBooks).

Get Invoice

invoice-get

Fetch one invoice with its line items.

List Invoices

invoice-list

List all invoices.

Refresh Invoice Line Items

invoice-refresh

Rebuild an invoice's line items from the current tracked time and expenses.

Set Invoice Status

invoice-status-set

Mark an invoice as draft, sent or paid.

Update Invoice

invoice-update

Update an invoice's number, dates, notes, tax, discount or line items.

Archive Project

project-archive

Archive or unarchive a project.

Set Project Billing And Budget

project-billing-set

Set a project's billing type, rates and budget.

Create Project

project-create

Create an Everhour project.

Delete Project

project-delete

Delete a project.

Get Project

project-get

Fetch one project with its billing, rate and budget.

List Projects

project-list

List projects, optionally by name or integration.

Projects Report

project-report

Totals per project (time in seconds, amounts in cents).

Sync Integration Project

project-sync

Import a project that exists in a connected tool (Asana, Trello, ClickUp, ...) into Everhour immediately. Safe to repeat.

Search Project Tasks

project-task-search

Search tasks within one project.

List Project Time Records

project-time-list

List the time records of one project.

Update Project

project-update

Update a project's name, type or assigned users.

Create Section

section-create

Create a section in a project.

Delete Section

section-delete

Delete a section.

Get Section

section-get

Fetch one section.

List Project Sections

section-list

List a project's sections.

Update Section

section-update

Update a section.

Create Task

task-create

Create a task in a project.

Delete Task

task-delete

Delete a task.

Delete Task Estimate

task-estimate-delete

Remove a task's estimate.

Set Task Estimate

task-estimate-set

Set a task's time estimate, overall or per user.

Get Task

task-get

Fetch one task; optionally with billing.

List Project Tasks

task-list

List the tasks in a project.

Search Tasks

task-search

Search tasks across all projects.

List Task Time Records

task-time-list

List the time records of one task.

Update Task

task-update

Update a task.

Add Time

time-add

Log time against a task.

Delete Time Record

time-delete

Delete a time record; answers with the deleted record.

List Team Time Records

time-list

List time records for the whole team.

Create Time Off

time-off-create

Create a time-off entry (goes through the resource-planner assignments endpoint).

Create Time-Off Type

time-off-type-create

Create a time-off type.

Delete Time-Off Type

time-off-type-delete

Delete a time-off type.

List Time-Off Types

time-off-type-list

List time-off types.

Update Time-Off Type

time-off-type-update

Update a time-off type.

Update Time Record

time-update

Change a time record.

Clock In

timecard-clock-in

Clock a user in.

Clock Out

timecard-clock-out

Clock a user out.

Delete Timecard

timecard-delete

Delete a user's timecard for a day.

Get Timecard

timecard-get

Fetch a user's timecard for one day.

List All Timecards

timecard-list

List the whole team's timecards (the last two weeks by default).

Update Timecard

timecard-update

Edit a user's timecard for a day.

Get Running Timer

timer-current

Fetch the key owner's current timer.

Start Timer

timer-start

Start the key owner's timer on a task (stopping any running one).

Stop Timer

timer-stop

Stop the key owner's running timer.

List Team Timers

timer-team-list

List every team member's timer.

Discard Approval Request

timesheet-approval-discard

Withdraw your own approval request.

Request Timesheet Approval

timesheet-approval-request

Submit a week for approval (or approve it, for an admin).

Approve Or Reject Timesheet

timesheet-approval-review

Approve or reject a submitted timesheet.

List Team Timesheets

timesheet-list

List the team's timesheets for one week.

List Users

user-list

List the team's users.

Get Current User

user-me

Fetch the user the API key belongs to.

Users Report

user-report

Totals per user (time in seconds, amounts in cents).

List User Time Records

user-time-list

List one user's time records.

List User Timecards

user-timecard-list

List a user's timecards (the last two weeks by default).

List User Timesheets

user-timesheet-list

List a user's weekly timesheets.

Create Webhook

webhook-create

Register a webhook.

Delete Webhook

webhook-delete

Delete a webhook.

Get Webhook

webhook-get

Fetch one webhook.

Update Webhook

webhook-update

Change a webhook's target, events or project.

A workflow step names the app and the action, and the editor fills in the connection when you pick one. This is the Step shape from the workflow spec, carrying Everhour's real ids.

{
  "manifestVersion": "2",
  "name": "everhour-example",
  "steps": [
    {
      "id": "allocation-create",
      "uses": {
        "app": "io.w6w.everhour",
        "action": "allocation-create",
        "connection": "conn_YOUR_CONNECTION_ID"
      },
      "with": {
        "startDate": "<startDate>",
        "endDate": "<endDate>",
        "users": "<users>"
      }
    }
  ]
}

Here are some of the things you can do

  • Create Time-Off Allocation

    perform
    allocation-create
  • List Time-Off Allocations

    search
    allocation-list
  • Update Time-Off Allocation

    perform
    allocation-update
  • Create Assignment

    perform
    assignment-create
  • List Assignments

    search
    assignment-list

+92 more actions available

Every app-specific value here is a blank you have to fill in. An app action is reached through the connection that authenticates it, so the address is a connection id, not the app id — and connections belong to your account, so a public page cannot know yours. Create one for Everhour, then fill in the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the parameters that action declares. The call itself is real — the shape is transcribed from the studio's own snippet builder, which prints the same kind of blanks — but nothing in it is specific to Everhour. The Workflow tab is where this app's real ids are.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { W6wClient, isActionRun } from "@w6w/sdk";

// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();

const envelope = await client.run({
  urn: "conn_YOUR_CONNECTION_ID",
  action: "allocation-create",
  payload: {
    startDate: "<value>",
    endDate: "<value>",
    // contractStartDate: "<value>",
    users: "<value>",
    timeOffType: "<value>",
    days: "<value>",
    // daysCarried: "<value>",
    // accrualFrequency: "<value>",
    // restrictOverAllocation: "<value>",
    // completed: "<value>",
    // notes: "<value>",
  },
});

if (isActionRun(envelope)) console.log(envelope.value);
Install the CLI
npm install -g @w6w/cli
CLI
w6w run conn_YOUR_CONNECTION_ID --action allocation-create --payload '{"startDate":"<value>","endDate":"<value>","users":"<value>","timeOffType":"<value>","days":"<value>"}'

Give an AI agent Everhour — without giving it Everhour's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.

One tool call
{
  "name": "w6w_invoke",
  "arguments": {
    "ref": "app:io.w6w.everhour#allocation-create",
    "input": {
      "startDate": "<startDate>",
      "endDate": "<endDate>",
      "users": "<users>"
    }
  }
}

Every tool names its target with a single ref. The app: form above doesn't name a connection at all — the host resolves which of the caller's Everhour connections to sign with, and refuses rather than guesses when the answer is ambiguous.

What the agent gets

Credentials it can't read

The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.

A tool surface scoped to the caller

Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.

A durable workflow in one call

Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.

Health-aware discovery

Everhour's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.

The MCP surface is part of the hosted platform. Everhour itself is MIT, and the runtime that executes it is source-available (FSL).

Request MCP access

Health checks

Everhour declares its own checks, so its health is a property of the app rather than something the host guesses at.

service

Everhour platform status

dependency

API reachable

Unauthenticated GET https://api.everhour.com/users/me. A 403 carrying Everhour's JSON `{"code": …, "message": …}` passes — it proves the API and its auth layer are answering. Credential validity is the derived `auth:*` check's job.

quota

API rate-limit headroom