workday-mcp
This server provides read-only access to your personal Workday data (pay, benefits, compensation, etc.) through your existing signed-in browser session — no admin-provisioned API credentials needed.
Discover your Workday apps (
workday_get_apps): List all apps on your Workday home screen, each with a launchable task ID — the starting point for exploring available data.Read any Workday task or data card (
workday_get_task): Fetch structured data from any Workday page by its path or URL, returning the page title, label/value fields, navigable references (instance IDs + drill-in URIs), related tasks, and export links. Supports SPA/d/...URLs and bare endpoint suffixes.Check connection health (
workday_healthcheck): Verify the end-to-end bridge between the MCP server and your signed-in Workday browser tab, with diagnostics distinguishing bridge, extension, or Workday-side failures.
Key constraints: All operations are read-only (no data is created, modified, or deleted), and everything routes through your own browser session via the fetchproxy extension.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@workday-mcpwhat are my current tasks?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
workday-mcp
Read-only MCP server for Workday. Reads your
Workday org chart, worker profiles, pay, benefits, performance, and any task or
data card, and returns them as structured JSON. Every request routes through your own signed-in
*.myworkday.com tab via the fetchproxy
browser extension, reusing your existing SSO-authenticated session.
⚠️ Workday gives employees no personal API. This server reads the same internal
*.htmldendpoints the Workday web app calls, dispatched through your own signed-in browser tab. It is read-only and touches only your own data. Check your employer's acceptable-use policy. Use at your own discretion.🤖 This project was developed and is maintained by AI (Claude Code).
Why a bridge instead of the official API?
The official Workday REST/SOAP API requires a tenant administrator to register an OAuth API client + Integration System User — an employee can't self-provision it. Tenants also sit behind corporate SSO (Ping/Okta/Entra) with MFA, so there's no server-side login. The only surface an employee can reach for their own data is their live browser session, which is what this server relays.
Related MCP server: Edenred Plus MCP
Install
See SKILL.md for full setup. In brief:
{
"mcpServers": {
"workday": {
"command": "npx",
"args": ["-y", "workday-mcp"],
"env": { "WORKDAY_TENANT": "your-tenant-slug" }
}
}
}Then install the fetchproxy extension and sign into Workday in your browser.
Tools
Tool | What it does |
| List your Workday apps with launchable task ids — the discovery entry point |
| Open an app by name ("Talent and Performance", "Absence") and follow it down to the child cards holding its real content |
| Read any task/data card by id or path → fields, full table rows, references, related tasks, export links. |
| Your reporting chain — each person with title, location, report count, and a |
| A worker's profile: the catalog of everything readable about them (9 sections, ~40 named tasks) |
| Open one named item from that catalog — "Compensation", "Performance Reviews", "Management Chain" |
| The same catalog, for yourself |
| Raw |
| Read-only GraphQL against Workday's PEX surface (mutations refused). The only route to Inbox / search |
| Verify the bridge + session end-to-end with an actionable hint |
The parser understands seven Workday page families — data cards, grids
(real tables, with chunking and export links), form-style detail pages, worker
profiles, org charts, app hubs, and report prompt forms — and labels each page
with its kind. See docs/WORKDAY-API.md.
Manager quick start
workday_get_org_chart → who reports where, with profileUris
workday_get_worker { worker: "<profileUri>" } → that person's full catalog
workday_get_worker_task { worker: "…", task: "Compensation" }
workday_open_app { app: "talent" } → a whole app hub, crawledAll ids are discovered at runtime from your own app menu and org chart — nothing tenant-specific is hardcoded, so this works on any Workday tenant.
Development
npm install
npm test # vitest
npm run build # tsc --noEmit + esbuild bundle → dist/bundle.jsThe widget-tree parser (src/parse.ts) is the durable core; see
docs/WORKDAY-API.md for the captured endpoint shapes and
schema. License: MIT.
Available Tools
10 toolsworkday_fetchFetch a raw Workday endpointARead-onlyIdempotent
GET any Workday data endpoint and return the RAW JSON with secrets redacted — the escape hatch for pages the typed tools do not model yet. Prefer workday_get_task (structured) when it works; reach for this to explore an unfamiliar page or to see fields the parser drops. Bare uris get .htmld appended and /d/ SPA paths are normalized. Read-only (GET only).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Workday path, e.g. `/acme/inst/1$715/247$42.htmld` or `2998$43525`. | |
| maxBytes | No | Payload cap before truncation (default 60000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, and the description reinforces read-only. It adds valuable behavioral details beyond annotations: secrets redaction, raw JSON output, `.htmld` appending, and `/d/` SPA path normalization. This is substantive context, though not exhaustive about truncation or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and every sentence earns its place: purpose and output type, usage guidance versus an alternative, path normalization behavior, and read-only confirmation. It is front-loaded with the main purpose and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema, the description adequately explains what the tool returns (RAW JSON with secrets redacted) and how path normalization works. The schema covers `maxBytes` and examples, and sibling guidance is explicit. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful path semantics beyond the schema by explaining bare URIs get `.htmld` appended and `/d/` SPA paths are normalized, which helps the agent construct valid `path` values. It does not add detail about `maxBytes`, but the schema already covers that fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb+resource ('GET any Workday data endpoint') and names its core value: returning RAW JSON with secrets redacted as an escape hatch for unmodeled pages. It also distinguishes itself from the typed sibling tools by framing itself as the fallback for exploring unfamiliar pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to prefer `workday_get_task` (structured) when it works, and to use this tool for exploring unfamiliar pages or seeing fields the parser drops. This directly tells the agent when to choose this tool versus the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workday_get_appsList your Workday appsARead-onlyIdempotent
List the Workday apps available on your home screen, each with a launchable task id. Use this to discover what you can read, then pass an app's taskId to workday_get_task to open it. Some apps share a generic launcher id; if one returns a near-empty page, open the app in your browser and pass that URL to workday_get_task instead. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, and the description echoes 'Read-only.' It adds meaningful behavioral context beyond those annotations by disclosing that some apps share a generic launcher id and may return a near-empty page, plus the recommended workaround. This helps the agent anticipate an edge case and recover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, and every sentence earns its place: first states what is listed, second explains why and how to use the output, third handles a known edge case. There is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless discovery tool with no output schema, the description is sufficient: it specifies what is returned (apps each with a launchable task id), the intended flow into workday_get_task, and the fallback behavior for problematic launchers. The annotations cover safety and idempotency, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no input schema burden to compensate for; the baseline is 4. The description still usefully clarifies that the launchable taskId appears in the output and is the value that connects to workday_get_task, giving the schema-less return value practical semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'List the Workday apps available on your home screen.' It also distinguishes itself from the sibling workday_get_task by noting that the returned taskId should be passed there, so an agent can tell this discovery tool apart from the actions that consume its output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly frames when to use this tool ('Use this to discover what you can read') and then routes the agent to workday_get_task with the taskId. It also provides a conditional fallback for generic launcher ids, telling the agent to open the app in a browser and pass the URL to workday_get_task instead, which is clear, specific guidance beyond a bare list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workday_get_my_profileRead your own Workday profileARead-onlyIdempotent
Read your own worker profile — the same catalog workday_get_worker returns, for yourself. Use it to find your pay, benefits, time off, goals, and feedback. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint and idempotentHint, and the description reinforces the read-only nature. It adds value by listing the types of data available and equating the response with `workday_get_worker`'s catalog, giving the agent behavioral expectations beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences front-load the action and scope, then add the concrete use cases. The only minor redundancy is restating 'Read-only' when the annotation already says it, but this is a low-cost safety signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, self-scoped read tool with strong readOnly/idempotent annotations, the description fully explains what the tool does and why an agent would call it. Pointing to `workday_get_worker`'s catalog also gives the agent a reference for expected return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description has no parameter burden to carry. The description still helps by indicating the content of the returned profile, which is useful given there is no output schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Read your own worker profile.' It immediately distinguishes itself from the sibling `workday_get_worker` by noting it returns the same catalog for yourself. There is no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context: use this tool to read your own profile and find pay, benefits, time off, goals, and feedback. It references `workday_get_worker` as returning the same catalog, implicitly signaling the difference, but it never explicitly states when to prefer one over the other.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workday_get_org_chartRead your org chartARead-onlyIdempotent
Read the reporting chain around you: each person with their business title, location, report count, and a profileUri you can pass straight to workday_get_worker. Resolves the Org Chart app from your own app menu. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds useful behavioral context beyond annotations: it resolves the Org Chart app from the user's app menu and describes how the profileUri can be consumed by workday_get_worker. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and output details. Every sentence contributes: what it reads, what fields are returned, how the output connects to another tool, and that it is read-only. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with no output schema, the description compensates well by enumerating the returned fields and linking to workday_get_worker. Minor ambiguity remains about the exact scope of the 'reporting chain' (direct reports vs. full hierarchy), but it is sufficient for selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline is 4. The description clarifies the implicit subject of the operation by saying 'around you', which makes it clear the tool operates relative to the authenticated user without needing any explicit input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Read the reporting chain around you' and enumerates the output fields (business title, location, report count, profileUri). It also differentiates from the sibling workday_get_worker by explaining that the returned profileUri is meant to be passed directly to that tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied clearly: use this when you need the reporting chain around the current user, and 'Resolves the Org Chart app from your own app menu' adds context. However, it never names alternatives or says when not to use this tool versus siblings like workday_get_my_profile or workday_get_worker.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workday_get_taskRead a Workday task / data cardARead-onlyIdempotent
Fetch a Workday page (task or data card) by its path and return a structured, read-only view: title, current user, each section as label/value fields, navigable references (instance id + drill-in uri), and the page's related tasks + export links. The path is a Workday *.htmld endpoint — take it from a prior result's references[].uri or relatedTasks[].uri, or paste the URL of a Workday page you have open (SPA /d/... URLs are normalized automatically). Every request rides your signed-in Workday tab. Read-only; no data is mutated.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Workday data endpoint path, e.g. `/acme/inst/13102!ABC/cacheable-task/2998$43525.htmld`, or a copied `/acme/d/...` SPA URL, or a bare suffix like `quickaccess/fetch.htmld`. | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Workday's payload untouched. No field projection: this server has no verified record of which Workday fields matter, and inventing one would risk dropping a field a caller needs. | |
| depth | No | Levels to follow (default 1). Supplying this implies `expand` unless `expand: false` is passed explicitly. | |
| expand | No | Follow the page down to the child cards holding its real content. Turn this on when a page comes back with no sections — container/hub pages delegate everything to children whose uris exist only inside the parent response. | |
| maxCards | No | Cap on child cards fetched (default 12). Supplying this implies `expand` unless `expand: false` is passed explicitly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description reinforces this with 'Read-only; no data is mutated.' It adds operational context beyond annotations: requests ride the signed-in Workday tab, SPA URLs are normalized automatically, and the result is a structured projection rather than a raw payload. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three compact sentences with the action and output contract front-loaded. It provides path sourcing, URL normalization, auth context, and a read-only guarantee without repeating schema content or adding filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the needed return contract: title, current user, sections as label/value fields, navigable references, related tasks, and export links. It also states the auth prerequisite and mutation guarantee, while the schema covers expand/depth/maxCards behavior, making the definition complete enough for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already explains path, view, depth, expand, and maxCards. The description adds genuinely useful meaning for the path parameter by specifying where to source it (prior references[].uri or relatedTasks[].uri) and that /d/... URLs normalize automatically, which an agent would otherwise have to infer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch a Workday page (task or data card) by its path' and enumerates the structured return contents. It distinguishes itself from raw fetching siblings like workday_fetch by emphasizing a structured, read-only view, and from worker-scoped tools by being path-driven.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when to use the tool: when you have a Workday path from a prior result's references[].uri or relatedTasks[].uri, or an open page URL, and it explains SPA URL normalization. It does not explicitly name excluded alternatives or say 'use workday_get_worker_task instead for worker-specific lookups', so it falls just short of full alternative routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workday_get_workerRead a worker profileARead-onlyIdempotent
Read a worker's Workday profile and return the CATALOG of everything readable about them: sections (Job, Compensation, Benefits, Contact, Personal, Performance, Career, Feedback) each listing named, fetchable tasks. Pass a profileUri from workday_get_org_chart or any reference, or a bare worker id like 247$42. Then use workday_get_worker_task to open one by name. Shows only what your own Workday permissions already allow. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| worker | Yes | A full profile uri (e.g. `/acme/inst/1$715/247$42.htmld`) or a bare worker instance id (e.g. `247$42`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds meaningful behavioral context beyond those: the tool returns a catalog of fetchable tasks rather than the raw profile data itself, organizes results by section, and reflects only the caller's own existing Workday permissions. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler, front-loaded with what the tool does, then input guidance, then downstream routing, then a safety note. Every sentence earns its place and the structure leads with the most important information for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter, no output schema, and strong annotations, the description covers all an agent needs: input provenance, accepted formats, output shape at a high level, downstream tool to invoke, and permission constraints. Nothing required to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by specifying acceptable input forms (`profileUri` from `workday_get_org_chart`, any reference, or bare id like `247$42`) and naming a concrete source of the URI, which supplements the schema's generic examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description names the specific action (Read a worker's Workday profile) and the exact deliverable (a CATALOG of everything readable, organized by sections). It distinguishes itself from the sibling workday_get_worker_task by explicitly directing the agent to that tool for opening individual tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states where to get input (`profileUri` from `workday_get_org_chart` or any reference) and how to proceed after the call (`use workday_get_worker_task`). It also notes permission limitations. It does not explicitly enumerate when to prefer siblings like workday_get_my_profile, but the flow guidance is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workday_get_worker_taskOpen one task on a worker profileARead-onlyIdempotent
Open a single named item from a worker's profile — "Compensation", "Job Details", "Performance Reviews", "Management Chain", "Benefits", "Goals", "Pay Change History", and so on. Matched case-insensitively against that worker's own task catalog; if it does not match, the error lists exactly what is available. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | Task name as it appears on the profile, e.g. `Compensation`. | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Workday's payload untouched. No field projection: this server has no verified record of which Workday fields matter, and inventing one would risk dropping a field a caller needs. | |
| worker | Yes | Profile uri or bare worker instance id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses case-insensitive matching against the worker's own task catalog, and that a mismatch returns an error listing exactly what is available. These are useful behavioral details not present in structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences front-load the action and examples, then add matching and error behavior. There is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given full schema coverage and readOnly/idempotent/openWorld annotations, the description covers action, scope, matching behavior, error behavior, and read-only semantics. It does not describe the return payload shape, but no output schema exists and the 'view' parameter already documents response shaping.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by giving concrete task examples and clarifying that matching is case-insensitive against that worker's task catalog, which enriches the meaning of the 'task' and 'worker' parameters beyond their schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Open') and an exact resource ('single named item from a worker's profile'), with concrete examples like 'Compensation' and 'Job Details'. The worker-profile anchoring clearly distinguishes it from generic siblings such as workday_get_task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context: this tool opens a named item from a specific worker's profile, and it describes matching and error behavior. It does not explicitly state when not to use it or name alternatives, but the scope is unambiguous enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workday_graphqlRun a Workday GraphQL queryARead-only
Run a read-only GraphQL query against Workday's PEX surface (/wday/pex/graphql). This is the only route to surfaces that have no GET-able .htmld endpoint — notably the Inbox / "My Tasks" and global search. Workday does not publish these operations, so you supply the document; expect to iterate. mutation and subscription documents are REFUSED — this server is read-only — as are type-system (SDL) documents, whose definition boundaries cannot be tracked reliably.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | A GraphQL `query` document. Mutations are rejected. | |
| maxBytes | No | Payload cap before truncation (default 60000). | |
| variables | No | Variables for the query. | |
| operationName | No | Operation name; also sent as the `?operation=` query parameter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and openWorldHint, and the description reinforces and expands on them by specifying that mutation/subscription documents are refused, SDL documents cannot be tracked reliably, and users should expect to iterate because Workday does not publish these operations. This adds meaningful behavioral detail beyond the annotations rather than contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, information-dense, and front-loaded with the core purpose before moving into alternatives and constraints. Each sentence earns its place: endpoint and read-only nature, use-case uniqueness, publisher constraints, and explicit refusal rules. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex GraphQL tool with four parameters and no output schema, the description covers the essential operational context: endpoint, supported operations, unsupported operations, why iteration should be expected, and the specific surfaces it serves. Combined with a fully documented input schema and meaningful annotations, nothing critical is missing for an agent to select and call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the schema already documents all four parameters. The description adds slight context around the query document ('you supply the document; expect to iterate') and reiterates that mutations are rejected, but it does not meaningfully elaborate on maxBytes, variables, or operationName beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('run a read-only GraphQL query'), a specific resource ('Workday's PEX surface /wday/pex/graphql'), and distinguishes the tool from siblings by noting it is the only route for surfaces without GET-able .htmld endpoints, such as Inbox and global search. This is far beyond a tautology and makes the tool's unique role clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use context: it is the only route for surfaces lacking GET-able .htmld endpoints, notably Inbox/My Tasks and global search. It also states what is refused (mutations, subscriptions, SDL documents), but does not explicitly name sibling tools to use for the other cases, so it falls just short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workday_healthcheckVerify the fetchproxy bridge end-to-endARead-onlyIdempotent
Round-trips a small public wd5.myworkday.com URL (/acme-corp/get-global-prefs.htmld?feature=doNotShowMobileAd) through the fetchproxy bridge and returns diagnostics: the bridge's role (host/peer/null), port, version, the extension link (linked / pair pending / not attached / never answered), the elapsed round-trip time, and a plain-English hint distinguishing 'bridge never came up' from 'extension not connected' from 'real wd5.myworkday.com-side problem'. Read-only, no auth required. Call this when a real tool fails and you want to know which hop broke.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds meaningful context: it clarifies no auth is required, explains the round-trip nature, and details the diagnostic output including failure-mode distinctions. This goes beyond the annotations by describing what the tool actually does and what the results mean.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that front-loads the purpose and then enumerates the diagnostic outputs. Every clause adds value—the URL example, the list of fields, and the usage guidance. While it's longer than typical descriptions, the complexity of the tool warrants it, and it's structured logically from action to output to use case.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description fully compensates. It details every diagnostic field returned (role, port, version, extension link, latency, hint) and explains the failure-mode classification. It also gives the trigger condition. There is nothing an agent needs to know to invoke or interpret the result that is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description doesn't need to explain parameters, and the empty schema is fully covered. It mentions the URL used internally, but that's not a user-provided parameter. No further semantic guidance is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool round-trips a specific URL through the fetchproxy bridge and returns diagnostics. It names the exact resource (wd5.myworkday.com URL) and output (bridge role, port, version, extension link, latency, hint). It distinguishes itself from sibling get/fetch tools by framing itself as a diagnostic for bridge health, not a data retrieval operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Call this when a real tool fails and you want to know which hop broke.' This gives a clear trigger condition and distinguishes it from normal data-fetching siblings. It doesn't list exclusions (e.g., when not to use), but the context is strong enough to infer it's for troubleshooting, not routine calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workday_open_appOpen a Workday app by nameARead-onlyIdempotent
Open one of your Workday apps by name — "My Team Management", "Talent and Performance", "Time", "Absence", "Benefits and Pay", "Org Chart", "Total Rewards" — and read it, following the app down to the child cards that hold its real content. Most Workday app hubs return a near-empty shell on their own; this follows the links for you. Matched case-insensitively against your own app menu, so it works without knowing any task ids. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | App name or a distinctive part of it, e.g. `talent` or `my team`. | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Workday's payload untouched. No field projection: this server has no verified record of which Workday fields matter, and inventing one would risk dropping a field a caller needs. | |
| depth | No | Levels of child cards to follow (default 1, 0 = the hub page only). | |
| maxCards | No | Cap on child cards fetched (default 12). Each is a real browser fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description's 'Read-only' restates that, but it adds valuable context: it follows child links because hubs return near-empty shells, and it matches case-insensitively against the menu. This goes beyond the annotations by explaining the tool's behavior in a way that informs the agent about its depth and matching strategy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph that front-loads the purpose and key examples, then explains the child-following behavior. It's efficient but slightly verbose in the 'view' parameter description, which is in the schema anyway. Overall, it's well-structured and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (4 params, 1 required) and rich annotation coverage, the description covers the essential usage (what it does, how it handles app names, the depth behavior). It doesn't mention the output shape, but there's no output schema, and returning child cards is implied. It also doesn't discuss performance costs, but the schema's maxCards hint covers that. Overall, it's adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 each parameter. However, the description adds meaning by providing concrete examples for the 'app' parameter and explaining the default and trade-offs of 'view' (compact vs full) and 'depth' (child cards). This is more than the schema provides, especially for 'view', which has a detailed explanation of why there's no field projection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Open') and resource ('Workday app by name'), and lists concrete app names, distinguishing it from siblings like workday_get_apps and workday_get_task. It also clarifies that it follows child links, which is unique among the tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use this tool (when you need to open an app and read its child cards) and hints at alternatives (e.g., it works without task ids, implying workday_get_task is for tasks). It doesn't explicitly mention when not to use it, but the examples and contrast with siblings provide adequate guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v1.0.0- Changed
workday_fetch1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
workday_get_apps1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
workday_get_my_profile1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
workday_get_org_chart1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
workday_get_task1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
workday_get_worker1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
workday_get_worker_task1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
workday_graphql1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
workday_healthcheck1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
workday_open_app1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
3 tool updates
v0.6.2- Changed
workday_get_task1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Workday's payload untouched. No field projection: this server has no verified record of which Workday fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
workday_get_worker_task1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Workday's payload untouched. No field projection: this server has no verified record of which Workday fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
workday_open_app1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Workday's payload untouched. No field projection: this server has no verified record of which Workday fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
8 tool updates
v0.4.0- Added
workday_fetch - Added
workday_get_my_profile - Added
workday_get_org_chart - Changed
workday_get_task3 fields changed- added
Input schema / properties / depthAdded value: +{ + "description": "Levels to follow (default 1). Supplying this implies `expand` unless `expand: false` is passed explicitly.", + "maximum": 3, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / expandAdded value: +{ + "description": "Follow the page down to the child cards holding its real content. Turn this on when a page comes back with no sections — container/hub pages delegate everything to children whose uris exist only inside the parent response.", + "type": "boolean" +} - added
Input schema / properties / maxCardsAdded value: +{ + "description": "Cap on child cards fetched (default 12). Supplying this implies `expand` unless `expand: false` is passed explicitly.", + "maximum": 40, + "minimum": 1, + "type": "integer" +}
- Added
workday_get_worker - Added
workday_get_worker_task - Added
workday_graphql - Added
workday_open_app
3 tool updates
v0.1.0- First observed
workday_get_apps - First observed
workday_get_task - First observed
workday_healthcheck
TDQS
Scored across 10 tools
Each tool targets a distinct operation: diagnostics, app discovery, app opening, structured page fetch, org chart, worker profile catalog, profile drill-down, raw JSON fetch, and GraphQL. Even the low-level fetch and GraphQL tools are clearly framed as fallbacks relative to the typed getters.
All tools share the workday_ prefix and most follow a clear verb_noun pattern (get_apps, get_worker_task, open_app). Minor deviations include workday_healthcheck as a noun and workday_fetch/workday_graphql using bare verbs/nouns rather than get_*.
Ten tools is well-scoped for a read-only Workday server: a focused set of typed getters, navigation helpers, and two deliberate escape hatches. No tool feels redundant or unnecessary.
The tool set covers discovery (apps, profile catalogs, org chart), structured page reads, worker and self profile drill-down, plus raw JSON and GraphQL for surfaces without typed coverage. Since the server is explicitly read-only, the absence of mutations is not a gap.
Maintenance
Related MCP Connectors
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
Public MCP server for discovering open jobs. Search, filter, and get application links.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA vendor-neutral reference implementation of a Workday MCP server that enables integration with Workday for employee data, compensation, benefits, time off, org info, inbox tasks, admin operations, and headcount management through natural language.MIT
- AlicenseAqualityBmaintenanceRead-only MCP server for Edenred Plus that enables checking benefit balances, transactions, and deals via local browser authentication.5MIT
- AlicenseAqualityBmaintenanceAn MCP server that lets AI assistants like Claude read LinkedIn data through your own logged-in browser session. Access profiles and companies, search for jobs, or get job details.19Apache 2.0
- AlicenseAqualityCmaintenanceAn MCP server that lets AI assistants like Claude read LinkedIn data through your own logged-in browser session. Access profiles and companies, search for jobs, or get job details.17Apache 2.0