Timesheet Portal MCP server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TSP_EDITION | No | The edition: 'standard' (Standard / Project edition, default) or 'recruitment'. It decides which tools are registered and which report fields are requested. | standard |
| TSP_BASE_URL | No | Defaults 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_ID | Yes | The API client id. | |
| TSP_ALLOW_WRITES | No | Ignored: the server is read-only and has no write tools, whatever the environment says. | |
| TSP_CLIENT_SECRET | Yes | The API client secret. | |
| TSP_CALL_BUDGET_SECONDS | No | How 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_MINUTE | No | How 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
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 8 tools
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.
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.
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.
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.