Skip to main content
Glama
andrew-price-huron

workday-studio-mcp

README.md
# Workday Studio MCP

A local MCP (Model Context Protocol) server that gives Claude direct access to your Workday Studio workspace. Read, write, plan, and validate integration assemblies without copy-pasting XML back and forth.

Everything runs **locally** on your machine — no network calls, no tenant credentials, no shared state. The server only sees the Studio Workspace folder you point it at.

---

## What you get

20 tools across these categories:

| Category | What it does |
|---|---|
| **Navigation** | `list_studio_projects`, `list_project_files`, `read_integration_file`, `search_studio_files`, `get_workspace_structure` |
| **File management** | `write_integration_file`, `copy_file_from_project`, `rename_file`, `delete_file`, `validate_xml_file` |
| **Project setup** | `create_studio_project`, `create_xsl_transform` |
| **Assembly editing** | `list_assembly_steps`, `list_integration_params`, `add_assembly_step`, `update_sub_flow`, `validate_assembly` |
| **Planning** | `plan_integration` — design elicitation + skeleton generator |
| **Reference** | `get_step_type_reference` — confirmed step type docs with production XML examples |
| **Diagnostics** | `parse_server_log` — parse a Workday integration server log from `~/Downloads` |

A growing knowledge base lives at [`docs/studio-integration-patterns.md`](docs/studio-integration-patterns.md) — hard-won lessons captured from real Studio debugging sessions.

---

## Quick install

One line:

```bash
curl -fsSL https://raw.githubusercontent.com/andrew-price-huron/workday-studio-mcp/main/bin/quickstart.sh | bash
```

This clones the repo to `~/workday-studio-mcp`, installs dependencies, and prints the exact `claude mcp add` command for your machine.

Or do it manually — see **Manual setup** below.

---

## Prerequisites

- **Node.js 18+** — check with `node --version`
- **Workday Studio** installed with at least one project in your workspace
- **Claude Desktop** or **Claude Code (CLI)** — both work

---

## Manual setup

**1. Clone and install**

```bash
git clone https://github.com/andrew-price-huron/workday-studio-mcp.git
cd workday-studio-mcp
npm install
```

**2. Configure your workspace path**

```bash
copy config.json.example config.json
```

Open `config.json` and set `workspace_path` to the folder containing your Studio projects (the same one Eclipse opens). On a typical Huron Windows machine this looks like:

```json
{
  "workspace_path": "C:\\Users\\yourname\\studio-workspace",
  "max_file_size_kb": 500,
  "backup_on_write": true,
  "excluded_dirs": [".git", ".settings", "bin", "build", "node_modules", ".metadata", ".plugins"],
  "excluded_extensions": [".class", ".jar", ".zip", ".bak"]
}
```

Or skip `config.json` entirely and set an environment variable in PowerShell:

```powershell
$env:STUDIO_WORKSPACE_PATH = "C:\Users\yourname\studio-workspace"
```

**3. Verify it starts**

```powershell
node src/index.mjs
```

You should see:
```
[studio-mcp] Server started. Workspace: C:\Users\yourname\studio-workspace
```

Press `Ctrl+C` to stop — Claude will spawn it on demand.

---

## Connect to Claude

### Option A — Claude Code (CLI)

```powershell
claude mcp add studio-mcp node C:\Users\yourname\workday-studio-mcp\src\index.mjs
```

Confirm:
```powershell
claude mcp list
```

### Option B — Claude Desktop

Edit `%APPDATA%\Claude\claude_desktop_config.json` and add inside `mcpServers`:

```json
{
  "mcpServers": {
    "studio-mcp": {
      "command": "node",
      "args": ["C:\\Users\\yourname\\workday-studio-mcp\\src\\index.mjs"]
    }
  }
}
```

Save and **restart Claude Desktop**.

> **Tip:** Run `where.exe node` in PowerShell to get your full node path if Claude can't find it.

---

## Use it

### List projects
> "List my Studio projects"

### Read a file
> "Read the assembly.xml from INT145"

### Plan a new integration
> "I need to build a new integration"

Claude asks design questions (data source, destination, trigger, record volume, auth, error handling) before generating anything. Then it writes a skeleton `assembly.xml` + `assembly-diagram.xml` you can open in Studio immediately.

### Fill in a sub-flow
> "Fill in the GetWorkers sub-flow — here's the RAAS sample: [paste XML]"

`update_sub_flow` surgically replaces the TODO stub with real steps and validates the result.

### Search across integrations
> "Find all uses of integrationMapLookup"

### Validate
> "Validate the assembly for INT145"

Returns errors (broken routes, illegal comments, missing attributes) and warnings (missing XSL files, unresolved sub-flow endpoints).

### Look up a step type
> "Show me the cc:http-out reference"

Returns confirmed XML examples, schema rules, and gotchas.

### Parse a server log
After downloading a `server-{wid}.log` from Workday (View Integration Events → expand documents → click the `server-*.log`):

> "Parse my latest server log"

Returns structured timeline, unique errors, and XSLT messages. The parser auto-finds the most recent `server-*.log` in `~/Downloads`.

---

## Project structure

```
Workday-studio-mcp/
├── src/
│   ├── index.mjs               # Entry — registers tools, starts server
│   ├── config.mjs              # Loads workspace path
│   ├── fs.mjs                  # FS helpers + path traversal protection
│   ├── xml.mjs                 # XML validation wrapper
│   ├── assembly-validator.mjs  # Studio-specific assembly rules
│   └── tools/
│       ├── list-projects.mjs
│       ├── list-files.mjs
│       ├── read-file.mjs
│       ├── write-file.mjs
│       ├── search-files.mjs
│       ├── workspace-tree.mjs
│       ├── validate-xml.mjs
│       ├── create-project.mjs
│       ├── list-assembly-steps.mjs
│       ├── list-integration-params.mjs
│       ├── add-assembly-step.mjs
│       ├── create-xsl-transform.mjs
│       ├── copy-file-from-project.mjs
│       ├── rename-file.mjs
│       ├── delete-file.mjs
│       ├── get-step-type-reference.mjs   # Step type docs
│       ├── plan-integration.mjs          # Design elicitation
│       ├── update-sub-flow.mjs           # Surgical sub-flow replacement
│       ├── validate-assembly.mjs         # Studio rules engine
│       └── parse-server-log.mjs          # Local log parser
├── docs/
│   └── studio-integration-patterns.md    # Shared knowledge base
├── bin/
│   ├── install.sh
│   └── quickstart.sh
├── config.json.example
├── CLAUDE.md                   # Instructions for Claude when working in this repo
├── package.json
└── .gitignore
```

---

## Security

- The server only sees files inside your configured `workspace_path` — path traversal attempts are blocked.
- No credentials, API keys, or Workday tenant details are stored or transmitted.
- `config.json` (which contains your local workspace path) is gitignored.
- The server runs over stdio — no network ports are opened.

---

## Contributing patterns back

When you discover a new Studio quirk, schema rule, or assembly pattern, add it to [`docs/studio-integration-patterns.md`](docs/studio-integration-patterns.md) and open a PR. See [`CLAUDE.md`](CLAUDE.md) for guidance on what kinds of learnings belong there. The goal is a collective memory across the team — every debugging session that finds a new gotcha makes the next one cheaper.

---

## Troubleshooting

**`workspace_path not configured`**
Run `cp config.json.example config.json` and set the path.

**`Workspace path does not exist`**
Check the path in `config.json` matches your Studio workspace folder.

**Tools don't appear in Claude**
Ensure the path in your Claude config is absolute, not relative. Restart Claude Desktop after editing.

**`node: command not found` in Claude**
Use the full node path:
```powershell
where.exe node
```
Then use that full path (e.g. `C:\Program Files\nodejs\node.exe`) in your Claude config.

---

## License

MIT