Skip to main content
Glama
dragosh29

Timesheet Portal MCP server

by dragosh29

Timesheet (time and cost) report

list_timesheets
Read-onlyIdempotent

Retrieve timesheet time and cost report rows for a date range, grouped by task and employee, with optional status, client, project, or employee filters.

Instructions

Time recorded on timesheets for a date range (POST /reports/timesheets, the documented "time and cost report"; a POST that changes nothing), summed per task and employee for each period of time_grouping. Columns are the documented example's: Date, Status, CompanyName, CompanyReference, ChargeCodeGroup, ChargeCodeGroupReference, ChargeCode, ChargeCodeDesc, EmployeeReference, EmployeeName, ApproverName, EntryQuantity, RateCode, RateName, Units, ChargeRate, TotalCharge, TimesheetUpdateSequence; PayRate, TotalPay only with include_contact_details. Filters sent as documented: timesheetStatusFilters, clientFilter, costCentreFilter, employeeGroupFilter, employeeFilter, chargeCodeGroupFilter, taskCodeFilter, approvedDateFilterStart/End, modifiedAfterDate. Each call counts against the documented limit of 24 report requests and 500 records read per hour: keep ranges narrow. One page per call (pageIndex); the page size is not documented. Every value is redacted like free text, and a row whose length does not match the requested columns is refused rather than mislabelled.

Input Schema

NameRequiredDescriptionDefault
end_dateYesLast date, YYYY-MM-DD (at most 366 days after start_date)
statusesNoTimesheet statuses to include (default All)
task_codeNoSent as taskCodeFilter
page_indexNoPage of the report (pageIndex, zero-based)
start_dateYesFirst date, YYYY-MM-DD
approved_toNoOnly time approved before this date/time (approvedDateFilterEnd)
client_codeNoSent as clientFilter
max_resultsNoMost rows to return in this call (default 100); the answer says how many were left out
project_codeNoSent as chargeCodeGroupFilter
approved_fromNoOnly time approved since this date/time (approvedDateFilterStart)
employee_codeNoSent as employeeFilter
time_groupingNoTime grouping of the rows (reportTimeGrouping)Weekly
modified_afterNoOnly records modified after this date/time (modifiedAfterDate)
cost_centre_codeNoSent as costCentreFilter
employee_group_codeNoSent as employeeGroupFilter
include_contact_detailsNoInclude the pay columns (PayRate, TotalPay), and stop redacting email addresses, phone numbers, national insurance numbers and UK postcodes typed into names and other text (bank and card numbers are always removed)

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations: clarifies that the POST 'changes nothing' (reinforcing readOnly/idempotent), discloses the documented rate limits (24 report requests and 500 records read per hour), pagination behavior (one page per call, page size undocumented), blanket redaction of values, and that malformed rows are refused rather than mislabelled. The rate limits and redaction/no-op-row rules are exactly the kind of context structured fields cannot carry.

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-loads the purpose and endpoint before the column list and constraints, and given 16 parameters and no output schema the length is largely justified. It is dense and slightly repetitious in its 'the documented ...' phrasing, but each sentence carries real information.

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?

With no output schema, the description compensates by enumerating the returned columns, explaining the pay-column dependency on include_contact_details, and documenting pagination and truncation reporting ('the answer says how many were left out'). An agent has everything needed to call and interpret the result.

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 every parameter is already documented, including the filter name mappings (taskCodeFilter, clientFilter, etc.). The description restates the filter set and the include_contact_details pay-column rule but adds little syntax or nuance 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+resource (time recorded on timesheets for a date range), names the underlying endpoint (POST /reports/timesheets) and identifies it as the documented 'time and cost report'. It also clarifies the aggregation ('summed per task and employee for each period of time_grouping'), which distinguishes it from the sibling entity-listing tools like list_projects and list_users.

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?

Gives clear situational context: this is the reporting endpoint, and the caller should 'keep ranges narrow' because of the hourly request/record limits. It does not explicitly name when to choose this over a sibling report/list tool, so it falls just short of the 5 bar for named alternatives.

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