The time.* family (4 verbs). Every verb enters through the one front door: it is capability-checked, permission-checked, scope-checked and audited before it runs (see Security & permissions). Each entry below lists its capability, risk class (which fixes the minimum autonomy level), the minimum caller permission, its availability tier, whether it is idempotent, and any outbound egress.
Edittime.edit
| Property | Value |
|---|---|
| Capability | matter.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | Core - always on (MCP tier 1) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Amend an UNBILLED entry. { id, minutes?, description?, workDate?, billable?, rateMinor? }. A billed entry (billed_line_item_id set, or locked) is REFUSED - once time
has been rolled into an invoice line it is immutable (the WHERE clause enforces it; a zero-row update
is reported as a clean reject, never a silent no-op).
Input
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | the time_entry id |
minutes | integer | no | |
description | string | no | |
workDate | string | no | |
billable | boolean | no | |
rateMinor | integer | no |
Call POST /v/time.edit with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool time.edit.
Listtime.list
| Property | Value |
|---|---|
| Capability | matter.read |
| Risk class | Read - autonomy L0 |
| Min. permission | Member |
| Availability | Core - always on (MCP tier 1) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
| Render schema | Yes - drives an inline chat artefact and a GUI panel |
A matter’s time entries. { matterId, unbilledOnly?, from?, to? }.
Returns the rows (newest-work-first) plus integer minute totals (all / billable) for the slice.
Input
| Field | Type | Required | Description |
|---|---|---|---|
matterId | string | yes | |
unbilledOnly | boolean | no | |
from | string | no | YYYY-MM-DD |
to | string | no | YYYY-MM-DD |
Call POST /v/time.list with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool time.list.
Logtime.log
| Property | Value |
|---|---|
| Capability | matter.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | Core - always on (MCP tier 1) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Record a unit of time on a matter.
{ matterId, minutes, description?, workDate?(YYYY-MM-DD), billable?(=true), stepId?, actorId?, rateMinor? }.
The timekeeper defaults to the caller (actorId overrides, e.g. an admin logging on someone’s behalf);
created_by is always the caller. rateMinor is an optional per-entry rate override (NULL = the
matter profile rate at roll-up).
Input
| Field | Type | Required | Description |
|---|---|---|---|
matterId | string | yes | |
minutes | integer | yes | duration in whole minutes (>0) |
description | string | no | |
workDate | string | no | YYYY-MM-DD (default today) |
billable | boolean | no | default true |
stepId | string | no | optional matter step |
actorId | string | no | timekeeper; default the caller |
rateMinor | integer | no | optional per-entry rate override, minor-units/hour |
Call POST /v/time.log with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool time.log.
Rolluptime.rollup
| Property | Value |
|---|---|
| Capability | matter.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Admin |
| Availability | Vertical (MCP tier 3) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Roll a matter’s UNBILLED BILLABLE time for a period into delivered
matter_line_item rows + a timesheet. { matterId, periodStart, periodEnd, taxRateBp? }. The existing
bill.invoice then mints the invoice from the delivered lines (this verb moves no money). v1 prices at
the matter rateMinor override; resolving the PRODUCTS rate-card price + per-entry overrides is the
next refinement (the rate-card provenance is already carried onto each line).
Input
| Field | Type | Required | Description |
|---|---|---|---|
matterId | string | yes | |
periodStart | string | yes | YYYY-MM-DD |
periodEnd | string | yes | YYYY-MM-DD |
taxRateBp | integer | no | tax rate in basis points (default 0) |
Call POST /v/time.rollup with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool time.rollup.