Skip to main content
Glama
dragosh29

Timesheet Portal MCP server

by dragosh29

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
TSP_EDITIONNoThe edition: 'standard' (Standard / Project edition, default) or 'recruitment'. It decides which tools are registered and which report fields are requested.standard
TSP_BASE_URLNoDefaults to https://tenant.api.timesheetportal.com, the host the documentation names for the token endpoint and the API. If your account has its own API host, set it here.https://tenant.api.timesheetportal.com
TSP_CLIENT_IDYesThe API client id.
TSP_ALLOW_WRITESNoIgnored: the server is read-only and has no write tools, whatever the environment says.
TSP_CLIENT_SECRETYesThe API client secret.
TSP_CALL_BUDGET_SECONDSNoHow long one tool call may spend walking pages (default 25, from 1 to 50): no new page is started after it, and the answer says where to continue.25
TSP_REQUESTS_PER_MINUTENoHow many requests per minute this server may send, spread evenly (default 30, the documented per-account limit, so one request every 2 seconds). Lower it if other integrations use the same account.30

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_projectsA

Projects (GET /projects, documented page size 250) with client, category, dates, charge budget, manager, cost centre and purchase order. Filters sent as documented: id (a project code), clientCode, categoryCode, lastModified. The pay budget, billing contact and address only with include_contact_details.

list_clientsA

Clients (GET /clients) with code, name, category, cost centre, currency, payment terms, invoicing settings and notes. Filters sent as documented: id (a client code), costCentreCode, clientCategoryCode, ModifiedSince. Addresses, billing name and email, tax and company numbers only with include_contact_details (which also sends include=address,billing).

list_usersA

Users (GET /users): code, name, job title, role, employment type, group, home cost centre and line manager. Filters sent as documented: id (a single user), groupCode, ModifiedSince. Join and leave dates, the accounting code (which the spec says usually holds the payroll number), email, mobile, date of birth, gender, address and a limited-company contractor's company details only with include_contact_details. Bank details, national insurance and tax numbers, the payroll details in employmentDetails and HR personal details are never returned (includedFields is never sent).

list_cost_centresB

Cost centres (GET /costcentres): code and description (contact details typed into a description are redacted). Filter sent as documented: Code.

list_timesheetsA

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.

list_invoicesA

Invoices dated in a range (POST /invoices, 'Get invoices'; a POST that changes nothing): number, status, dates, client, project, task, worker, currency, net, tax and total, and optionally the line items. invoice_type picks client invoices (default), client credit notes, self-billing invoices or self-billing credit notes (sent as invoiceReportType, whose spec description reads 'Deprecated - (only used by /invoices/ POST endpoint)'). Other filters sent as documented: invoiceStatusFilters (empty returns every status, Draft included), clientCode, costCentreCode, chargeCodeGroupCodes, exportedFilter, modifiedAfter. Self-billing invoices are contractor pay: their amounts only with include_contact_details (any invoice returned for a self-billing type is treated as self-billing, whatever its invoiceSelfBilling flag says). Probably counts against the report limits (24 per hour); the endpoint documents no paging, so at most max_results invoices are shown.

list_leave_balancesB

Annual leave summary for every employee for one leave year (GET /leavebookings/summary): allowance, carried over, approved booked leave, non-deductible leave, manual adjustments and end-of-year balance, in the units the account records (hours or days). leave_year is any date in the wanted leave year (the API uses the leave year that date falls in); today when omitted.

list_leaveA

Leave bookings (holidays and other absences) in a date range (POST /leavebookings/reports/bookings, "Get leave bookings report"; a POST that changes nothing). Columns: EmployeeReference, EmployeeName, LeaveCategory, LeaveStatus, LeaveStartDate, LeaveEndDate, LeaveTotalWorkingDays, LeaveUnits, LeaveRequestDate, LeaveReviewedDate; LeaveComments only with include_contact_details. Filters sent as documented: statusFilters (omitted for every status), employeeFilter, employeeGroupFilter, modifiedAfterDate. The endpoint documents no paging; whether it counts against the report limits is not documented.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4/5.0

Scored across 8 tools

Disambiguation5/5

Each tool wraps a distinct resource (projects, clients, users, cost centres, timesheets, invoices, leave balances, leave bookings) with a clear resource+action pairing. The only near-neighbour pair, list_leave_balances (aggregate annual summary) vs list_leave (individual bookings), is clearly differentiated by descriptions and parameters.

Naming Consistency5/5

Uniform list_<plural_noun> snake_case pattern across all eight tools, with consistent British spelling for 'cost_centres'. No mixing of verb styles or casing conventions.

Tool Count5/5

Eight tools is well-scoped for a read/reporting-oriented timesheet API, and each covers a genuinely distinct reporting need. No redundant or filler tools.

Completeness4/5

Broad read coverage of the portal's core entities and reports, but reference data used by filters (charge codes, task codes, rate codes) has no listing tool, and the surface is entirely read-only so no create/update/approve workflows exist. These are workable gaps for a reporting server but leave some dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues