WorkMobile MCP server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| WORKMOBILE_API_KEY | Yes | The API token (a GUID) of a portal user, sent as the X-API-Key header. Required. | |
| WORKMOBILE_BASE_URL | No | The WorkMobile API base URL. Defaults to https://www.esayworkmobile.co.uk/webapi2. Must not contain a username or password. | https://www.esayworkmobile.co.uk/webapi2 |
| WORKMOBILE_ALLOW_WRITES | No | Set to true to register create_job, allocate_job, approve_record and reject_record. Off by default. | false |
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_jobsA | Search jobs with the filters POST /api/jobs/search documents: status IDs, estimated start date range, the mobile users they are allocated to, job types, a description, priority, backlog and whether a duration is set. Returns job ID, description, status ID, type, priority, dates and allocation; the job's location is withheld unless include_contact_details is set. In descriptions, emails, phone numbers, postcodes and coordinates are redacted, but names and street addresses typed into them are not. This search is a POST request that only reads. Pages hold 500 jobs; a page with fewer than 500 is the last. |
| get_jobA | One job by ID: description, status, type, priority, dates, allocation, its history (status changes with narrative) and its job data (the fields of the job's form). Unless include_contact_details is set, the job location and job data fields whose names mark them as personal (names, contact details, addresses, signatures, photos, locations) are withheld; in the description, the history narratives and other fields, emails, phone numbers, postcodes and coordinates are redacted, but names and street addresses written in that free text are not. Uses GET /api/jobs/{id}. |
| list_job_statusesA | WorkMobile's static list of job statuses and their IDs (GET /api/jobs/jobstatuslist), to decode job_status_id and to pick status_ids for list_jobs. The response format is not documented, so it is returned as WorkMobile sends it. |
| list_job_typesB | Job types available to the API user (GET /api/jobtypes): ID, name, description, whether live, the form each uses, default duration and location settings. |
| get_job_typeA | One job type (GET /api/jobtypes/{id}) and the fields a job of this type takes, read from its JSON Schema document (GET /api/jobtypes/{id}/schema): name, type, whether required, allowed values and limits. Call this before create_job. |
| list_formsA | Forms visible to the API user (GET /api/forms): ID, name, description, whether live and visible on mobile, whether it is a sub-form, and when data was last uploaded. The API returns the whole list without paging. |
| list_form_submissionsA | Search the records submitted on one form (POST /api/forms/{FormId}/completedrecords/search): by created or uploaded date, job, mobile user, user group, or searchable field values. Each record comes back with its Id, OriginalId and JobId, the system columns, and the answers. Unless include_contact_details is set, answers in fields whose names mark them as personal (names, contact details, addresses, postcodes, signatures, photos, locations, dates of birth, health, pay) and links to media are withheld; in other answers, emails, phone numbers, postcodes and coordinates are redacted, but names and street addresses typed into free text are not. This search is a POST request that only reads. Pages hold 500 records. |
| get_form_submissionA | One record submitted on a form, found by its record Id (the search criterion |
| list_approvalsA | Without form_id: the API user's approval inbox totals (badge counts) from GET /api/approvals/getinboxtotals, returned as WorkMobile sends them with text redacted (the format is not documented). With form_id: the records on that form waiting for the API user's approval (records search with onlyMyPendingApprovals), with personal answers withheld unless include_contact_details is set. |
| list_mobile_usersA | Mobile (field) users visible to the API user (GET /api/mobileusers) with their names, job titles, user group (named from GET /api/usergroups) and whether active. Usernames only with include_contact_details. The API returns the whole list without paging. |
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 10 tools
Most tools target a distinct resource+action (statuses, types, forms, submissions, jobs, users), and search vs. single-get pairs are clearly separated. Minor overlap comes from list_approvals behaving differently depending on whether form_id is passed, which adds a bit of cognitive load.
Names follow a strict and predictable verb_noun pattern: list_* for collections (list_jobs, list_forms, list_mobile_users) and get_* for single items (get_job, get_job_type, get_form_submission). The convention is applied uniformly across all ten tools.
Ten tools is well within the ideal range and each one maps to a meaningful read operation over the WorkMobile domain. Nothing appears redundant or padded.
The read surface is reasonably broad (lookups, searches, single-item gets for jobs, forms, submissions, users, approvals), but it is entirely read-only with no create/update operations. get_job_type explicitly says 'Call this before create_job,' yet no create_job tool exists, indicating a notable gap.