workday-docs-mcp
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-docs-mcp How do I create a sortable grid for expense reports?"
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-docs-mcp
An MCP server that grounds an AI coding agent in the Workday developer documentation — so it answers from the real docs and helps build Workday Extend apps correctly, instead of guessing.
Point your IDE agent (Claude Code, Cursor, etc.) at this server and it can search, read, and cite the official Workday docs on demand. With the included Extend builder skill, a developer with no Workday Extend experience can build apps that are grounded in the actual PMD components, functions, and APIs — not plausible-looking hallucinations.
It's a thin, cached layer over the documentation behind developer.workday.com. No login, no API keys, no Workday account required — it reads the public docs.
Why it exists
A general-purpose LLM has almost no Workday Extend in its training data, so it confidently writes invalid PMD (Workday's declarative page metadata) and invents endpoints that don't exist. This server replaces those guesses with retrieved, authoritative reference — and gives the agent the canonical doc link so a human can verify.
Related MCP server: LangChain & LlamaIndex Coding Assistant
What it looks like in use
You: "I'm building a Workday Extend app and want a page that shows a list of expense reports in a table. How do I do that?"
Agent: (calls
lookup_extend_reference→ grounds on the realgridwidget docs) "You'll use thegridwidget bound to an inbound endpoint. Here's the PMD, with the real attributes (rows,columns,cellTemplate)… [cites developer.workday.com/wcp_docs/…]"
The agent reaches for the tools on its own (especially with the skill installed), grounds the answer, and links the source.
Tools
Tool | Purpose |
| Find docs by concept / widget / API / task → lightweight pointers (title, breadcrumb, |
| Fetch a full page as markdown by |
| Walk the documentation hierarchy when keyword search misses. |
| Build-focused. Given an intent ("sortable grid", "format a date"), returns the best Extend component / PMD-function / scripting reference page with its content inline + alternatives. Scope with |
All four tools declare an outputSchema (clients receive validated structuredContent, not just text) and annotations (readOnlyHint, idempotentHint, openWorldHint — none are destructive).
Typical flow: search → pick a doc_id → get → answer & cite the html_url. When building an Extend app, reach for lookup_extend_reference first.
Requirements
Node 22+ — runs the TypeScript sources directly, no build step (verified on Node 25).
An MCP-capable client (Claude Code, Cursor, Claude Desktop, …).
Quick start
git clone https://github.com/philippesimard00/workday-docs-mcp.git
cd workday-docs-mcp
npm install
npm run build-index # one-time, ~1 min: builds the Tier-2 full-text index (recommended)Connect it to Claude Code (user scope = available in every project):
claude mcp add workday-docs --scope user -- node "$(pwd)/src/server.ts"
claude mcp list # expect: workday-docs ✓ ConnectedOr add it to any MCP client's config manually (use the absolute path to src/server.ts on your machine):
{
"mcpServers": {
"workday-docs": {
"command": "node",
"args": ["/absolute/path/to/workday-docs-mcp/src/server.ts"]
}
}
}Skipping
build-indexstill works — search just falls back to title-only matching. See Search modes.
The Extend builder skill
skills/workday-extend-builder/ is a Claude Code Skill that teaches the agent Workday Extend's mental model (declarative metadata + scripting, the real file types) and directs it to these tools — especially lookup_extend_reference — before it writes any code. This is what makes the "no prior experience" case work. Install it (per developer):
ln -s "$(pwd)/skills/workday-extend-builder" ~/.claude/skills/workday-extend-builderSee skills/README.md for details and the per-team customization section.
Search modes
search_workday_docs and lookup_extend_reference run in one of two modes; the response's engine field tells you which:
title(zero setup): matches page titles + breadcrumbs only. Fine for "find the page about X"; weak on how-to phrasing.fulltext(afternpm run build-index): BM25 over page bodies. Built for app-building — intent queries like "sortable grid with pagination" land on the right component. The index (~1,250 docs) is fetched once and cached at~/.cache/workday-docs-mcp/; the server uses it automatically on next start. Re-runbuild-indexto refresh.
How it works
The Workday developer site is a JavaScript single-page app, so the docs aren't readable by a normal fetch of a page URL. The content is served as markdown behind it, via two endpoints:
What | URL |
Master table of contents |
|
Page markdown |
|
Canonical human link |
|
The server loads the TOC (cached 6h), serves page markdown (cached on disk), and — for full-text mode — builds a local BM25 index over every page body. All knowledge of these URLs is isolated in one file (src/workday-docs-adapter.ts), and a startup health check fails loudly if Workday changes the doc structure.
Project layout
src/
types.ts Shared types (TocNode, IndexEntry, SearchHit)
workday-docs-adapter.ts The seam — the only file that knows Workday's URLs (TOC, page fetch, caching, health check)
search.ts Tier-1 ranking (title/breadcrumb) — fallback
fulltext.ts Tier-2 BM25 inverted index over page bodies (pure JS, no native deps)
build-index.ts One-time builder for the Tier-2 index
server.ts MCP wiring: 4 tools + stdio transport + boot health check
smoke.ts Live end-to-end check, no MCP transport
test-client.ts Drives the tools over the real MCP protocol (stdio)
evals/ 12-question evaluation suite (verified) + how to run it
skills/ workday-extend-builder Claude Code skill + install guideDevelopment
npm run typecheck # tsc, no emit
npm run smoke # hits the live endpoints: loads TOC, searches, fetches a page
npm run test-client # drives all tools over the real MCP protocol (stdio)evals/workday_docs_eval.xml is a 12-question suite (answers verified against live data) for measuring how well an LLM can answer real Workday questions with only these tools — useful as a regression/quality benchmark. See evals/README.md.
Notes & limitations
Unofficial. This project is not affiliated with or endorsed by Workday. It reads publicly available documentation pages.
Undocumented endpoints.
wcp_docs.ymland/doc/*.mdaren't a published API — Workday could change them. They're isolated insrc/workday-docs-adapter.ts, andassertSchemaIntact()fails loudly at startup if the structure changes. Great for a dev-productivity tool; treat as a maintenance liability for anything critical.Docs, not data. The server reads the documentation. It does not access any Workday tenant, customer data, or authenticated API.
Search quality depends on the index — build it (
npm run build-index) for app-building. A future semantic (embeddings) tier would slot into the same search layer without changing the tools.
Available Tools
4 toolsbrowse_workday_tocBrowse the Workday docs table of contentsARead-onlyIdempotent
Explore the documentation hierarchy when keyword search misses.
Pass a breadcrumb path to expand a node; an empty path lists the top-level sections (Extend Apps, Integration Apps, Workday APIs, Workday Developer Copilot, ...). Use the returned doc_id values (non-null nodes are real pages) with get_workday_doc.
Args:
path (string[]): breadcrumb to expand, e.g. ['Extend Apps','Extend App Components Reference'] (default [])
depth (number): how many levels deep to expand, 1-3 (default 1)
Returns: { path, nodes: [{ title, doc_id, child_count, children? }] }
Inputs: path, depth. Returns: path, nodes
get_workday_docGet a Workday doc pageARead-onlyIdempotent
Fetch the full markdown for one Workday documentation page.
Accepts EITHER a doc_id (from search_workday_docs) OR a developer.workday.com "/wcp_docs/.html" link. Always returns the canonical html_url so you can cite/link the page even if the body can't be fetched.
Args:
doc_id (string): a doc ID from search_workday_docs
html_url (string): alternatively, a developer.workday.com/wcp_docs/.html link
Returns: { doc_id, html_url, truncated, markdown, error? }
markdown: the page body (string), or null if the body fetch failed (see error)
truncated: true if the body exceeded 60000 chars and was cut
error: present only when the body could not be fetched (html_url is still valid to link)
Inputs: doc_id, html_url. Returns: doc_id, html_url, truncated, markdown, +1 more
lookup_extend_referenceLook up an Extend component / function referenceARead-onlyIdempotent
Ground Extend app-building in the authoritative reference. Given what you're trying to build or use, this returns the BEST-matching reference page WITH its content inline (excerpt) — not just a pointer — plus alternative pointers. Use this before writing PMD/widget/scripting code so you ground on the real schema/signature instead of guessing.
Scoped to the "Extend App Components Reference" (PMD tags/widgets, model components, PMD functions, PMD scripting). For broader/conceptual docs use search_workday_docs. Best results require the full-text index (npm run build-index).
Args:
intent (string): what you want to build/use, e.g. "sortable grid with row actions", "function to format a date", "validate a field before submit"
kind ('any' | 'component' | 'function' | 'scripting'): narrow the scope (default 'any') component = PMD tags/widgets + model components; function = PMD functions; scripting = PMD scripting tags
alternatives (number): how many additional pointers to return, 0-10 (default 4)
Returns: { intent, kind, engine, best: { doc_id, title, breadcrumb, html_url, excerpt, truncated } | null, alternatives: [{ doc_id, title, breadcrumb, html_url, score }] } If best is null, nothing matched the scope — widen kind, rephrase, or use search_workday_docs.
Inputs: intent (required), kind, alternatives. Returns: intent, kind, engine, best, +1 more
search_workday_docsSearch Workday documentationARead-onlyIdempotent
Search the Workday developer documentation by concept, widget, API, or task.
Returns lightweight pointers (title, breadcrumb, doc_id, link) — NOT full page text. Call get_workday_doc with a returned doc_id to read a page.
When the full-text index is built (npm run build-index), this searches page BODIES (BM25), so intent/how-to phrasing works well — e.g. "sortable grid with pagination", "format a date in a PMD expression". Without the index it falls back to TITLE-only matching (engine="title"), where specific how-to phrasing may return weak hits — build the index for best results. The response 'engine' field tells you which mode ran.
Args:
query (string): concept/widget/API/task, e.g. "validate a field on submit"
section ('Extend Apps' | 'Integration Apps' | 'Workday APIs' | 'Workday Developer Copilot'): optional filter
limit (number): max results, 1-50 (default 10)
Returns: { query_echo, engine, count, results: [{ doc_id, title, breadcrumb, html_url, score }] } Higher score = stronger match. Empty results means no match — try broader terms or browse_workday_toc.
Inputs: query (required), section, limit. Returns: query_echo, engine, count, results
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 4 tools
Each tool serves a distinct purpose: browsing hierarchy, fetching pages, searching general docs, and specialized reference lookup. No overlap in functionality.
All tools use consistent snake_case with a verb_noun pattern (browse_, get_, lookup_, search_), making them predictable.
Four tools are well-scoped for a documentation MCP: browsing, searching, fetching, and reference lookup. No excess or deficiency.
The set covers core documentation needs: exploration via TOC, full-text search, page retrieval, and targeted reference lookups. No obvious gaps.
Maintenance
Related MCP Connectors
Provide your AI coding tools with token-efficient access to up-to-date technical documentation for…
Access and search Branch's official API documentation directly within any AI agent or client.
Versioned documentation registry and semantic search for AI tools and coding assistants.
Provides tools for searching Google Workspace documentation and much more.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search and query documentation from multiple sources including Voiceflow and Claude Code, with full-text search, code examples retrieval, and step-by-step tutorials access.1MIT
- FlicenseNot gradedqualityDmaintenanceProvides real-time retrieval of official documentation for LangChain, LlamaIndex, and OpenAI. It enables context-aware coding by fetching the latest API references and guides directly into Claude via the Model Context Protocol.-
- FlicenseNot gradedqualityDmaintenanceProvides retrieval of WeChat Work and Feishu developer documentation, enabling AI assistants to query API references without switching browsers.22 npm19-
- FlicenseAqualityCmaintenanceEnables AI clients to search live documentation for popular developer libraries and return clean, source-cited summaries via a RAG pipeline.1-