# log_time (/docs/reference/mcp-tools/log_time)



{/* Generated by apps/docs/scripts/generate-mcp-pages.mjs — do not edit by hand. */}

Log time on a work item after the fact (duration or start/end; source=MCP).

|                     |                        |
| ------------------- | ---------------------- |
| Required permission | `work:write`           |
| Capability ID       | `timeTracking.logTime` |
| Destructive         | No                     |

## Parameters [#parameters]

| Parameter         | Type                        | Required | Notes |
| ----------------- | --------------------------- | -------- | ----- |
| `durationSeconds` | integer                     | no       |       |
| `startedAt`       | string (ISO date-time)      | no       |       |
| `endedAt`         | string (ISO date-time)      | no       |       |
| `date`            | string                      | no       |       |
| `note`            | string                      | no       |       |
| `billable`        | boolean                     | no       |       |
| `classification`  | `PLANNED` \| `INTERRUPTION` | no       |       |
| `workItemId`      | string (uuid)               | yes      |       |

## Input schema (JSON Schema) [#input-schema-json-schema]

```json
{
  "type": "object",
  "properties": {
    "durationSeconds": {
      "type": "integer",
      "minimum": 0
    },
    "startedAt": {
      "type": "string",
      "format": "date-time"
    },
    "endedAt": {
      "type": "string",
      "format": "date-time"
    },
    "date": {
      "type": "string",
      "pattern": "/^\\d{4}-\\d{2}-\\d{2}$/"
    },
    "note": {
      "type": "string",
      "maxLength": 2000
    },
    "billable": {
      "type": "boolean"
    },
    "classification": {
      "type": "string",
      "enum": [
        "PLANNED",
        "INTERRUPTION"
      ]
    },
    "workItemId": {
      "type": "string",
      "format": "uuid"
    }
  },
  "required": [
    "workItemId"
  ],
  "additionalProperties": false
}
```

## Access control [#access-control]

A call succeeds only when the personal access token's scopes **and** the holder's role both allow `work:write` (effective permission = scope ∩ role, default-deny). The tool runs inside the token owner's organization — tenancy is never a parameter.
