@t4dhg/mcp-factorial 7.1.0 → 9.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 (209) hide show
  1. package/README.md +279 -56
  2. package/dist/api/ats.d.ts +78 -0
  3. package/dist/api/ats.d.ts.map +1 -0
  4. package/dist/api/ats.js +173 -0
  5. package/dist/api/ats.js.map +1 -0
  6. package/dist/api/attendance.d.ts +27 -0
  7. package/dist/api/attendance.d.ts.map +1 -0
  8. package/dist/api/attendance.js +62 -0
  9. package/dist/api/attendance.js.map +1 -0
  10. package/dist/api/contracts.d.ts +40 -0
  11. package/dist/api/contracts.d.ts.map +1 -0
  12. package/dist/api/contracts.js +146 -0
  13. package/dist/api/contracts.js.map +1 -0
  14. package/dist/api/documents.d.ts +95 -0
  15. package/dist/api/documents.d.ts.map +1 -0
  16. package/dist/api/documents.js +269 -0
  17. package/dist/api/documents.js.map +1 -0
  18. package/dist/api/employees.d.ts +35 -0
  19. package/dist/api/employees.d.ts.map +1 -0
  20. package/dist/api/employees.js +116 -0
  21. package/dist/api/employees.js.map +1 -0
  22. package/dist/api/index.d.ts +22 -0
  23. package/dist/api/index.d.ts.map +1 -0
  24. package/dist/api/index.js +36 -0
  25. package/dist/api/index.js.map +1 -0
  26. package/dist/api/job-catalog.d.ts +21 -0
  27. package/dist/api/job-catalog.d.ts.map +1 -0
  28. package/dist/api/job-catalog.js +34 -0
  29. package/dist/api/job-catalog.js.map +1 -0
  30. package/dist/api/locations.d.ts +26 -0
  31. package/dist/api/locations.d.ts.map +1 -0
  32. package/dist/api/locations.js +59 -0
  33. package/dist/api/locations.js.map +1 -0
  34. package/dist/api/payroll.d.ts +30 -0
  35. package/dist/api/payroll.d.ts.map +1 -0
  36. package/dist/api/payroll.js +68 -0
  37. package/dist/api/payroll.js.map +1 -0
  38. package/dist/api/projects.d.ts +82 -0
  39. package/dist/api/projects.d.ts.map +1 -0
  40. package/dist/api/projects.js +193 -0
  41. package/dist/api/projects.js.map +1 -0
  42. package/dist/api/shared.d.ts +12 -0
  43. package/dist/api/shared.d.ts.map +1 -0
  44. package/dist/api/shared.js +17 -0
  45. package/dist/api/shared.js.map +1 -0
  46. package/dist/api/teams.d.ts +26 -0
  47. package/dist/api/teams.d.ts.map +1 -0
  48. package/dist/api/teams.js +59 -0
  49. package/dist/api/teams.js.map +1 -0
  50. package/dist/api/time-off.d.ts +47 -0
  51. package/dist/api/time-off.d.ts.map +1 -0
  52. package/dist/api/time-off.js +112 -0
  53. package/dist/api/time-off.js.map +1 -0
  54. package/dist/api/training.d.ts +62 -0
  55. package/dist/api/training.d.ts.map +1 -0
  56. package/dist/api/training.js +147 -0
  57. package/dist/api/training.js.map +1 -0
  58. package/dist/api/work-areas.d.ts +30 -0
  59. package/dist/api/work-areas.d.ts.map +1 -0
  60. package/dist/api/work-areas.js +71 -0
  61. package/dist/api/work-areas.js.map +1 -0
  62. package/dist/api.d.ts +3 -464
  63. package/dist/api.d.ts.map +1 -1
  64. package/dist/api.js +3 -1274
  65. package/dist/api.js.map +1 -1
  66. package/dist/audit.d.ts +8 -3
  67. package/dist/audit.d.ts.map +1 -1
  68. package/dist/audit.js +8 -3
  69. package/dist/audit.js.map +1 -1
  70. package/dist/config.d.ts +1 -1
  71. package/dist/config.d.ts.map +1 -1
  72. package/dist/config.js +4 -1
  73. package/dist/config.js.map +1 -1
  74. package/dist/http-client.d.ts +12 -0
  75. package/dist/http-client.d.ts.map +1 -1
  76. package/dist/http-client.js +32 -1
  77. package/dist/http-client.js.map +1 -1
  78. package/dist/index.d.ts +6 -13
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +6 -3860
  81. package/dist/index.js.map +1 -1
  82. package/dist/oauth.d.ts +63 -0
  83. package/dist/oauth.d.ts.map +1 -0
  84. package/dist/oauth.js +143 -0
  85. package/dist/oauth.js.map +1 -0
  86. package/dist/schemas/ats.d.ts +403 -0
  87. package/dist/schemas/ats.d.ts.map +1 -0
  88. package/dist/schemas/ats.js +159 -0
  89. package/dist/schemas/ats.js.map +1 -0
  90. package/dist/schemas/documents.d.ts +108 -0
  91. package/dist/schemas/documents.d.ts.map +1 -0
  92. package/dist/schemas/documents.js +63 -0
  93. package/dist/schemas/documents.js.map +1 -0
  94. package/dist/schemas/employees.d.ts +586 -0
  95. package/dist/schemas/employees.d.ts.map +1 -0
  96. package/dist/schemas/employees.js +241 -0
  97. package/dist/schemas/employees.js.map +1 -0
  98. package/dist/schemas/index.d.ts +18 -0
  99. package/dist/schemas/index.d.ts.map +1 -0
  100. package/dist/schemas/index.js +28 -0
  101. package/dist/schemas/index.js.map +1 -0
  102. package/dist/schemas/job-catalog.d.ts +69 -0
  103. package/dist/schemas/job-catalog.d.ts.map +1 -0
  104. package/dist/schemas/job-catalog.js +34 -0
  105. package/dist/schemas/job-catalog.js.map +1 -0
  106. package/dist/schemas/payroll.d.ts +117 -0
  107. package/dist/schemas/payroll.d.ts.map +1 -0
  108. package/dist/schemas/payroll.js +68 -0
  109. package/dist/schemas/payroll.js.map +1 -0
  110. package/dist/schemas/projects.d.ts +303 -0
  111. package/dist/schemas/projects.d.ts.map +1 -0
  112. package/dist/schemas/projects.js +133 -0
  113. package/dist/schemas/projects.js.map +1 -0
  114. package/dist/schemas/shared.d.ts +55 -0
  115. package/dist/schemas/shared.d.ts.map +1 -0
  116. package/dist/schemas/shared.js +78 -0
  117. package/dist/schemas/shared.js.map +1 -0
  118. package/dist/schemas/time-off.d.ts +432 -0
  119. package/dist/schemas/time-off.d.ts.map +1 -0
  120. package/dist/schemas/time-off.js +175 -0
  121. package/dist/schemas/time-off.js.map +1 -0
  122. package/dist/schemas/training.d.ts +327 -0
  123. package/dist/schemas/training.d.ts.map +1 -0
  124. package/dist/schemas/training.js +138 -0
  125. package/dist/schemas/training.js.map +1 -0
  126. package/dist/schemas/work-areas.d.ts +64 -0
  127. package/dist/schemas/work-areas.d.ts.map +1 -0
  128. package/dist/schemas/work-areas.js +32 -0
  129. package/dist/schemas/work-areas.js.map +1 -0
  130. package/dist/schemas.d.ts +3 -1932
  131. package/dist/schemas.d.ts.map +1 -1
  132. package/dist/schemas.js +3 -785
  133. package/dist/schemas.js.map +1 -1
  134. package/dist/tool-utils.d.ts +0 -14
  135. package/dist/tool-utils.d.ts.map +1 -1
  136. package/dist/tool-utils.js +5 -18
  137. package/dist/tool-utils.js.map +1 -1
  138. package/dist/tools/ats.d.ts +6 -0
  139. package/dist/tools/ats.d.ts.map +1 -0
  140. package/dist/tools/ats.js +206 -0
  141. package/dist/tools/ats.js.map +1 -0
  142. package/dist/tools/attendance.d.ts +6 -0
  143. package/dist/tools/attendance.d.ts.map +1 -0
  144. package/dist/tools/attendance.js +86 -0
  145. package/dist/tools/attendance.js.map +1 -0
  146. package/dist/tools/contracts.d.ts +6 -0
  147. package/dist/tools/contracts.d.ts.map +1 -0
  148. package/dist/tools/contracts.js +63 -0
  149. package/dist/tools/contracts.js.map +1 -0
  150. package/dist/tools/documents.d.ts +6 -0
  151. package/dist/tools/documents.d.ts.map +1 -0
  152. package/dist/tools/documents.js +135 -0
  153. package/dist/tools/documents.js.map +1 -0
  154. package/dist/tools/employees.d.ts +6 -0
  155. package/dist/tools/employees.d.ts.map +1 -0
  156. package/dist/tools/employees.js +125 -0
  157. package/dist/tools/employees.js.map +1 -0
  158. package/dist/tools/index.d.ts +17 -0
  159. package/dist/tools/index.d.ts.map +1 -0
  160. package/dist/tools/index.js +221 -0
  161. package/dist/tools/index.js.map +1 -0
  162. package/dist/tools/job-catalog.d.ts +6 -0
  163. package/dist/tools/job-catalog.d.ts.map +1 -0
  164. package/dist/tools/job-catalog.js +39 -0
  165. package/dist/tools/job-catalog.js.map +1 -0
  166. package/dist/tools/locations.d.ts +6 -0
  167. package/dist/tools/locations.d.ts.map +1 -0
  168. package/dist/tools/locations.js +93 -0
  169. package/dist/tools/locations.js.map +1 -0
  170. package/dist/tools/payroll.d.ts +6 -0
  171. package/dist/tools/payroll.d.ts.map +1 -0
  172. package/dist/tools/payroll.js +76 -0
  173. package/dist/tools/payroll.js.map +1 -0
  174. package/dist/tools/projects.d.ts +6 -0
  175. package/dist/tools/projects.d.ts.map +1 -0
  176. package/dist/tools/projects.js +203 -0
  177. package/dist/tools/projects.js.map +1 -0
  178. package/dist/tools/shared.d.ts +84 -0
  179. package/dist/tools/shared.d.ts.map +1 -0
  180. package/dist/tools/shared.js +164 -0
  181. package/dist/tools/shared.js.map +1 -0
  182. package/dist/tools/teams.d.ts +6 -0
  183. package/dist/tools/teams.d.ts.map +1 -0
  184. package/dist/tools/teams.js +81 -0
  185. package/dist/tools/teams.js.map +1 -0
  186. package/dist/tools/time-off.d.ts +6 -0
  187. package/dist/tools/time-off.d.ts.map +1 -0
  188. package/dist/tools/time-off.js +144 -0
  189. package/dist/tools/time-off.js.map +1 -0
  190. package/dist/tools/training.d.ts +6 -0
  191. package/dist/tools/training.d.ts.map +1 -0
  192. package/dist/tools/training.js +160 -0
  193. package/dist/tools/training.js.map +1 -0
  194. package/dist/tools/work-areas.d.ts +6 -0
  195. package/dist/tools/work-areas.d.ts.map +1 -0
  196. package/dist/tools/work-areas.js +85 -0
  197. package/dist/tools/work-areas.js.map +1 -0
  198. package/dist/types.d.ts +1 -1
  199. package/dist/types.d.ts.map +1 -1
  200. package/dist/utils.d.ts +35 -0
  201. package/dist/utils.d.ts.map +1 -1
  202. package/dist/utils.js +97 -0
  203. package/dist/utils.js.map +1 -1
  204. package/dist/write-safety.d.ts +229 -2
  205. package/dist/write-safety.d.ts.map +1 -1
  206. package/dist/write-safety.js +42 -3
  207. package/dist/write-safety.js.map +1 -1
  208. package/llms.txt +2 -2
  209. package/package.json +2 -2
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Documents tool registration
3
+ */
4
+ import * as z from 'zod';
5
+ import { textResponse, formatToolError } from '../tool-utils.js';
6
+ import { listFolders, getFolder, listDocuments, getDocument, downloadEmployeePayslips, downloadEmployeeDocument, searchEmployees, } from '../api/index.js';
7
+ export function registerDocumentsTool(server) {
8
+ server.registerTool('factorial_documents', {
9
+ title: 'FactorialHR Documents',
10
+ description: 'Document management: list folders, list/get documents, search, download (OAuth2 required for downloads)',
11
+ inputSchema: {
12
+ action: z
13
+ .enum([
14
+ 'list_folders',
15
+ 'get_folder',
16
+ 'list',
17
+ 'get',
18
+ 'get_by_employee',
19
+ 'search',
20
+ 'download_payslips',
21
+ 'download',
22
+ ])
23
+ .describe('Action'),
24
+ id: z.number().optional().describe('Folder/document ID'),
25
+ employee_id: z.number().optional().describe('Employee ID'),
26
+ folder_id: z.number().optional().describe('Folder ID filter'),
27
+ employee_name: z.string().optional().describe('Employee name (for search)'),
28
+ document_pattern: z.string().optional().describe('Document name pattern (for search)'),
29
+ output_dir: z.string().optional().describe('Output directory (for downloads)'),
30
+ page: z.number().optional().default(1).describe('Page number'),
31
+ limit: z.number().optional().default(100).describe('Items per page'),
32
+ },
33
+ }, async (args) => {
34
+ try {
35
+ switch (args.action) {
36
+ case 'list_folders': {
37
+ const folders = await listFolders();
38
+ const summary = folders.map(f => ({
39
+ id: f.id,
40
+ name: f.name,
41
+ }));
42
+ return textResponse(`Found ${folders.length} folders:\n\n${JSON.stringify(summary, null, 2)}`);
43
+ }
44
+ case 'get_folder': {
45
+ if (!args.id)
46
+ return textResponse('Error: id is required');
47
+ const folder = await getFolder(args.id);
48
+ return textResponse(`Folder details:\n\n${JSON.stringify(folder, null, 2)}`);
49
+ }
50
+ case 'list': {
51
+ const result = await listDocuments({
52
+ folder_id: args.folder_id,
53
+ employee_ids: args.employee_id ? [args.employee_id] : undefined,
54
+ page: args.page,
55
+ limit: args.limit,
56
+ });
57
+ const summary = result.data.map(d => ({
58
+ id: d.id,
59
+ name: d.filename,
60
+ folder_id: d.folder_id,
61
+ employee_id: d.employee_id,
62
+ mime_type: d.content_type,
63
+ }));
64
+ return textResponse(`Found ${result.data.length} documents:\n\n${JSON.stringify(summary, null, 2)}`);
65
+ }
66
+ case 'get': {
67
+ if (!args.id)
68
+ return textResponse('Error: id is required');
69
+ const doc = await getDocument(args.id);
70
+ return textResponse(`Document details:\n\n${JSON.stringify(doc, null, 2)}`);
71
+ }
72
+ case 'get_by_employee': {
73
+ if (!args.employee_id)
74
+ return textResponse('Error: employee_id is required');
75
+ const result = await listDocuments({ employee_ids: [args.employee_id] });
76
+ const summary = result.data.map(d => ({
77
+ id: d.id,
78
+ name: d.filename,
79
+ folder_id: d.folder_id,
80
+ mime_type: d.content_type,
81
+ }));
82
+ return textResponse(`Found ${result.data.length} documents for employee ${args.employee_id}:\n\n${JSON.stringify(summary, null, 2)}`);
83
+ }
84
+ case 'search': {
85
+ if (!args.employee_name)
86
+ return textResponse('Error: employee_name is required');
87
+ const employees = await searchEmployees(args.employee_name);
88
+ if (employees.length === 0) {
89
+ return textResponse(`No employees found matching "${args.employee_name}"`);
90
+ }
91
+ const allDocs = [];
92
+ for (const emp of employees.slice(0, 5)) {
93
+ const result = await listDocuments({ employee_ids: [emp.id] });
94
+ let docs = result.data;
95
+ if (args.document_pattern) {
96
+ const pattern = args.document_pattern.toLowerCase();
97
+ docs = docs.filter(d => d.filename.toLowerCase().includes(pattern));
98
+ }
99
+ allDocs.push(...docs.map(d => ({
100
+ id: d.id,
101
+ name: d.filename,
102
+ employee: emp.full_name,
103
+ folder_id: d.folder_id,
104
+ })));
105
+ }
106
+ return textResponse(`Found ${allDocs.length} documents:\n\n${JSON.stringify(allDocs, null, 2)}`);
107
+ }
108
+ case 'download_payslips': {
109
+ if (!args.employee_id)
110
+ return textResponse('Error: employee_id is required');
111
+ if (!args.output_dir)
112
+ return textResponse('Error: output_dir is required for downloads');
113
+ const { downloaded, failures } = await downloadEmployeePayslips(args.employee_id, args.output_dir);
114
+ const paths = JSON.stringify(downloaded.map(r => r.path), null, 2);
115
+ const failureNote = failures.length > 0
116
+ ? `\n\n${failures.length} payslip(s) could not be downloaded:\n${failures.join('\n')}`
117
+ : '';
118
+ return textResponse(`Downloaded ${downloaded.length} payslips:\n\n${paths}${failureNote}`);
119
+ }
120
+ case 'download': {
121
+ if (!args.id)
122
+ return textResponse('Error: id (document ID) is required');
123
+ if (!args.output_dir)
124
+ return textResponse('Error: output_dir is required for downloads');
125
+ const downloadResult = await downloadEmployeeDocument(args.id, args.output_dir);
126
+ return textResponse(`Downloaded document to: ${downloadResult.path}`);
127
+ }
128
+ }
129
+ }
130
+ catch (error) {
131
+ return formatToolError(error);
132
+ }
133
+ });
134
+ }
135
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Employees tool registration
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ export declare function registerEmployeesTool(server: McpServer): void;
6
+ //# sourceMappingURL=employees.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"employees.d.ts","sourceRoot":"","sources":["../../src/tools/employees.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QA+HtD"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Employees tool registration
3
+ */
4
+ import * as z from 'zod';
5
+ import { checkConfirmation } from './shared.js';
6
+ import { textResponse, formatToolError } from '../tool-utils.js';
7
+ import { formatPaginationInfo } from '../pagination.js';
8
+ import { listEmployees, getEmployee, searchEmployees, createEmployee, updateEmployee, terminateEmployee, } from '../api/index.js';
9
+ export function registerEmployeesTool(server) {
10
+ server.registerTool('factorial_employees', {
11
+ title: 'FactorialHR Employees',
12
+ description: 'Manage employees: list, get, search, create, update, terminate',
13
+ inputSchema: {
14
+ action: z
15
+ .enum(['list', 'get', 'search', 'create', 'update', 'terminate'])
16
+ .describe('Action'),
17
+ id: z.number().optional().describe('Employee ID (for get/update/terminate)'),
18
+ query: z.string().optional().describe('Search query (for search)'),
19
+ team_id: z.number().optional().describe('Filter by team ID (for list)'),
20
+ location_id: z.number().optional().describe('Filter by location ID (for list)'),
21
+ page: z.number().optional().default(1).describe('Page number'),
22
+ limit: z.number().optional().default(100).describe('Items per page'),
23
+ first_name: z.string().optional().describe('First name'),
24
+ last_name: z.string().optional().describe('Last name'),
25
+ email: z.string().optional().describe('Email address'),
26
+ birthday_on: z.string().optional().describe('Birthday (YYYY-MM-DD)'),
27
+ gender: z.enum(['male', 'female', 'other']).optional().describe('Gender'),
28
+ nationality: z.string().optional().describe('Nationality'),
29
+ manager_id: z.number().optional().describe('Manager ID'),
30
+ terminated_on: z.string().optional().describe('Termination date (YYYY-MM-DD)'),
31
+ termination_reason: z.string().optional().describe('Reason for termination'),
32
+ confirm: z.boolean().optional().describe('Confirm high-risk operation'),
33
+ },
34
+ }, async (args) => {
35
+ try {
36
+ switch (args.action) {
37
+ case 'list': {
38
+ const result = await listEmployees({
39
+ team_id: args.team_id,
40
+ location_id: args.location_id,
41
+ page: args.page,
42
+ limit: args.limit,
43
+ });
44
+ const summary = result.data.map(e => ({
45
+ id: e.id,
46
+ name: e.full_name,
47
+ email: e.email,
48
+ identifier: e.identifier || null,
49
+ location_id: e.location_id,
50
+ manager_id: e.manager_id,
51
+ active: e.active,
52
+ }));
53
+ return textResponse(`Found ${result.data.length} employees (${formatPaginationInfo(result.meta)}):\n\n${JSON.stringify(summary, null, 2)}`);
54
+ }
55
+ case 'get': {
56
+ if (!args.id)
57
+ return textResponse('Error: id is required for get action');
58
+ const employee = await getEmployee(args.id);
59
+ return textResponse(`Employee details:\n\n${JSON.stringify(employee, null, 2)}`);
60
+ }
61
+ case 'search': {
62
+ if (!args.query)
63
+ return textResponse('Error: query is required for search action');
64
+ const employees = await searchEmployees(args.query);
65
+ if (employees.length === 0) {
66
+ return textResponse(`No employees found matching "${args.query}"`);
67
+ }
68
+ const summary = employees.map(e => ({
69
+ id: e.id,
70
+ name: e.full_name,
71
+ email: e.email,
72
+ identifier: e.identifier,
73
+ }));
74
+ return textResponse(`Found ${employees.length} employees matching "${args.query}":\n\n${JSON.stringify(summary, null, 2)}`);
75
+ }
76
+ case 'create': {
77
+ if (!args.first_name || !args.last_name || !args.email) {
78
+ return textResponse('Error: first_name, last_name, and email are required for create');
79
+ }
80
+ const employee = await createEmployee({
81
+ first_name: args.first_name,
82
+ last_name: args.last_name,
83
+ email: args.email,
84
+ birthday_on: args.birthday_on,
85
+ gender: args.gender,
86
+ nationality: args.nationality,
87
+ manager_id: args.manager_id,
88
+ location_id: args.location_id,
89
+ });
90
+ return textResponse(`Employee created:\n\n${JSON.stringify(employee, null, 2)}`);
91
+ }
92
+ case 'update': {
93
+ if (!args.id)
94
+ return textResponse('Error: id is required for update action');
95
+ const employee = await updateEmployee(args.id, {
96
+ first_name: args.first_name,
97
+ last_name: args.last_name,
98
+ email: args.email,
99
+ birthday_on: args.birthday_on,
100
+ gender: args.gender,
101
+ nationality: args.nationality,
102
+ manager_id: args.manager_id,
103
+ location_id: args.location_id,
104
+ });
105
+ return textResponse(`Employee updated:\n\n${JSON.stringify(employee, null, 2)}`);
106
+ }
107
+ case 'terminate': {
108
+ if (!args.id)
109
+ return textResponse('Error: id is required for terminate action');
110
+ if (!args.terminated_on)
111
+ return textResponse('Error: terminated_on is required');
112
+ const check = checkConfirmation('terminate_employee', args.confirm);
113
+ if (check.needsConfirmation)
114
+ return textResponse(check.message);
115
+ const employee = await terminateEmployee(args.id, args.terminated_on, args.termination_reason);
116
+ return textResponse(`Employee terminated:\n\n${JSON.stringify(employee, null, 2)}`);
117
+ }
118
+ }
119
+ }
120
+ catch (error) {
121
+ return formatToolError(error);
122
+ }
123
+ });
124
+ }
125
+ //# sourceMappingURL=employees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"employees.js","sourceRoot":"","sources":["../../src/tools/employees.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Server for FactorialHR - Hierarchical Tool Discovery
4
+ *
5
+ * v8.0.0 introduces hierarchical tool discovery to reduce context usage.
6
+ * Instead of 117 individual tools, we now have 14 category-based tools.
7
+ *
8
+ * Usage:
9
+ * 1. Use `factorial_discover` to list available categories and their actions
10
+ * 2. Use category tools like `factorial_employees` with an `action` parameter
11
+ *
12
+ * This reduces context token usage by ~88% while maintaining full functionality.
13
+ */
14
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
15
+ declare const server: McpServer;
16
+ export { server };
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAwBtF,QAAA,MAAM,MAAM,WAGV,CAAC;AAgPH,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,221 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Server for FactorialHR - Hierarchical Tool Discovery
4
+ *
5
+ * v8.0.0 introduces hierarchical tool discovery to reduce context usage.
6
+ * Instead of 117 individual tools, we now have 14 category-based tools.
7
+ *
8
+ * Usage:
9
+ * 1. Use `factorial_discover` to list available categories and their actions
10
+ * 2. Use category tools like `factorial_employees` with an `action` parameter
11
+ *
12
+ * This reduces context token usage by ~88% while maintaining full functionality.
13
+ */
14
+ import { loadEnv } from '../config.js';
15
+ // Load environment variables before other imports
16
+ loadEnv();
17
+ import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
18
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
19
+ import * as z from 'zod';
20
+ import { cache } from '../cache.js';
21
+ import { textResponse } from '../tool-utils.js';
22
+ import { listEmployees, getEmployee, getTeam, listLeaves, listAllowances } from '../api/index.js';
23
+ // Tool registration imports
24
+ import { CATEGORIES } from './shared.js';
25
+ import { registerEmployeesTool } from './employees.js';
26
+ import { registerTeamsTool } from './teams.js';
27
+ import { registerLocationsTool } from './locations.js';
28
+ import { registerContractsTool } from './contracts.js';
29
+ import { registerTimeOffTool } from './time-off.js';
30
+ import { registerAttendanceTool } from './attendance.js';
31
+ import { registerDocumentsTool } from './documents.js';
32
+ import { registerJobCatalogTool } from './job-catalog.js';
33
+ import { registerProjectsTool } from './projects.js';
34
+ import { registerTrainingTool } from './training.js';
35
+ import { registerWorkAreasTool } from './work-areas.js';
36
+ import { registerAtsTool } from './ats.js';
37
+ import { registerPayrollTool } from './payroll.js';
38
+ // Create server instance
39
+ const server = new McpServer({
40
+ name: 'factorial-hr',
41
+ version: '8.0.0',
42
+ });
43
+ // ============================================================================
44
+ // Discovery Tool
45
+ // ============================================================================
46
+ server.registerTool('factorial_discover', {
47
+ title: 'Discover FactorialHR Tools',
48
+ description: 'List available FactorialHR tool categories and their actions. Use this first to understand what operations are available.',
49
+ inputSchema: {
50
+ category: z
51
+ .string()
52
+ .optional()
53
+ .describe('Get details for a specific category (e.g., "employees", "time_off")'),
54
+ },
55
+ }, ({ category }) => {
56
+ if (category) {
57
+ const cat = CATEGORIES[category];
58
+ if (!cat) {
59
+ return textResponse(`Unknown category: "${category}". Available: ${Object.keys(CATEGORIES).join(', ')}`);
60
+ }
61
+ return textResponse(`## ${cat.name}\n\n${cat.description}\n\n**Available actions:**\n${cat.actions.map(a => `- ${a}`).join('\n')}\n\n**Usage:** factorial_${category}(action: "${cat.actions[0]}", ...)`);
62
+ }
63
+ const categoryList = Object.entries(CATEGORIES)
64
+ .map(([key, cat]) => `- **factorial_${key}**: ${cat.description} (${cat.actions.length} actions)`)
65
+ .join('\n');
66
+ return textResponse(`# FactorialHR Tool Categories\n\nUse \`factorial_discover(category: "name")\` for action details.\n\n${categoryList}\n\n**Total: 14 tools covering 117 operations**`);
67
+ });
68
+ // ============================================================================
69
+ // Register All Domain Tools
70
+ // ============================================================================
71
+ registerEmployeesTool(server);
72
+ registerTeamsTool(server);
73
+ registerLocationsTool(server);
74
+ registerContractsTool(server);
75
+ registerTimeOffTool(server);
76
+ registerAttendanceTool(server);
77
+ registerDocumentsTool(server);
78
+ registerJobCatalogTool(server);
79
+ registerProjectsTool(server);
80
+ registerTrainingTool(server);
81
+ registerWorkAreasTool(server);
82
+ registerAtsTool(server);
83
+ registerPayrollTool(server);
84
+ // ============================================================================
85
+ // Resources
86
+ // ============================================================================
87
+ // Organization chart resource
88
+ server.registerResource('org_chart', 'factorial://org-chart', {
89
+ description: 'View the organizational hierarchy of employees and their managers',
90
+ mimeType: 'application/json',
91
+ }, async () => {
92
+ const result = await listEmployees({ page: 1, limit: 500 });
93
+ const employees = result.data;
94
+ const buildOrgChart = () => {
95
+ const employeeMap = new Map();
96
+ employees.forEach(e => {
97
+ employeeMap.set(e.id, {
98
+ id: e.id,
99
+ name: e.full_name,
100
+ email: e.email,
101
+ manager_id: e.manager_id,
102
+ reports: [],
103
+ });
104
+ });
105
+ const roots = [];
106
+ employeeMap.forEach(node => {
107
+ if (node.manager_id && employeeMap.has(node.manager_id)) {
108
+ employeeMap.get(node.manager_id).reports.push(node);
109
+ }
110
+ else {
111
+ roots.push(node);
112
+ }
113
+ });
114
+ return roots;
115
+ };
116
+ return {
117
+ contents: [
118
+ {
119
+ uri: 'factorial://org-chart',
120
+ mimeType: 'application/json',
121
+ text: JSON.stringify(buildOrgChart(), null, 2),
122
+ },
123
+ ],
124
+ };
125
+ });
126
+ // Employee directory resource template
127
+ server.registerResource('employee_directory', new ResourceTemplate('factorial://employees/{id}', {
128
+ list: async () => {
129
+ const result = await listEmployees({ page: 1, limit: 100 });
130
+ return {
131
+ resources: result.data.map(e => ({
132
+ name: e.full_name || `Employee ${e.id}`,
133
+ uri: `factorial://employees/${e.id}`,
134
+ description: `Employee: ${e.full_name} (${e.email})`,
135
+ mimeType: 'application/json',
136
+ })),
137
+ };
138
+ },
139
+ }), {
140
+ description: 'Get detailed information about an employee',
141
+ mimeType: 'application/json',
142
+ }, async (uri, variables) => {
143
+ const employee = await getEmployee(Number(variables.id));
144
+ return {
145
+ contents: [
146
+ {
147
+ uri: uri.href,
148
+ mimeType: 'application/json',
149
+ text: JSON.stringify(employee, null, 2),
150
+ },
151
+ ],
152
+ };
153
+ });
154
+ // ============================================================================
155
+ // Prompts
156
+ // ============================================================================
157
+ server.registerPrompt('summarize_team', {
158
+ description: 'Generate a summary of a team including its members and their roles',
159
+ argsSchema: {
160
+ team_id: z.string().describe('The team ID to summarize'),
161
+ },
162
+ }, async ({ team_id }) => {
163
+ const team = await getTeam(Number(team_id));
164
+ const members = team.employee_ids || [];
165
+ const employeeDetails = await Promise.all(members.map(id => getEmployee(Number(id))));
166
+ return {
167
+ messages: [
168
+ {
169
+ role: 'user',
170
+ content: {
171
+ type: 'text',
172
+ text: `Please summarize this team:\n\nTeam: ${team.name}\nDescription: ${team.description || 'N/A'}\nLead IDs: ${team.lead_ids?.join(', ') || 'None'}\n\nMembers (${members.length}):\n${employeeDetails.map(e => `- ${e.full_name} (${e.email})`).join('\n')}`,
173
+ },
174
+ },
175
+ ],
176
+ };
177
+ });
178
+ server.registerPrompt('time_off_report', {
179
+ description: 'Generate a time off report for an employee',
180
+ argsSchema: {
181
+ employee_id: z.string().describe('The employee ID'),
182
+ },
183
+ }, async ({ employee_id }) => {
184
+ const employee = await getEmployee(Number(employee_id));
185
+ const leaves = await listLeaves({ employee_id: Number(employee_id) });
186
+ const allowances = await listAllowances({ employee_id: Number(employee_id) });
187
+ return {
188
+ messages: [
189
+ {
190
+ role: 'user',
191
+ content: {
192
+ type: 'text',
193
+ text: `Generate a time off report for ${employee.full_name}:\n\nAllowances:\n${JSON.stringify(allowances.data, null, 2)}\n\nRecent Leaves:\n${JSON.stringify(leaves.data.slice(0, 10), null, 2)}`,
194
+ },
195
+ },
196
+ ],
197
+ };
198
+ });
199
+ // ============================================================================
200
+ // Start Server
201
+ // ============================================================================
202
+ async function main() {
203
+ const transport = new StdioServerTransport();
204
+ await server.connect(transport);
205
+ // Clear cache on shutdown
206
+ process.on('SIGINT', () => {
207
+ cache.clear();
208
+ process.exit(0);
209
+ });
210
+ process.on('SIGTERM', () => {
211
+ cache.clear();
212
+ process.exit(0);
213
+ });
214
+ }
215
+ main().catch(error => {
216
+ console.error('Fatal error:', error);
217
+ process.exit(1);
218
+ });
219
+ // Export server for testing
220
+ export { server };
221
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Job Catalog tool registration
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ export declare function registerJobCatalogTool(server: McpServer): void;
6
+ //# sourceMappingURL=job-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-catalog.d.ts","sourceRoot":"","sources":["../../src/tools/job-catalog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QAuCvD"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Job Catalog tool registration
3
+ */
4
+ import * as z from 'zod';
5
+ import { textResponse, formatToolError } from '../tool-utils.js';
6
+ import { listJobRoles, getJobRole, listJobLevels } from '../api/index.js';
7
+ export function registerJobCatalogTool(server) {
8
+ server.registerTool('factorial_job_catalog', {
9
+ title: 'FactorialHR Job Catalog',
10
+ description: 'View job roles and levels',
11
+ inputSchema: {
12
+ action: z.enum(['list_roles', 'get_role', 'list_levels']).describe('Action'),
13
+ id: z.number().optional().describe('Job role ID (for get_role)'),
14
+ },
15
+ }, async (args) => {
16
+ try {
17
+ switch (args.action) {
18
+ case 'list_roles': {
19
+ const roles = await listJobRoles();
20
+ return textResponse(`Found ${roles.length} job roles:\n\n${JSON.stringify(roles, null, 2)}`);
21
+ }
22
+ case 'get_role': {
23
+ if (!args.id)
24
+ return textResponse('Error: id is required');
25
+ const role = await getJobRole(args.id);
26
+ return textResponse(`Job role details:\n\n${JSON.stringify(role, null, 2)}`);
27
+ }
28
+ case 'list_levels': {
29
+ const levels = await listJobLevels();
30
+ return textResponse(`Found ${levels.length} job levels:\n\n${JSON.stringify(levels, null, 2)}`);
31
+ }
32
+ }
33
+ }
34
+ catch (error) {
35
+ return formatToolError(error);
36
+ }
37
+ });
38
+ }
39
+ //# sourceMappingURL=job-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-catalog.js","sourceRoot":"","sources":["../../src/tools/job-catalog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,2BAA2B;QACxC,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC5E,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;SACjE;KACF,EACD,KAAK,EAAC,IAAI,EAAC,EAAE;QACX,IAAI,CAAC;YACH,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,KAAK,YAAY,CAAC,CAAC,CAAC;oBAClB,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;oBACnC,OAAO,YAAY,CACjB,SAAS,KAAK,CAAC,MAAM,kBAAkB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CACxE,CAAC;gBACJ,CAAC;gBAED,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,IAAI,CAAC,IAAI,CAAC,EAAE;wBAAE,OAAO,YAAY,CAAC,uBAAuB,CAAC,CAAC;oBAC3D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACvC,OAAO,YAAY,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/E,CAAC;gBAED,KAAK,aAAa,CAAC,CAAC,CAAC;oBACnB,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;oBACrC,OAAO,YAAY,CACjB,SAAS,MAAM,CAAC,MAAM,mBAAmB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAC3E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Locations tool registration
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ export declare function registerLocationsTool(server: McpServer): void;
6
+ //# sourceMappingURL=locations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locations.d.ts","sourceRoot":"","sources":["../../src/tools/locations.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAuFtD"}