@energio/holded-mcp 1.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 (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1040 -0
  3. package/dist/constants.d.ts +60 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +72 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/index.d.ts +11 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +86 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/schemas/accounting/account-balances.d.ts +19 -0
  12. package/dist/schemas/accounting/account-balances.d.ts.map +1 -0
  13. package/dist/schemas/accounting/account-balances.js +28 -0
  14. package/dist/schemas/accounting/account-balances.js.map +1 -0
  15. package/dist/schemas/accounting/accounts.d.ts +49 -0
  16. package/dist/schemas/accounting/accounts.d.ts.map +1 -0
  17. package/dist/schemas/accounting/accounts.js +50 -0
  18. package/dist/schemas/accounting/accounts.js.map +1 -0
  19. package/dist/schemas/accounting/daily-ledger.d.ts +45 -0
  20. package/dist/schemas/accounting/daily-ledger.d.ts.map +1 -0
  21. package/dist/schemas/accounting/daily-ledger.js +57 -0
  22. package/dist/schemas/accounting/daily-ledger.js.map +1 -0
  23. package/dist/schemas/common.d.ts +118 -0
  24. package/dist/schemas/common.d.ts.map +1 -0
  25. package/dist/schemas/common.js +126 -0
  26. package/dist/schemas/common.js.map +1 -0
  27. package/dist/schemas/crm/bookings.d.ts +108 -0
  28. package/dist/schemas/crm/bookings.d.ts.map +1 -0
  29. package/dist/schemas/crm/bookings.js +96 -0
  30. package/dist/schemas/crm/bookings.js.map +1 -0
  31. package/dist/schemas/crm/events.d.ts +57 -0
  32. package/dist/schemas/crm/events.d.ts.map +1 -0
  33. package/dist/schemas/crm/events.js +53 -0
  34. package/dist/schemas/crm/events.js.map +1 -0
  35. package/dist/schemas/crm/funnels.d.ts +60 -0
  36. package/dist/schemas/crm/funnels.d.ts.map +1 -0
  37. package/dist/schemas/crm/funnels.js +48 -0
  38. package/dist/schemas/crm/funnels.js.map +1 -0
  39. package/dist/schemas/crm/leads.d.ts +146 -0
  40. package/dist/schemas/crm/leads.d.ts.map +1 -0
  41. package/dist/schemas/crm/leads.js +129 -0
  42. package/dist/schemas/crm/leads.js.map +1 -0
  43. package/dist/schemas/invoicing/contacts.d.ts +352 -0
  44. package/dist/schemas/invoicing/contacts.d.ts.map +1 -0
  45. package/dist/schemas/invoicing/contacts.js +187 -0
  46. package/dist/schemas/invoicing/contacts.js.map +1 -0
  47. package/dist/schemas/invoicing/documents.d.ts +424 -0
  48. package/dist/schemas/invoicing/documents.d.ts.map +1 -0
  49. package/dist/schemas/invoicing/documents.js +217 -0
  50. package/dist/schemas/invoicing/documents.js.map +1 -0
  51. package/dist/schemas/invoicing/expenses-accounts.d.ts +47 -0
  52. package/dist/schemas/invoicing/expenses-accounts.d.ts.map +1 -0
  53. package/dist/schemas/invoicing/expenses-accounts.js +43 -0
  54. package/dist/schemas/invoicing/expenses-accounts.js.map +1 -0
  55. package/dist/schemas/invoicing/numbering-series.d.ts +94 -0
  56. package/dist/schemas/invoicing/numbering-series.d.ts.map +1 -0
  57. package/dist/schemas/invoicing/numbering-series.js +43 -0
  58. package/dist/schemas/invoicing/numbering-series.js.map +1 -0
  59. package/dist/schemas/invoicing/payments.d.ts +50 -0
  60. package/dist/schemas/invoicing/payments.d.ts.map +1 -0
  61. package/dist/schemas/invoicing/payments.js +46 -0
  62. package/dist/schemas/invoicing/payments.js.map +1 -0
  63. package/dist/schemas/invoicing/products.d.ts +176 -0
  64. package/dist/schemas/invoicing/products.d.ts.map +1 -0
  65. package/dist/schemas/invoicing/products.js +149 -0
  66. package/dist/schemas/invoicing/products.js.map +1 -0
  67. package/dist/schemas/invoicing/remittances.d.ts +21 -0
  68. package/dist/schemas/invoicing/remittances.d.ts.map +1 -0
  69. package/dist/schemas/invoicing/remittances.js +20 -0
  70. package/dist/schemas/invoicing/remittances.js.map +1 -0
  71. package/dist/schemas/invoicing/sales-channels.d.ts +45 -0
  72. package/dist/schemas/invoicing/sales-channels.d.ts.map +1 -0
  73. package/dist/schemas/invoicing/sales-channels.js +41 -0
  74. package/dist/schemas/invoicing/sales-channels.js.map +1 -0
  75. package/dist/schemas/invoicing/services.d.ts +55 -0
  76. package/dist/schemas/invoicing/services.d.ts.map +1 -0
  77. package/dist/schemas/invoicing/services.js +51 -0
  78. package/dist/schemas/invoicing/services.js.map +1 -0
  79. package/dist/schemas/invoicing/taxes.d.ts +12 -0
  80. package/dist/schemas/invoicing/taxes.d.ts.map +1 -0
  81. package/dist/schemas/invoicing/taxes.js +12 -0
  82. package/dist/schemas/invoicing/taxes.js.map +1 -0
  83. package/dist/schemas/invoicing/treasury.d.ts +42 -0
  84. package/dist/schemas/invoicing/treasury.d.ts.map +1 -0
  85. package/dist/schemas/invoicing/treasury.js +39 -0
  86. package/dist/schemas/invoicing/treasury.js.map +1 -0
  87. package/dist/schemas/invoicing/warehouses.d.ts +61 -0
  88. package/dist/schemas/invoicing/warehouses.d.ts.map +1 -0
  89. package/dist/schemas/invoicing/warehouses.js +43 -0
  90. package/dist/schemas/invoicing/warehouses.js.map +1 -0
  91. package/dist/schemas/projects/projects.d.ts +60 -0
  92. package/dist/schemas/projects/projects.d.ts.map +1 -0
  93. package/dist/schemas/projects/projects.js +55 -0
  94. package/dist/schemas/projects/projects.js.map +1 -0
  95. package/dist/schemas/projects/tasks.d.ts +68 -0
  96. package/dist/schemas/projects/tasks.d.ts.map +1 -0
  97. package/dist/schemas/projects/tasks.js +64 -0
  98. package/dist/schemas/projects/tasks.js.map +1 -0
  99. package/dist/schemas/projects/time-tracking.d.ts +80 -0
  100. package/dist/schemas/projects/time-tracking.d.ts.map +1 -0
  101. package/dist/schemas/projects/time-tracking.js +75 -0
  102. package/dist/schemas/projects/time-tracking.js.map +1 -0
  103. package/dist/schemas/team/employees.d.ts +135 -0
  104. package/dist/schemas/team/employees.d.ts.map +1 -0
  105. package/dist/schemas/team/employees.js +144 -0
  106. package/dist/schemas/team/employees.js.map +1 -0
  107. package/dist/schemas/team/time-tracking.d.ts +98 -0
  108. package/dist/schemas/team/time-tracking.d.ts.map +1 -0
  109. package/dist/schemas/team/time-tracking.js +89 -0
  110. package/dist/schemas/team/time-tracking.js.map +1 -0
  111. package/dist/services/api.d.ts +118 -0
  112. package/dist/services/api.d.ts.map +1 -0
  113. package/dist/services/api.js +441 -0
  114. package/dist/services/api.js.map +1 -0
  115. package/dist/tools/accounting/account-balances.d.ts +44 -0
  116. package/dist/tools/accounting/account-balances.d.ts.map +1 -0
  117. package/dist/tools/accounting/account-balances.js +240 -0
  118. package/dist/tools/accounting/account-balances.js.map +1 -0
  119. package/dist/tools/accounting/accounts.d.ts +18 -0
  120. package/dist/tools/accounting/accounts.d.ts.map +1 -0
  121. package/dist/tools/accounting/accounts.js +131 -0
  122. package/dist/tools/accounting/accounts.js.map +1 -0
  123. package/dist/tools/accounting/daily-ledger.d.ts +9 -0
  124. package/dist/tools/accounting/daily-ledger.d.ts.map +1 -0
  125. package/dist/tools/accounting/daily-ledger.js +117 -0
  126. package/dist/tools/accounting/daily-ledger.js.map +1 -0
  127. package/dist/tools/accounting/index.d.ts +9 -0
  128. package/dist/tools/accounting/index.d.ts.map +1 -0
  129. package/dist/tools/accounting/index.js +15 -0
  130. package/dist/tools/accounting/index.js.map +1 -0
  131. package/dist/tools/crm/bookings.d.ts +18 -0
  132. package/dist/tools/crm/bookings.d.ts.map +1 -0
  133. package/dist/tools/crm/bookings.js +272 -0
  134. package/dist/tools/crm/bookings.js.map +1 -0
  135. package/dist/tools/crm/events.d.ts +18 -0
  136. package/dist/tools/crm/events.d.ts.map +1 -0
  137. package/dist/tools/crm/events.js +134 -0
  138. package/dist/tools/crm/events.js.map +1 -0
  139. package/dist/tools/crm/funnels.d.ts +18 -0
  140. package/dist/tools/crm/funnels.d.ts.map +1 -0
  141. package/dist/tools/crm/funnels.js +113 -0
  142. package/dist/tools/crm/funnels.js.map +1 -0
  143. package/dist/tools/crm/index.d.ts +9 -0
  144. package/dist/tools/crm/index.d.ts.map +1 -0
  145. package/dist/tools/crm/index.js +17 -0
  146. package/dist/tools/crm/index.js.map +1 -0
  147. package/dist/tools/crm/leads.d.ts +18 -0
  148. package/dist/tools/crm/leads.d.ts.map +1 -0
  149. package/dist/tools/crm/leads.js +519 -0
  150. package/dist/tools/crm/leads.js.map +1 -0
  151. package/dist/tools/factory.d.ts +55 -0
  152. package/dist/tools/factory.d.ts.map +1 -0
  153. package/dist/tools/factory.js +145 -0
  154. package/dist/tools/factory.js.map +1 -0
  155. package/dist/tools/invoicing/contacts.d.ts +26 -0
  156. package/dist/tools/invoicing/contacts.d.ts.map +1 -0
  157. package/dist/tools/invoicing/contacts.js +358 -0
  158. package/dist/tools/invoicing/contacts.js.map +1 -0
  159. package/dist/tools/invoicing/documents.d.ts +18 -0
  160. package/dist/tools/invoicing/documents.d.ts.map +1 -0
  161. package/dist/tools/invoicing/documents.js +578 -0
  162. package/dist/tools/invoicing/documents.js.map +1 -0
  163. package/dist/tools/invoicing/expenses-accounts.d.ts +25 -0
  164. package/dist/tools/invoicing/expenses-accounts.d.ts.map +1 -0
  165. package/dist/tools/invoicing/expenses-accounts.js +111 -0
  166. package/dist/tools/invoicing/expenses-accounts.js.map +1 -0
  167. package/dist/tools/invoicing/index.d.ts +9 -0
  168. package/dist/tools/invoicing/index.d.ts.map +1 -0
  169. package/dist/tools/invoicing/index.js +33 -0
  170. package/dist/tools/invoicing/index.js.map +1 -0
  171. package/dist/tools/invoicing/numbering-series.d.ts +9 -0
  172. package/dist/tools/invoicing/numbering-series.d.ts.map +1 -0
  173. package/dist/tools/invoicing/numbering-series.js +161 -0
  174. package/dist/tools/invoicing/numbering-series.js.map +1 -0
  175. package/dist/tools/invoicing/payments.d.ts +18 -0
  176. package/dist/tools/invoicing/payments.d.ts.map +1 -0
  177. package/dist/tools/invoicing/payments.js +175 -0
  178. package/dist/tools/invoicing/payments.js.map +1 -0
  179. package/dist/tools/invoicing/products.d.ts +18 -0
  180. package/dist/tools/invoicing/products.d.ts.map +1 -0
  181. package/dist/tools/invoicing/products.js +389 -0
  182. package/dist/tools/invoicing/products.js.map +1 -0
  183. package/dist/tools/invoicing/remittances.d.ts +17 -0
  184. package/dist/tools/invoicing/remittances.d.ts.map +1 -0
  185. package/dist/tools/invoicing/remittances.js +76 -0
  186. package/dist/tools/invoicing/remittances.js.map +1 -0
  187. package/dist/tools/invoicing/sales-channels.d.ts +24 -0
  188. package/dist/tools/invoicing/sales-channels.d.ts.map +1 -0
  189. package/dist/tools/invoicing/sales-channels.js +105 -0
  190. package/dist/tools/invoicing/sales-channels.js.map +1 -0
  191. package/dist/tools/invoicing/services.d.ts +29 -0
  192. package/dist/tools/invoicing/services.d.ts.map +1 -0
  193. package/dist/tools/invoicing/services.js +124 -0
  194. package/dist/tools/invoicing/services.js.map +1 -0
  195. package/dist/tools/invoicing/taxes.d.ts +18 -0
  196. package/dist/tools/invoicing/taxes.d.ts.map +1 -0
  197. package/dist/tools/invoicing/taxes.js +58 -0
  198. package/dist/tools/invoicing/taxes.js.map +1 -0
  199. package/dist/tools/invoicing/treasury.d.ts +9 -0
  200. package/dist/tools/invoicing/treasury.d.ts.map +1 -0
  201. package/dist/tools/invoicing/treasury.js +196 -0
  202. package/dist/tools/invoicing/treasury.js.map +1 -0
  203. package/dist/tools/invoicing/warehouses.d.ts +18 -0
  204. package/dist/tools/invoicing/warehouses.d.ts.map +1 -0
  205. package/dist/tools/invoicing/warehouses.js +133 -0
  206. package/dist/tools/invoicing/warehouses.js.map +1 -0
  207. package/dist/tools/projects/index.d.ts +9 -0
  208. package/dist/tools/projects/index.d.ts.map +1 -0
  209. package/dist/tools/projects/index.js +15 -0
  210. package/dist/tools/projects/index.js.map +1 -0
  211. package/dist/tools/projects/projects.d.ts +18 -0
  212. package/dist/tools/projects/projects.d.ts.map +1 -0
  213. package/dist/tools/projects/projects.js +203 -0
  214. package/dist/tools/projects/projects.js.map +1 -0
  215. package/dist/tools/projects/tasks.d.ts +18 -0
  216. package/dist/tools/projects/tasks.d.ts.map +1 -0
  217. package/dist/tools/projects/tasks.js +154 -0
  218. package/dist/tools/projects/tasks.js.map +1 -0
  219. package/dist/tools/projects/time-tracking.d.ts +14 -0
  220. package/dist/tools/projects/time-tracking.d.ts.map +1 -0
  221. package/dist/tools/projects/time-tracking.js +291 -0
  222. package/dist/tools/projects/time-tracking.js.map +1 -0
  223. package/dist/tools/team/employees.d.ts +18 -0
  224. package/dist/tools/team/employees.d.ts.map +1 -0
  225. package/dist/tools/team/employees.js +149 -0
  226. package/dist/tools/team/employees.js.map +1 -0
  227. package/dist/tools/team/index.d.ts +9 -0
  228. package/dist/tools/team/index.d.ts.map +1 -0
  229. package/dist/tools/team/index.js +13 -0
  230. package/dist/tools/team/index.js.map +1 -0
  231. package/dist/tools/team/time-tracking.d.ts +18 -0
  232. package/dist/tools/team/time-tracking.d.ts.map +1 -0
  233. package/dist/tools/team/time-tracking.js +398 -0
  234. package/dist/tools/team/time-tracking.js.map +1 -0
  235. package/dist/tools/utilities.d.ts +45 -0
  236. package/dist/tools/utilities.d.ts.map +1 -0
  237. package/dist/tools/utilities.js +55 -0
  238. package/dist/tools/utilities.js.map +1 -0
  239. package/dist/types.d.ts +640 -0
  240. package/dist/types.d.ts.map +1 -0
  241. package/dist/types.js +29 -0
  242. package/dist/types.js.map +1 -0
  243. package/package.json +70 -0
@@ -0,0 +1,398 @@
1
+ /**
2
+ * Time Tracking tools for Holded API
3
+ */
4
+ import { makeApiRequest, toStructuredContent } from "../../services/api.js";
5
+ import { ResponseFormat } from "../../constants.js";
6
+ import { withErrorHandling } from "../utilities.js";
7
+ import { ListAllTimeTrackingsInputSchema, ListEmployeeTimeTrackingsInputSchema, GetTimeTrackingInputSchema, CreateEmployeeTimeTrackingInputSchema, UpdateTimeTrackingInputSchema, DeleteTimeTrackingInputSchema, EmployeeClockInInputSchema, EmployeeClockOutInputSchema, EmployeePauseInputSchema, EmployeeUnpauseInputSchema, } from "../../schemas/team/time-tracking.js";
8
+ /**
9
+ * Format time-trackings as markdown
10
+ */
11
+ export function formatTimeTrackingsMarkdown(times) {
12
+ if (!times.length) {
13
+ return "No time-trackings found.";
14
+ }
15
+ const lines = ["# Time Trackings", "", `Found ${times.length} time entries:`, ""];
16
+ for (const time of times) {
17
+ lines.push(`## ${time.employeeName || `Employee ${time.employeeId}`}`);
18
+ lines.push(`- **ID**: ${time.id}`);
19
+ lines.push(`- **Date**: ${new Date(time.date * 1000).toLocaleDateString()}`);
20
+ lines.push(`- **Hours**: ${time.hours}`);
21
+ if (time.description)
22
+ lines.push(`- **Description**: ${time.description}`);
23
+ if (time.projectName)
24
+ lines.push(`- **Project**: ${time.projectName}`);
25
+ if (time.taskName)
26
+ lines.push(`- **Task**: ${time.taskName}`);
27
+ if (time.billable !== undefined)
28
+ lines.push(`- **Billable**: ${time.billable ? "Yes" : "No"}`);
29
+ lines.push("");
30
+ }
31
+ return lines.join("\n");
32
+ }
33
+ /**
34
+ * Format a single time-tracking as markdown
35
+ */
36
+ export function formatTimeTrackingMarkdown(time) {
37
+ const lines = [`# Time Tracking Entry`, "", `**ID**: ${time.id}`, ""];
38
+ lines.push(`- **Employee**: ${time.employeeName || time.employeeId}`);
39
+ lines.push(`- **Date**: ${new Date(time.date * 1000).toLocaleDateString()}`);
40
+ lines.push(`- **Hours**: ${time.hours}`);
41
+ if (time.description)
42
+ lines.push(`- **Description**: ${time.description}`);
43
+ if (time.projectName)
44
+ lines.push(`- **Project**: ${time.projectName} (${time.projectId})`);
45
+ if (time.taskName)
46
+ lines.push(`- **Task**: ${time.taskName} (${time.taskId})`);
47
+ if (time.billable !== undefined)
48
+ lines.push(`- **Billable**: ${time.billable ? "Yes" : "No"}`);
49
+ return lines.join("\n");
50
+ }
51
+ /**
52
+ * Register all time-tracking-related tools
53
+ */
54
+ export function registerTimeTrackingTools(server) {
55
+ // List All Time Trackings
56
+ server.registerTool("holded_team_list_all_time_trackings", {
57
+ title: "List All Holded Time Trackings",
58
+ description: `List all time-trackings for all employees from Holded.
59
+
60
+ Args:
61
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
62
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
63
+
64
+ Returns:
65
+ Array of time-trackings with id, employee, date, hours, and description.`,
66
+ inputSchema: ListAllTimeTrackingsInputSchema,
67
+ annotations: {
68
+ readOnlyHint: true,
69
+ destructiveHint: false,
70
+ idempotentHint: true,
71
+ openWorldHint: true,
72
+ },
73
+ }, withErrorHandling(async (params) => {
74
+ const { page, response_format } = params;
75
+ const queryParams = {};
76
+ if (page > 1) {
77
+ queryParams.page = page;
78
+ }
79
+ const times = await makeApiRequest("team", "employees/times", "GET", undefined, queryParams);
80
+ const textContent = response_format === ResponseFormat.MARKDOWN
81
+ ? formatTimeTrackingsMarkdown(times)
82
+ : JSON.stringify(times, null, 2);
83
+ return {
84
+ content: [{ type: "text", text: textContent }],
85
+ structuredContent: { timeTrackings: times, count: times.length, page },
86
+ };
87
+ }));
88
+ // List Employee Time Trackings
89
+ server.registerTool("holded_team_list_employee_time_trackings", {
90
+ title: "List Holded Employee Time Trackings",
91
+ description: `List all time-trackings for a specific employee from Holded.
92
+
93
+ Args:
94
+ - employee_id (string): The employee ID (required)
95
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
96
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
97
+
98
+ Returns:
99
+ Array of time-trackings for the employee.`,
100
+ inputSchema: ListEmployeeTimeTrackingsInputSchema,
101
+ annotations: {
102
+ readOnlyHint: true,
103
+ destructiveHint: false,
104
+ idempotentHint: true,
105
+ openWorldHint: true,
106
+ },
107
+ }, withErrorHandling(async (params) => {
108
+ const { employee_id, page, response_format } = params;
109
+ const queryParams = {};
110
+ if (page > 1) {
111
+ queryParams.page = page;
112
+ }
113
+ const times = await makeApiRequest("team", `employees/${employee_id}/times`, "GET", undefined, queryParams);
114
+ const textContent = response_format === ResponseFormat.MARKDOWN
115
+ ? formatTimeTrackingsMarkdown(times)
116
+ : JSON.stringify(times, null, 2);
117
+ return {
118
+ content: [{ type: "text", text: textContent }],
119
+ structuredContent: { timeTrackings: times, count: times.length, page },
120
+ };
121
+ }));
122
+ // Get Time Tracking
123
+ server.registerTool("holded_team_get_time_tracking", {
124
+ title: "Get Holded Time Tracking",
125
+ description: `Get a specific time-tracking by ID from Holded.
126
+
127
+ Args:
128
+ - time_id (string): The time-tracking ID to retrieve (required)
129
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
130
+
131
+ Returns:
132
+ Time-tracking details including employee, date, hours, and description.`,
133
+ inputSchema: GetTimeTrackingInputSchema,
134
+ annotations: {
135
+ readOnlyHint: true,
136
+ destructiveHint: false,
137
+ idempotentHint: true,
138
+ openWorldHint: true,
139
+ },
140
+ }, withErrorHandling(async (params) => {
141
+ const { time_id, response_format } = params;
142
+ const time = await makeApiRequest("team", `employees/times/${time_id}`, "GET");
143
+ const textContent = response_format === ResponseFormat.MARKDOWN
144
+ ? formatTimeTrackingMarkdown(time)
145
+ : JSON.stringify(time, null, 2);
146
+ return {
147
+ content: [{ type: "text", text: textContent }],
148
+ structuredContent: toStructuredContent(time),
149
+ };
150
+ }));
151
+ // Create Employee Time Tracking
152
+ server.registerTool("holded_team_create_employee_time_tracking", {
153
+ title: "Create Holded Employee Time Tracking",
154
+ description: `Create a new time-tracking entry for an employee in Holded.
155
+
156
+ Args:
157
+ - employee_id (string): The employee ID (required)
158
+ - startTmp (string): Start time as Unix timestamp string (required)
159
+ - endTmp (string): End time as Unix timestamp string (required)
160
+
161
+ Returns:
162
+ The created time-tracking with its assigned ID.`,
163
+ inputSchema: CreateEmployeeTimeTrackingInputSchema,
164
+ annotations: {
165
+ readOnlyHint: false,
166
+ destructiveHint: false,
167
+ idempotentHint: false,
168
+ openWorldHint: true,
169
+ },
170
+ }, withErrorHandling(async (params) => {
171
+ const { employee_id, startTmp, endTmp } = params;
172
+ const time = await makeApiRequest("team", `employees/${employee_id}/times`, "POST", { startTmp, endTmp });
173
+ return {
174
+ content: [
175
+ {
176
+ type: "text",
177
+ text: `Time-tracking created successfully.\n\n${JSON.stringify(time, null, 2)}`,
178
+ },
179
+ ],
180
+ structuredContent: toStructuredContent(time),
181
+ };
182
+ }));
183
+ // Update Time Tracking
184
+ server.registerTool("holded_team_update_time_tracking", {
185
+ title: "Update Holded Time Tracking",
186
+ description: `Update an existing time-tracking in Holded.
187
+
188
+ Args:
189
+ - time_id (string): The time-tracking ID to update (required)
190
+ - startTmp (string): Start time as Unix timestamp string (required)
191
+ - endTmp (string): End time as Unix timestamp string (required)
192
+
193
+ Returns:
194
+ The updated time-tracking.`,
195
+ inputSchema: UpdateTimeTrackingInputSchema,
196
+ annotations: {
197
+ readOnlyHint: false,
198
+ destructiveHint: false,
199
+ idempotentHint: true,
200
+ openWorldHint: true,
201
+ },
202
+ }, withErrorHandling(async (params) => {
203
+ const { time_id, startTmp, endTmp } = params;
204
+ const time = await makeApiRequest("team", `employees/times/${time_id}`, "PUT", { startTmp, endTmp });
205
+ return {
206
+ content: [
207
+ {
208
+ type: "text",
209
+ text: `Time-tracking updated successfully.\n\n${JSON.stringify(time, null, 2)}`,
210
+ },
211
+ ],
212
+ structuredContent: toStructuredContent(time),
213
+ };
214
+ }));
215
+ // Delete Time Tracking
216
+ server.registerTool("holded_team_delete_time_tracking", {
217
+ title: "Delete Holded Time Tracking",
218
+ description: `Delete a time-tracking from Holded.
219
+
220
+ Args:
221
+ - time_id (string): The time-tracking ID to delete (required)
222
+
223
+ Returns:
224
+ Confirmation of deletion.`,
225
+ inputSchema: DeleteTimeTrackingInputSchema,
226
+ annotations: {
227
+ readOnlyHint: false,
228
+ destructiveHint: true,
229
+ idempotentHint: true,
230
+ openWorldHint: true,
231
+ },
232
+ }, withErrorHandling(async (params) => {
233
+ const { time_id } = params;
234
+ await makeApiRequest("team", `employees/times/${time_id}`, "DELETE");
235
+ return {
236
+ content: [
237
+ {
238
+ type: "text",
239
+ text: `Time-tracking ${time_id} deleted successfully.`,
240
+ },
241
+ ],
242
+ structuredContent: { deleted: true, id: time_id },
243
+ };
244
+ }));
245
+ // Employee Clock In
246
+ server.registerTool("holded_team_employee_clock_in", {
247
+ title: "Employee Clock In",
248
+ description: `Start counting employee time-tracking in Holded.
249
+
250
+ Args:
251
+ - employee_id (string): The employee ID to clock in (required)
252
+ - location (string): Location name (optional)
253
+
254
+ Returns:
255
+ Confirmation with status, info, and time-tracking ID.`,
256
+ inputSchema: EmployeeClockInInputSchema,
257
+ annotations: {
258
+ readOnlyHint: false,
259
+ destructiveHint: false,
260
+ idempotentHint: false,
261
+ openWorldHint: true,
262
+ },
263
+ }, withErrorHandling(async (params) => {
264
+ const { employee_id, location } = params;
265
+ const requestData = {};
266
+ if (location) {
267
+ requestData.location = location;
268
+ }
269
+ const result = await makeApiRequest("team", `employees/${employee_id}/times/clockin`, "POST", requestData);
270
+ return {
271
+ content: [
272
+ {
273
+ type: "text",
274
+ text: `Employee clocked in successfully.\n\n${JSON.stringify(result, null, 2)}`,
275
+ },
276
+ ],
277
+ structuredContent: { clockedIn: true, employeeId: employee_id, ...result },
278
+ };
279
+ }));
280
+ // Employee Clock Out
281
+ server.registerTool("holded_team_employee_clock_out", {
282
+ title: "Employee Clock Out",
283
+ description: `End counting employee time-tracking in Holded.
284
+
285
+ Args:
286
+ - employee_id (string): The employee ID to clock out (required)
287
+ - latitude (string): Latitude (e.g., -7.45556) (optional)
288
+ - longitude (string): Longitude (e.g., 55.55765) (optional)
289
+
290
+ Returns:
291
+ Confirmation with status, info, and time-tracking ID.`,
292
+ inputSchema: EmployeeClockOutInputSchema,
293
+ annotations: {
294
+ readOnlyHint: false,
295
+ destructiveHint: false,
296
+ idempotentHint: false,
297
+ openWorldHint: true,
298
+ },
299
+ }, withErrorHandling(async (params) => {
300
+ const { employee_id, latitude, longitude } = params;
301
+ const requestData = {};
302
+ if (latitude) {
303
+ requestData.latitude = latitude;
304
+ }
305
+ if (longitude) {
306
+ requestData.longitude = longitude;
307
+ }
308
+ const result = await makeApiRequest("team", `employees/${employee_id}/times/clockout`, "POST", requestData);
309
+ return {
310
+ content: [
311
+ {
312
+ type: "text",
313
+ text: `Employee clocked out successfully.\n\n${JSON.stringify(result, null, 2)}`,
314
+ },
315
+ ],
316
+ structuredContent: { clockedOut: true, employeeId: employee_id, ...result },
317
+ };
318
+ }));
319
+ // Employee Pause
320
+ server.registerTool("holded_team_employee_pause", {
321
+ title: "Employee Time-Tracking Pause",
322
+ description: `Pause employee time-tracking in Holded.
323
+
324
+ Args:
325
+ - employee_id (string): The employee ID to pause (required)
326
+ - latitude (string): Latitude (e.g., -7.45556) (optional)
327
+ - longitude (string): Longitude (e.g., 55.55765) (optional)
328
+
329
+ Returns:
330
+ Confirmation with status, info, and time-tracking ID.`,
331
+ inputSchema: EmployeePauseInputSchema,
332
+ annotations: {
333
+ readOnlyHint: false,
334
+ destructiveHint: false,
335
+ idempotentHint: false,
336
+ openWorldHint: true,
337
+ },
338
+ }, withErrorHandling(async (params) => {
339
+ const { employee_id, latitude, longitude } = params;
340
+ const requestData = {};
341
+ if (latitude) {
342
+ requestData.latitude = latitude;
343
+ }
344
+ if (longitude) {
345
+ requestData.longitude = longitude;
346
+ }
347
+ const result = await makeApiRequest("team", `employees/${employee_id}/times/pause`, "POST", requestData);
348
+ return {
349
+ content: [
350
+ {
351
+ type: "text",
352
+ text: `Employee time-tracking paused successfully.\n\n${JSON.stringify(result, null, 2)}`,
353
+ },
354
+ ],
355
+ structuredContent: { paused: true, employeeId: employee_id, ...result },
356
+ };
357
+ }));
358
+ // Employee Unpause
359
+ server.registerTool("holded_team_employee_unpause", {
360
+ title: "Employee Time-Tracking Unpause",
361
+ description: `Unpause employee time-tracking in Holded.
362
+
363
+ Args:
364
+ - employee_id (string): The employee ID to unpause (required)
365
+ - latitude (string): Latitude (e.g., -7.45556) (optional)
366
+ - longitude (string): Longitude (e.g., 55.55765) (optional)
367
+
368
+ Returns:
369
+ Confirmation with status, info, and time-tracking ID.`,
370
+ inputSchema: EmployeeUnpauseInputSchema,
371
+ annotations: {
372
+ readOnlyHint: false,
373
+ destructiveHint: false,
374
+ idempotentHint: false,
375
+ openWorldHint: true,
376
+ },
377
+ }, withErrorHandling(async (params) => {
378
+ const { employee_id, latitude, longitude } = params;
379
+ const requestData = {};
380
+ if (latitude) {
381
+ requestData.latitude = latitude;
382
+ }
383
+ if (longitude) {
384
+ requestData.longitude = longitude;
385
+ }
386
+ const result = await makeApiRequest("team", `employees/${employee_id}/times/unpause`, "POST", requestData);
387
+ return {
388
+ content: [
389
+ {
390
+ type: "text",
391
+ text: `Employee time-tracking unpaused successfully.\n\n${JSON.stringify(result, null, 2)}`,
392
+ },
393
+ ],
394
+ structuredContent: { unpaused: true, employeeId: employee_id, ...result },
395
+ };
396
+ }));
397
+ }
398
+ //# sourceMappingURL=time-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-tracking.js","sourceRoot":"","sources":["../../../src/tools/team/time-tracking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Shared utilities for tool handlers
3
+ */
4
+ import { ResponseFormat } from "../constants.js";
5
+ /**
6
+ * Build a standard tool response with both text and structured content.
7
+ *
8
+ * @param data - The response data
9
+ * @param format - MARKDOWN or JSON
10
+ * @param formatter - Function that renders data as markdown text
11
+ * @returns MCP tool result with content and structuredContent
12
+ */
13
+ export declare function buildToolResponse<T>(data: T, format: ResponseFormat, formatter: (data: T) => string, structuredContent?: Record<string, unknown>): {
14
+ content: {
15
+ type: "text";
16
+ text: string;
17
+ }[];
18
+ structuredContent: Record<string, unknown>;
19
+ };
20
+ /**
21
+ * Tool result type returned by MCP tool handlers.
22
+ */
23
+ export interface ToolResult {
24
+ [key: string]: unknown;
25
+ content: {
26
+ type: "text";
27
+ text: string;
28
+ }[];
29
+ structuredContent?: Record<string, unknown>;
30
+ isError?: boolean;
31
+ }
32
+ /**
33
+ * Wrap a tool handler in try/catch error handling.
34
+ *
35
+ * On success returns the handler's result.
36
+ * On error returns a user-friendly error message with isError: true.
37
+ */
38
+ export declare function withErrorHandling(handler: (params: Record<string, unknown>) => Promise<ToolResult>): (input: unknown) => Promise<ToolResult>;
39
+ /**
40
+ * Convert top-level snake_case keys to camelCase.
41
+ * Does NOT recurse into nested objects.
42
+ * Preserves keys that are already camelCase.
43
+ */
44
+ export declare function snakeToCamel(obj: Record<string, unknown>): Record<string, unknown>;
45
+ //# sourceMappingURL=utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../src/tools/utilities.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC1C;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAU3F;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IAEzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,GAChE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CAAC,CAWzC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzB"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Shared utilities for tool handlers
3
+ */
4
+ import { ResponseFormat } from "../constants.js";
5
+ import { handleApiError, toStructuredContent } from "../services/api.js";
6
+ /**
7
+ * Build a standard tool response with both text and structured content.
8
+ *
9
+ * @param data - The response data
10
+ * @param format - MARKDOWN or JSON
11
+ * @param formatter - Function that renders data as markdown text
12
+ * @returns MCP tool result with content and structuredContent
13
+ */
14
+ export function buildToolResponse(data, format, formatter, structuredContent) {
15
+ const text = format === ResponseFormat.MARKDOWN
16
+ ? formatter(data)
17
+ : JSON.stringify(data, null, 2);
18
+ return {
19
+ content: [{ type: "text", text }],
20
+ structuredContent: structuredContent ?? toStructuredContent(data),
21
+ };
22
+ }
23
+ /**
24
+ * Wrap a tool handler in try/catch error handling.
25
+ *
26
+ * On success returns the handler's result.
27
+ * On error returns a user-friendly error message with isError: true.
28
+ */
29
+ export function withErrorHandling(handler) {
30
+ return async (input) => {
31
+ try {
32
+ return await handler(input);
33
+ }
34
+ catch (error) {
35
+ return {
36
+ content: [{ type: "text", text: handleApiError(error) }],
37
+ isError: true,
38
+ };
39
+ }
40
+ };
41
+ }
42
+ /**
43
+ * Convert top-level snake_case keys to camelCase.
44
+ * Does NOT recurse into nested objects.
45
+ * Preserves keys that are already camelCase.
46
+ */
47
+ export function snakeToCamel(obj) {
48
+ const result = {};
49
+ for (const key of Object.keys(obj)) {
50
+ const camelKey = key.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
51
+ result[camelKey] = obj[key];
52
+ }
53
+ return result;
54
+ }
55
+ //# sourceMappingURL=utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../src/tools/utilities.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzE;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAO,EACP,MAAsB,EACtB,SAA8B,EAC9B,iBAA2C;IAE3C,MAAM,IAAI,GACR,MAAM,KAAK,cAAc,CAAC,QAAQ;QAChC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;QACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEpC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjC,iBAAiB,EAAE,iBAAiB,IAAK,mBAAmB,CAAC,IAAI,CAA6B;KAC/F,CAAC;AACJ,CAAC;AAaD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAiE;IAEjE,OAAO,KAAK,EAAE,KAAc,EAAuB,EAAE;QACnD,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,KAAgC,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,GAA4B;IAE5B,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}