workday-studio-mcp-server 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/.env.example +40 -0
  2. package/LICENSE +21 -0
  3. package/README.md +258 -0
  4. package/dist/config.d.ts +22 -0
  5. package/dist/config.d.ts.map +1 -0
  6. package/dist/config.js +67 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/index.d.ts +8 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +84 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/schemas/index.d.ts +473 -0
  13. package/dist/schemas/index.d.ts.map +1 -0
  14. package/dist/schemas/index.js +172 -0
  15. package/dist/schemas/index.js.map +1 -0
  16. package/dist/tools/copy-file.d.ts +7 -0
  17. package/dist/tools/copy-file.d.ts.map +1 -0
  18. package/dist/tools/copy-file.js +82 -0
  19. package/dist/tools/copy-file.js.map +1 -0
  20. package/dist/tools/delete-file.d.ts +7 -0
  21. package/dist/tools/delete-file.d.ts.map +1 -0
  22. package/dist/tools/delete-file.js +85 -0
  23. package/dist/tools/delete-file.js.map +1 -0
  24. package/dist/tools/list-assembly-steps.d.ts +7 -0
  25. package/dist/tools/list-assembly-steps.d.ts.map +1 -0
  26. package/dist/tools/list-assembly-steps.js +107 -0
  27. package/dist/tools/list-assembly-steps.js.map +1 -0
  28. package/dist/tools/list-files.d.ts +7 -0
  29. package/dist/tools/list-files.d.ts.map +1 -0
  30. package/dist/tools/list-files.js +66 -0
  31. package/dist/tools/list-files.js.map +1 -0
  32. package/dist/tools/list-integration-params.d.ts +7 -0
  33. package/dist/tools/list-integration-params.d.ts.map +1 -0
  34. package/dist/tools/list-integration-params.js +95 -0
  35. package/dist/tools/list-integration-params.js.map +1 -0
  36. package/dist/tools/list-projects.d.ts +7 -0
  37. package/dist/tools/list-projects.d.ts.map +1 -0
  38. package/dist/tools/list-projects.js +68 -0
  39. package/dist/tools/list-projects.js.map +1 -0
  40. package/dist/tools/read-file.d.ts +7 -0
  41. package/dist/tools/read-file.d.ts.map +1 -0
  42. package/dist/tools/read-file.js +63 -0
  43. package/dist/tools/read-file.js.map +1 -0
  44. package/dist/tools/rename-file.d.ts +7 -0
  45. package/dist/tools/rename-file.d.ts.map +1 -0
  46. package/dist/tools/rename-file.js +86 -0
  47. package/dist/tools/rename-file.js.map +1 -0
  48. package/dist/tools/search-files.d.ts +7 -0
  49. package/dist/tools/search-files.d.ts.map +1 -0
  50. package/dist/tools/search-files.js +110 -0
  51. package/dist/tools/search-files.js.map +1 -0
  52. package/dist/tools/validate-xml.d.ts +7 -0
  53. package/dist/tools/validate-xml.d.ts.map +1 -0
  54. package/dist/tools/validate-xml.js +69 -0
  55. package/dist/tools/validate-xml.js.map +1 -0
  56. package/dist/tools/workspace-tree.d.ts +7 -0
  57. package/dist/tools/workspace-tree.d.ts.map +1 -0
  58. package/dist/tools/workspace-tree.js +93 -0
  59. package/dist/tools/workspace-tree.js.map +1 -0
  60. package/dist/tools/write-file.d.ts +7 -0
  61. package/dist/tools/write-file.d.ts.map +1 -0
  62. package/dist/tools/write-file.js +87 -0
  63. package/dist/tools/write-file.js.map +1 -0
  64. package/dist/utils/errors.d.ts +42 -0
  65. package/dist/utils/errors.d.ts.map +1 -0
  66. package/dist/utils/errors.js +50 -0
  67. package/dist/utils/errors.js.map +1 -0
  68. package/dist/utils/fs.d.ts +17 -0
  69. package/dist/utils/fs.d.ts.map +1 -0
  70. package/dist/utils/fs.js +35 -0
  71. package/dist/utils/fs.js.map +1 -0
  72. package/dist/utils/logger.d.ts +24 -0
  73. package/dist/utils/logger.d.ts.map +1 -0
  74. package/dist/utils/logger.js +56 -0
  75. package/dist/utils/logger.js.map +1 -0
  76. package/dist/utils/xml.d.ts +14 -0
  77. package/dist/utils/xml.d.ts.map +1 -0
  78. package/dist/utils/xml.js +31 -0
  79. package/dist/utils/xml.js.map +1 -0
  80. package/package.json +66 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-file.d.ts","sourceRoot":"","sources":["../../src/tools/copy-file.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,eAAO,MAAM,SAAS,2BAA2B,CAAC;AAMlD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsFhD"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * copy_file_from_project — copy a file between projects.
3
+ */
4
+ import { copyFileSync, statSync, mkdirSync } from 'fs';
5
+ import { join, dirname } from 'path';
6
+ import { getConfig } from '../config.js';
7
+ import { errorResponse } from '../utils/errors.js';
8
+ import { logger } from '../utils/logger.js';
9
+ import { resolveSafe } from '../utils/fs.js';
10
+ import { CopyFileSchema } from '../schemas/index.js';
11
+ export const TOOL_NAME = 'copy_file_from_project';
12
+ const DESCRIPTION = 'Copy a file from one Workday Studio project to another (or within the same project). ' +
13
+ 'Parent directories are created automatically.';
14
+ export function register(server) {
15
+ server.tool(TOOL_NAME, DESCRIPTION, CopyFileSchema.shape, async ({ source_project, source_path, dest_project, dest_path, overwrite }) => {
16
+ const cfg = getConfig();
17
+ logger.info('Copying project file', {
18
+ context: 'ToolExecution',
19
+ tool: TOOL_NAME,
20
+ sourceProject: source_project,
21
+ sourcePath: source_path,
22
+ destProject: dest_project,
23
+ destPath: dest_path,
24
+ });
25
+ // Validate both project directories exist
26
+ for (const proj of [source_project, dest_project]) {
27
+ try {
28
+ statSync(join(cfg.workspacePath, proj));
29
+ }
30
+ catch {
31
+ return errorResponse('PROJECT_NOT_FOUND', `Project '${proj}' does not exist in the workspace.`);
32
+ }
33
+ }
34
+ let src;
35
+ let dest;
36
+ try {
37
+ src = resolveSafe(source_project, source_path);
38
+ dest = resolveSafe(dest_project, dest_path);
39
+ }
40
+ catch (err) {
41
+ const msg = err instanceof Error ? err.message : String(err);
42
+ return errorResponse('PATH_TRAVERSAL_DETECTED', msg);
43
+ }
44
+ try {
45
+ statSync(src.absolute);
46
+ }
47
+ catch {
48
+ return errorResponse('FILE_NOT_FOUND', `Source file '${source_path}' does not exist in project '${source_project}'.`);
49
+ }
50
+ if (!overwrite) {
51
+ try {
52
+ statSync(dest.absolute);
53
+ return errorResponse('DEST_ALREADY_EXISTS', `Destination '${dest_path}' already exists in project '${dest_project}'. ` +
54
+ 'Pass overwrite=true to replace it.');
55
+ }
56
+ catch {
57
+ // Fine — destination does not exist
58
+ }
59
+ }
60
+ try {
61
+ mkdirSync(dirname(dest.absolute), { recursive: true });
62
+ copyFileSync(src.absolute, dest.absolute);
63
+ }
64
+ catch (err) {
65
+ const msg = err instanceof Error ? err.message : String(err);
66
+ return errorResponse('COPY_FAILED', `Failed to copy file: ${msg}`);
67
+ }
68
+ return {
69
+ content: [
70
+ {
71
+ type: 'text',
72
+ text: JSON.stringify({
73
+ error: false,
74
+ source: `${source_project}/${source_path}`,
75
+ destination: `${dest_project}/${dest_path}`,
76
+ }, null, 2),
77
+ },
78
+ ],
79
+ };
80
+ });
81
+ }
82
+ //# sourceMappingURL=copy-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-file.js","sourceRoot":"","sources":["../../src/tools/copy-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * delete_project_resource — delete a file from a project (with optional backup).
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ export declare const TOOL_NAME = "delete_project_resource";
6
+ export declare function register(server: McpServer): void;
7
+ //# sourceMappingURL=delete-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-file.d.ts","sourceRoot":"","sources":["../../src/tools/delete-file.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,eAAO,MAAM,SAAS,4BAA4B,CAAC;AAMnD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuFhD"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * delete_project_resource — delete a file from a project (with optional backup).
3
+ */
4
+ import { unlinkSync, statSync, copyFileSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { getConfig } from '../config.js';
7
+ import { errorResponse } from '../utils/errors.js';
8
+ import { logger } from '../utils/logger.js';
9
+ import { resolveSafe } from '../utils/fs.js';
10
+ import { DeleteFileSchema } from '../schemas/index.js';
11
+ export const TOOL_NAME = 'delete_project_resource';
12
+ const DESCRIPTION = 'Delete a file from a Workday Studio project. ' +
13
+ 'By default creates a .bak backup before deleting (set create_backup=false to skip).';
14
+ export function register(server) {
15
+ server.tool(TOOL_NAME, DESCRIPTION, DeleteFileSchema.shape, async ({ project_name, file_path, create_backup }) => {
16
+ const cfg = getConfig();
17
+ const shouldBackup = create_backup ?? cfg.backupOnWrite;
18
+ logger.info('Deleting project file', {
19
+ context: 'ToolExecution',
20
+ tool: TOOL_NAME,
21
+ project: project_name,
22
+ file: file_path,
23
+ backup: shouldBackup,
24
+ });
25
+ const projectDir = join(cfg.workspacePath, project_name);
26
+ try {
27
+ statSync(projectDir);
28
+ }
29
+ catch {
30
+ return errorResponse('PROJECT_NOT_FOUND', `Project '${project_name}' does not exist.`);
31
+ }
32
+ let resolved;
33
+ try {
34
+ resolved = resolveSafe(project_name, file_path);
35
+ }
36
+ catch (err) {
37
+ const msg = err instanceof Error ? err.message : String(err);
38
+ return errorResponse('PATH_TRAVERSAL_DETECTED', msg);
39
+ }
40
+ try {
41
+ statSync(resolved.absolute);
42
+ }
43
+ catch {
44
+ return errorResponse('FILE_NOT_FOUND', `File '${file_path}' does not exist in project '${project_name}'.`);
45
+ }
46
+ let backedUp = false;
47
+ if (shouldBackup) {
48
+ try {
49
+ copyFileSync(resolved.absolute, resolved.absolute + '.bak');
50
+ backedUp = true;
51
+ }
52
+ catch (err) {
53
+ const msg = err instanceof Error ? err.message : String(err);
54
+ logger.warn('Backup failed before delete', {
55
+ context: 'ToolExecution',
56
+ tool: TOOL_NAME,
57
+ file: file_path,
58
+ error: msg,
59
+ });
60
+ }
61
+ }
62
+ try {
63
+ unlinkSync(resolved.absolute);
64
+ }
65
+ catch (err) {
66
+ const msg = err instanceof Error ? err.message : String(err);
67
+ return errorResponse('DELETE_FAILED', `Failed to delete file: ${msg}`);
68
+ }
69
+ return {
70
+ content: [
71
+ {
72
+ type: 'text',
73
+ text: JSON.stringify({
74
+ error: false,
75
+ deleted: file_path,
76
+ project: project_name,
77
+ backed_up: backedUp,
78
+ backup_path: backedUp ? file_path + '.bak' : null,
79
+ }, null, 2),
80
+ },
81
+ ],
82
+ };
83
+ });
84
+ }
85
+ //# sourceMappingURL=delete-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-file.js","sourceRoot":"","sources":["../../src/tools/delete-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * list_assembly_steps — parse assembly.xml and return all flow steps.
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ export declare const TOOL_NAME = "list_assembly_steps";
6
+ export declare function register(server: McpServer): void;
7
+ //# sourceMappingURL=list-assembly-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-assembly-steps.d.ts","sourceRoot":"","sources":["../../src/tools/list-assembly-steps.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,eAAO,MAAM,SAAS,wBAAwB,CAAC;AAqF/C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqDhD"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * list_assembly_steps — parse assembly.xml and return all flow steps.
3
+ */
4
+ import { readFileSync, existsSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { z } from 'zod';
7
+ import { getConfig } from '../config.js';
8
+ import { errorResponse } from '../utils/errors.js';
9
+ import { logger } from '../utils/logger.js';
10
+ export const TOOL_NAME = 'list_assembly_steps';
11
+ const DESCRIPTION = 'Parse assembly.xml and return all assembly flow steps with their IDs, types, routing targets, ' +
12
+ 'and mediation attributes. Much faster than reading the full file when you need to understand ' +
13
+ 'the Workday integration flow structure.';
14
+ const STEP_TYPES = new Set([
15
+ 'workday-in', 'workday-out', 'workday-out-soap', 'workday-out-rest', 'workday-api',
16
+ 'workday-report', 'transform', 'xslt-plus', 'http-out', 'http-in',
17
+ 'local-in', 'local-out', 'async-mediation', 'splitter', 'xml-stream-splitter',
18
+ 'decision', 'sub-assembly', 'note', 'sequence', 'branch', 'eval', 'log',
19
+ 'file-out', 'sftp-out', 'email-out',
20
+ 'send-error', 'log-error', 'custom-error-handler',
21
+ 'xml-to-csv', 'csv-to-xml', 'xml-to-json', 'json-to-xml', 'json-transformer',
22
+ 'text-excel', 'wrap-soap', 'character-conversion',
23
+ ]);
24
+ function extractAttr(attrs, name) {
25
+ const m = attrs.match(new RegExp(`${name}="([^"]+)"`));
26
+ return m ? m[1] : null;
27
+ }
28
+ function isTopLevelStep(xml, matchIndex) {
29
+ const before = xml.slice(0, matchIndex);
30
+ const opens = (before.match(/<cc:steps>/g) ?? []).length;
31
+ const closes = (before.match(/<\/cc:steps>/g) ?? []).length;
32
+ return opens === closes;
33
+ }
34
+ function parseSteps(xml, includeNested) {
35
+ const steps = [];
36
+ const tagPattern = /<cc:([\w-]+)((?:\s[^>]*)?)\/?>/gs;
37
+ let match;
38
+ while ((match = tagPattern.exec(xml)) !== null) {
39
+ const stepType = match[1];
40
+ const attrs = match[2];
41
+ if (!STEP_TYPES.has(stepType))
42
+ continue;
43
+ const id = extractAttr(attrs, 'id');
44
+ if (!id)
45
+ continue;
46
+ if (!includeNested && !isTopLevelStep(xml, match.index))
47
+ continue;
48
+ const step = { id, type: `cc:${stepType}` };
49
+ const routesTo = extractAttr(attrs, 'routes-to');
50
+ const routesResponseTo = extractAttr(attrs, 'routes-response-to');
51
+ const name = extractAttr(attrs, 'name');
52
+ const href = extractAttr(attrs, 'href');
53
+ const endpoint = extractAttr(attrs, 'endpoint');
54
+ if (routesTo)
55
+ step.routes_to = routesTo;
56
+ if (routesResponseTo)
57
+ step.routes_response_to = routesResponseTo;
58
+ if (name)
59
+ step.name = name;
60
+ if (href)
61
+ step.href = href;
62
+ if (endpoint)
63
+ step.endpoint = endpoint;
64
+ steps.push(step);
65
+ }
66
+ return steps;
67
+ }
68
+ const schema = {
69
+ project_name: z.string().min(1).describe('The Studio integration project name'),
70
+ include_nested: z
71
+ .boolean()
72
+ .optional()
73
+ .describe('Include steps nested inside cc:async-mediation and cc:splitter sub-flows. ' +
74
+ 'Defaults to false (top-level only).'),
75
+ };
76
+ export function register(server) {
77
+ server.tool(TOOL_NAME, DESCRIPTION, schema, async ({ project_name, include_nested }) => {
78
+ const cfg = getConfig();
79
+ logger.info('Listing assembly steps', {
80
+ context: 'ToolExecution',
81
+ tool: TOOL_NAME,
82
+ project: project_name,
83
+ });
84
+ const assemblyPath = join(cfg.workspacePath, project_name, 'ws', 'WSAR-INF', 'assembly.xml');
85
+ if (!existsSync(assemblyPath)) {
86
+ return errorResponse('ASSEMBLY_NOT_FOUND', `No assembly.xml found in project '${project_name}'.`, 'Use list_studio_projects to confirm the project name.');
87
+ }
88
+ let xml;
89
+ try {
90
+ xml = readFileSync(assemblyPath, 'utf-8');
91
+ }
92
+ catch (err) {
93
+ const msg = err instanceof Error ? err.message : String(err);
94
+ return errorResponse('READ_ERROR', `Failed to read assembly.xml: ${msg}`);
95
+ }
96
+ const steps = parseSteps(xml, include_nested ?? false);
97
+ return {
98
+ content: [
99
+ {
100
+ type: 'text',
101
+ text: JSON.stringify({ error: false, project: project_name, count: steps.length, steps }, null, 2),
102
+ },
103
+ ],
104
+ };
105
+ });
106
+ }
107
+ //# sourceMappingURL=list-assembly-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-assembly-steps.js","sourceRoot":"","sources":["../../src/tools/list-assembly-steps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * list_project_files — list files in a Studio project directory.
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ export declare const TOOL_NAME = "list_project_files";
6
+ export declare function register(server: McpServer): void;
7
+ //# sourceMappingURL=list-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-files.d.ts","sourceRoot":"","sources":["../../src/tools/list-files.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,eAAO,MAAM,SAAS,uBAAuB,CAAC;AA4B9C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwChD"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * list_project_files — list files in a Studio project directory.
3
+ */
4
+ import { readdirSync, statSync } from 'fs';
5
+ import { join, relative } from 'path';
6
+ import { getConfig } from '../config.js';
7
+ import { errorResponse } from '../utils/errors.js';
8
+ import { logger } from '../utils/logger.js';
9
+ import { ListFilesSchema } from '../schemas/index.js';
10
+ export const TOOL_NAME = 'list_project_files';
11
+ const DESCRIPTION = 'List files in a Workday Studio project directory. Recurse into subdirectories.';
12
+ function walk(dir, baseDir, results) {
13
+ let entries;
14
+ try {
15
+ entries = readdirSync(dir);
16
+ }
17
+ catch {
18
+ return;
19
+ }
20
+ for (const entry of entries) {
21
+ const full = join(dir, entry);
22
+ let st;
23
+ try {
24
+ st = statSync(full);
25
+ }
26
+ catch {
27
+ continue;
28
+ }
29
+ if (st.isDirectory()) {
30
+ walk(full, baseDir, results);
31
+ }
32
+ else {
33
+ results.push(relative(baseDir, full).replace(/\\/g, '/'));
34
+ }
35
+ }
36
+ }
37
+ export function register(server) {
38
+ server.tool(TOOL_NAME, DESCRIPTION, ListFilesSchema.shape, async ({ project_name, subfolder }) => {
39
+ const cfg = getConfig();
40
+ logger.info('Listing project files', {
41
+ context: 'ToolExecution',
42
+ tool: TOOL_NAME,
43
+ project: project_name,
44
+ });
45
+ const projectDir = join(cfg.workspacePath, project_name);
46
+ const startDir = subfolder ? join(projectDir, subfolder) : projectDir;
47
+ try {
48
+ statSync(projectDir);
49
+ }
50
+ catch {
51
+ return errorResponse('PROJECT_NOT_FOUND', `Project '${project_name}' does not exist in the workspace.`, 'Use list_studio_projects to see available projects.');
52
+ }
53
+ const files = [];
54
+ walk(startDir, projectDir, files);
55
+ files.sort();
56
+ return {
57
+ content: [
58
+ {
59
+ type: 'text',
60
+ text: JSON.stringify({ error: false, project: project_name, count: files.length, files }, null, 2),
61
+ },
62
+ ],
63
+ };
64
+ });
65
+ }
66
+ //# sourceMappingURL=list-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-files.js","sourceRoot":"","sources":["../../src/tools/list-files.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,MAAM,SAAS,GAAG,oBAAoB,CAAC;AAE9C,MAAM,WAAW,GACf,gFAAgF,CAAC;AAEnF,SAAS,IAAI,CAAC,GAAW,EAAE,OAAe,EAAE,OAAiB;IAC3D,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,EAAE,CAAC;QACP,IAAI,CAAC;YACH,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,SAAS,EACT,WAAW,EACX,eAAe,CAAC,KAAK,EACrB,KAAK,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE;QACpC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACnC,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QAEtE,IAAI,CAAC;YACH,QAAQ,CAAC,UAAU,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,aAAa,CAClB,mBAAmB,EACnB,YAAY,YAAY,oCAAoC,EAC5D,qDAAqD,CACtD,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,EAAE,CAAC;QAEb,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACnG;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * list_integration_params — parse assembly.xml and return launch params and integration attributes.
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ export declare const TOOL_NAME = "list_integration_params";
6
+ export declare function register(server: McpServer): void;
7
+ //# sourceMappingURL=list-integration-params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-integration-params.d.ts","sourceRoot":"","sources":["../../src/tools/list-integration-params.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,eAAO,MAAM,SAAS,4BAA4B,CAAC;AAwFnD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiDhD"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * list_integration_params — parse assembly.xml and return launch params and integration attributes.
3
+ */
4
+ import { readFileSync, existsSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { getConfig } from '../config.js';
7
+ import { errorResponse } from '../utils/errors.js';
8
+ import { logger } from '../utils/logger.js';
9
+ import { ListIntegrationParamsSchema } from '../schemas/index.js';
10
+ export const TOOL_NAME = 'list_integration_params';
11
+ const DESCRIPTION = 'Parse assembly.xml and return all launch parameters and integration attributes defined on the ' +
12
+ 'cc:workday-in entry step. Use to map business requirements to the integration parameter/attribute ' +
13
+ 'list without reading the full assembly file.';
14
+ function extractParamType(body) {
15
+ const simpleMatch = body.match(/<cloud:simple-type>([^<]+)<\/cloud:simple-type>/);
16
+ if (simpleMatch)
17
+ return simpleMatch[1];
18
+ const classMatch = body.match(/<cloud:class-report-field\s+description="([^"]+)"/);
19
+ if (classMatch)
20
+ return `WID (${classMatch[1]})`;
21
+ const enumMatch = body.match(/<cloud:enumeration-type\s+name="([^"]+)"/);
22
+ if (enumMatch) {
23
+ const values = [...body.matchAll(/<cloud:enumeration>([^<]+)<\/cloud:enumeration>/g)].map((e) => e[1]);
24
+ return `enum: ${values.join(' | ')}`;
25
+ }
26
+ return 'unknown';
27
+ }
28
+ function parseParams(xml) {
29
+ const workdayInMatch = xml.match(/<cc:workday-in[\s\S]*?<\/cc:workday-in>/);
30
+ if (!workdayInMatch)
31
+ return { params: [], attributes: [], integration_system: null };
32
+ const block = workdayInMatch[0];
33
+ const sysNameMatch = block.match(/<cc:integration-system\s+name="([^"]+)"/);
34
+ const integrationSystem = sysNameMatch ? sysNameMatch[1] : null;
35
+ const params = [];
36
+ const paramPattern = /<cloud:param\s+name="([^"]+)">([\s\S]*?)<\/cloud:param>/g;
37
+ let m;
38
+ while ((m = paramPattern.exec(block)) !== null) {
39
+ const name = m[1];
40
+ const body = m[2];
41
+ params.push({
42
+ name,
43
+ type: extractParamType(body),
44
+ required: /required/.test(body),
45
+ });
46
+ }
47
+ const attributes = [];
48
+ const attrServicePattern = /<cloud:attribute-map-service\s+name="([^"]+)">([\s\S]*?)<\/cloud:attribute-map-service>/g;
49
+ while ((m = attrServicePattern.exec(block)) !== null) {
50
+ const serviceName = m[1];
51
+ const serviceBody = m[2];
52
+ const attrPattern = /<cloud:attribute\s+name="([^"]+)">([\s\S]*?)<\/cloud:attribute>/g;
53
+ let am;
54
+ while ((am = attrPattern.exec(serviceBody)) !== null) {
55
+ attributes.push({
56
+ service: serviceName,
57
+ name: am[1],
58
+ type: extractParamType(am[2]),
59
+ });
60
+ }
61
+ }
62
+ return { integration_system: integrationSystem, params, attributes };
63
+ }
64
+ export function register(server) {
65
+ server.tool(TOOL_NAME, DESCRIPTION, ListIntegrationParamsSchema.shape, async ({ project_name }) => {
66
+ const cfg = getConfig();
67
+ logger.info('Listing integration params', {
68
+ context: 'ToolExecution',
69
+ tool: TOOL_NAME,
70
+ project: project_name,
71
+ });
72
+ const assemblyPath = join(cfg.workspacePath, project_name, 'ws', 'WSAR-INF', 'assembly.xml');
73
+ if (!existsSync(assemblyPath)) {
74
+ return errorResponse('ASSEMBLY_NOT_FOUND', `No assembly.xml found in project '${project_name}'.`, 'Use list_studio_projects to confirm the project name.');
75
+ }
76
+ let xml;
77
+ try {
78
+ xml = readFileSync(assemblyPath, 'utf-8');
79
+ }
80
+ catch (err) {
81
+ const msg = err instanceof Error ? err.message : String(err);
82
+ return errorResponse('READ_ERROR', `Failed to read assembly.xml: ${msg}`);
83
+ }
84
+ const result = parseParams(xml);
85
+ return {
86
+ content: [
87
+ {
88
+ type: 'text',
89
+ text: JSON.stringify({ error: false, ...result }, null, 2),
90
+ },
91
+ ],
92
+ };
93
+ });
94
+ }
95
+ //# sourceMappingURL=list-integration-params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-integration-params.js","sourceRoot":"","sources":["../../src/tools/list-integration-params.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * list_studio_projects — list all Studio projects in the workspace.
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ export declare const TOOL_NAME = "list_studio_projects";
6
+ export declare function register(server: McpServer): void;
7
+ //# sourceMappingURL=list-projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-projects.d.ts","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,eAAO,MAAM,SAAS,yBAAyB,CAAC;AAMhD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwDhD"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * list_studio_projects — list all Studio projects in the workspace.
3
+ */
4
+ import { readdirSync, statSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { getConfig } from '../config.js';
7
+ import { errorResponse } from '../utils/errors.js';
8
+ import { logger } from '../utils/logger.js';
9
+ export const TOOL_NAME = 'list_studio_projects';
10
+ const DESCRIPTION = 'List all Workday Studio integration projects in the local Eclipse workspace. ' +
11
+ 'Returns project names, last-modified timestamps, and whether assembly.xml is present.';
12
+ export function register(server) {
13
+ server.tool(TOOL_NAME, DESCRIPTION, {}, async () => {
14
+ const cfg = getConfig();
15
+ logger.info('Listing Studio projects', { context: 'ToolExecution', tool: TOOL_NAME });
16
+ try {
17
+ const entries = readdirSync(cfg.workspacePath);
18
+ const projects = entries
19
+ .filter((name) => {
20
+ const stat = statSync(join(cfg.workspacePath, name));
21
+ return stat.isDirectory() && !name.startsWith('.');
22
+ })
23
+ .map((name) => {
24
+ const projectDir = join(cfg.workspacePath, name);
25
+ const assemblyPath = join(projectDir, 'ws', 'WSAR-INF', 'assembly.xml');
26
+ let hasAssembly = false;
27
+ let lastModified = null;
28
+ try {
29
+ statSync(assemblyPath);
30
+ hasAssembly = true;
31
+ }
32
+ catch {
33
+ // no assembly.xml
34
+ }
35
+ try {
36
+ const st = statSync(projectDir);
37
+ lastModified = st.mtime.toISOString();
38
+ }
39
+ catch {
40
+ // ignore
41
+ }
42
+ return { name, hasAssembly, lastModified };
43
+ });
44
+ logger.debug(`Found ${projects.length} projects`, {
45
+ context: 'ToolExecution',
46
+ tool: TOOL_NAME,
47
+ });
48
+ return {
49
+ content: [
50
+ {
51
+ type: 'text',
52
+ text: JSON.stringify({ error: false, count: projects.length, projects }, null, 2),
53
+ },
54
+ ],
55
+ };
56
+ }
57
+ catch (err) {
58
+ const message = err instanceof Error ? err.message : String(err);
59
+ logger.error('Failed to list projects', {
60
+ context: 'ToolExecution',
61
+ tool: TOOL_NAME,
62
+ error: message,
63
+ });
64
+ return errorResponse('READ_ERROR', `Failed to read workspace: ${message}`);
65
+ }
66
+ });
67
+ }
68
+ //# sourceMappingURL=list-projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,SAAS,GAAG,sBAAsB,CAAC;AAEhD,MAAM,WAAW,GACf,+EAA+E;IAC/E,uFAAuF,CAAC;AAE1F,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAEtF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAE/C,MAAM,QAAQ,GAAG,OAAO;iBACrB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBACf,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;gBACrD,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrD,CAAC,CAAC;iBACD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;gBACjD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;gBACxE,IAAI,WAAW,GAAG,KAAK,CAAC;gBACxB,IAAI,YAAY,GAAkB,IAAI,CAAC;gBACvC,IAAI,CAAC;oBACH,QAAQ,CAAC,YAAY,CAAC,CAAC;oBACvB,WAAW,GAAG,IAAI,CAAC;gBACrB,CAAC;gBAAC,MAAM,CAAC;oBACP,kBAAkB;gBACpB,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;oBAChC,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;YAC7C,CAAC,CAAC,CAAC;YAEL,MAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,MAAM,WAAW,EAAE;gBAChD,OAAO,EAAE,eAAe;gBACxB,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBAClF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;gBACtC,OAAO,EAAE,eAAe;gBACxB,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,OAAO;aACf,CAAC,CAAC;YACH,OAAO,aAAa,CAAC,YAAY,EAAE,6BAA6B,OAAO,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * read_project_file — read the contents of a project file.
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ export declare const TOOL_NAME = "read_project_file";
6
+ export declare function register(server: McpServer): void;
7
+ //# sourceMappingURL=read-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,eAAO,MAAM,SAAS,sBAAsB,CAAC;AAM7C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6DhD"}