Skip to main content
Glama

Log Time Entry

log_time_entry

Logs time the connected person worked, from hours or minutes, against a project (by projectId, or by its code or name, e.g. "RISE"), a task or an activity code. Handles requests like "log 2 hours on RISE for the site survey". The entry is always the person's own, on the work date in their time zone (default today), rated and billable exactly as one typed in the app. Each requestKey logs at most one entry: a repeat call with the same requestKey (for example after a timeout) returns the entry the first call logged, marked replayed, instead of logging it twice. The result names the call that undoes it. Work on a company holiday or an approved leave day, or under a leave or holiday activity code, is not logged without confirmTimeOffDay: the result says which day off it is and nothing is written.

Input Schema

NameRequiredDescriptionDefault
hoursNoHours worked (e.g. 1.5). Give hours or minutes, not both; one of the two is required.
taskIdNoTask ID to log against (optional). With no project, the entry goes on the task's project; with one, the task must be on that project.
userIdNoNot needed when signed in: the entry is always the connected user's, and any other ID is refused. Applies only to a workspace connection with no signed-in user, naming whose time this is.
minutesNoMinutes worked (e.g. 90). Give hours or minutes, not both; one of the two is required.
projectNoThe project as the person said it: its code (e.g. "RISE") or its name. Matched exactly on code first. When several projects match, nothing is written and the candidates come back to ask about. Give projectId or project, not both.
billableNoWhether the time is billable (default true)
entryDateNoThe work date as YYYY-MM-DD (e.g. "2026-03-29"). Defaults to today in the person's time zone.
projectIdNoProject ID to associate with (optional)
requestKeyNoA caller-chosen key unique to this one entry (8 to 128 letters, digits, dots, colons, underscores or hyphens). A repeat with the same key within a day returns the first entry instead of logging another.
descriptionNoWhat was done
activityCodeIdNoActivity code ID (optional), one of the workspace activity codes. Can set the rate.
confirmTimeOffDayNoTrue only when the person has said they really worked on a day that is a company holiday or approved leave for them, or wants the time under a leave or holiday activity. Without it, such an entry is not logged.

Output Schema

NameRequiredDescriptionDefault
undoNoThe call that reverses this one, with its arguments.
entryNo
replayedNoTrue when a call with this requestKey already logged the entry, so nothing new was logged
timeOffConflictNoPresent when nothing was logged because the day is a day off or the activity is time off

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / properties / confirmTimeOffDay
      Added value: +{
      +  "description": "True only when the person has said they really worked on a day that is a company holiday or approved leave for them, or wants the time under a leave or holiday activity. Without it, such an entry is not logged.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / timeOffConflict
      Added value: +{
      +  "anyOf": [
      +    {
      +      "properties": {
      +        "activityLabel": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "date": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "hours": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "kind": {
      +          "anyOf": [
      +            {
      +              "enum": [
      +                "leave",
      +                "holiday"
      +              ],
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "name": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "reason": {
      +          "anyOf": [
      +            {
      +              "enum": [
      +                "day",
      +                "activity"
      +              ],
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "timeClass": {
      +          "anyOf": [
      +            {
      +              "enum": [
      +                "leave",
      +                "holiday"
      +              ],
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Present when nothing was logged because the day is a day off or the activity is time off"
      +}
  2. Changed7 schema fields changed
    • addedInput schema / properties / activityCodeId
      Added value: +{
      +  "description": "Activity code ID (optional), one of the workspace activity codes. Can set the rate.",
      +  "maxLength": 128,
      +  "type": "string"
      +}
    • changedInput schema / properties / entryDate / description
      Previous value: -"The work date as YYYY-MM-DD (e.g. \"2026-03-29\"). Defaults to today."New value: +"The work date as YYYY-MM-DD (e.g. \"2026-03-29\"). Defaults to today in the person's time zone."
    • addedInput schema / properties / project
      Added value: +{
      +  "description": "The project as the person said it: its code (e.g. \"RISE\") or its name. Matched exactly on code first. When several projects match, nothing is written and the candidates come back to ask about. Give projectId or project, not both.",
      +  "maxLength": 120,
      +  "type": "string"
      +}
    • addedInput schema / properties / projectId / maxLength
      Added value: +128
    • changedInput schema / properties / taskId / description
      Previous value: -"Task ID to log against (optional). With no projectId, the entry goes on the task's project; with one, the task must be on that project."New value: +"Task ID to log against (optional). With no project, the entry goes on the task's project; with one, the task must be on that project."
    • changedOutput schema / properties / entry / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "billable": {
      -        "anyOf": [
      -          {
      -            "type": "boolean"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "entryDate": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "id": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "minutes": {
      -        "anyOf": [
      -          {
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "projectId": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "taskId": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "activityCodeId": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "billable": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "description": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "entryDate": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "hours": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "id": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "minutes": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "projectCode": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "projectId": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "projectName": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "status": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "taskId": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / undo
      Added value: +{
      +  "anyOf": [
      +    {
      +      "properties": {
      +        "arguments": {
      +          "anyOf": [
      +            {
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "tool": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The call that reverses this one, with its arguments."
      +}
  3. First observed

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the basic safety profile (readOnly=false, destructive=false, idempotent=false), yet the description adds real behavioral depth: requestKey replay semantics (a repeat returns the first entry marked replayed instead of double-logging), the ownership constraint (entry is always the connected person's, other userIds refused), timezone-based defaulting of the work date, the result pointing to its undo call, and the specific refusal mode for holiday/leave days. These are exactly the traits an agent cannot infer from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and an example, then the two safety-relevant behaviors (replay and time-off confirmation) at the end. Dense but nearly every clause carries information; the final sentence is long but earns its length by describing the refusal outcome.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A 12-parameter write tool whose return values are covered by an output schema, so the description only needs to carry behavioral risk. It does: idempotency, ownership, date defaulting, ambiguity handling, and the time-off gate that blocks the write. Nothing an agent needs to call it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter thoroughly, including project code-first matching, hours-vs-minutes exclusivity, and the confirmTimeOffDay contract. The description restates the project-by-code-or-name and hours/minutes semantics without adding format or precedence detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (logs time worked) plus the three things it can be attached to (project, task, activity code) and the units accepted. This clearly separates it from update_time_entry, delete_time_entry, and start_timer/stop_timer siblings, which handle different lifecycle stages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete invocation context ("log 2 hours on RISE for the site survey") and an explicit conditional rule for confirmTimeOffDay: do not log holiday/leave days without it. It does not, however, name alternatives such as update_time_entry for corrections or start_timer for live tracking, so routing between siblings is left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources