@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,291 @@
1
+ /**
2
+ * Project 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 { ListProjectTimeTrackingsInputSchema, CreateProjectTimeTrackingInputSchema, UpdateProjectTimeTrackingInputSchema, DeleteProjectTimeTrackingInputSchema, GetProjectTimeTrackingInputSchema, ListAllProjectTimesInputSchema, } from "../../schemas/projects/time-tracking.js";
8
+ /**
9
+ * Format project time-trackings as markdown
10
+ */
11
+ export function formatProjectTimeTrackingsMarkdown(times) {
12
+ if (!times.length) {
13
+ return "No time-trackings found for this project.";
14
+ }
15
+ const lines = ["# Project Time Trackings", "", `Found ${times.length} time entries:`, ""];
16
+ for (const time of times) {
17
+ lines.push(`## Entry ${time.id}`);
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.employeeName)
22
+ lines.push(`- **Employee**: ${time.employeeName}`);
23
+ if (time.description)
24
+ lines.push(`- **Description**: ${time.description}`);
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
+ * Register all project time-tracking-related tools
35
+ */
36
+ export function registerProjectTimeTrackingTools(server) {
37
+ // List Project Time Trackings
38
+ server.registerTool("holded_projects_list_project_time_trackings", {
39
+ title: "List Holded Project Time Trackings",
40
+ description: `List all time-trackings for a specific project from Holded.
41
+
42
+ Args:
43
+ - project_id (string): The project ID (required)
44
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
45
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
46
+
47
+ Returns:
48
+ Array of time-trackings for the project.`,
49
+ inputSchema: ListProjectTimeTrackingsInputSchema,
50
+ annotations: {
51
+ readOnlyHint: true,
52
+ destructiveHint: false,
53
+ idempotentHint: true,
54
+ openWorldHint: true,
55
+ },
56
+ }, withErrorHandling(async (params) => {
57
+ const { project_id, page, response_format } = params;
58
+ const queryParams = {};
59
+ if (page > 1) {
60
+ queryParams.page = page;
61
+ }
62
+ const times = await makeApiRequest("projects", `projects/${project_id}/times`, "GET", undefined, queryParams);
63
+ const textContent = response_format === ResponseFormat.MARKDOWN
64
+ ? formatProjectTimeTrackingsMarkdown(times)
65
+ : JSON.stringify(times, null, 2);
66
+ return {
67
+ content: [{ type: "text", text: textContent }],
68
+ structuredContent: { timeTrackings: times, count: times.length, page },
69
+ };
70
+ }));
71
+ // Create Project Time Tracking
72
+ server.registerTool("holded_projects_create_project_time_tracking", {
73
+ title: "Create Holded Project Time Tracking",
74
+ description: `Create a new time-tracking entry for a project in Holded.
75
+
76
+ Args:
77
+ - project_id (string): The project ID (required)
78
+ - duration (number): Duration in seconds (required)
79
+ - costHour (number): Cost per hour (required)
80
+ - desc (string): Description of work (optional)
81
+ - userId (string): User/Employee ID (optional)
82
+ - taskId (string): Task ID (optional)
83
+
84
+ Returns:
85
+ The created time-tracking with its assigned ID.`,
86
+ inputSchema: CreateProjectTimeTrackingInputSchema,
87
+ annotations: {
88
+ readOnlyHint: false,
89
+ destructiveHint: false,
90
+ idempotentHint: false,
91
+ openWorldHint: true,
92
+ },
93
+ }, withErrorHandling(async (params) => {
94
+ const { project_id, ...timeData } = params;
95
+ const time = await makeApiRequest("projects", `projects/${project_id}/times`, "POST", timeData);
96
+ return {
97
+ content: [
98
+ {
99
+ type: "text",
100
+ text: `Project time-tracking created successfully.\n\n${JSON.stringify(time, null, 2)}`,
101
+ },
102
+ ],
103
+ structuredContent: toStructuredContent(time),
104
+ };
105
+ }));
106
+ // Update Project Time Tracking
107
+ server.registerTool("holded_projects_update_project_time_tracking", {
108
+ title: "Update Holded Project Time Tracking",
109
+ description: `Update an existing time-tracking entry for a project in Holded.
110
+
111
+ Args:
112
+ - project_id (string): The project ID (required)
113
+ - time_id (string): The time-tracking ID to update (required)
114
+ - duration (number): Duration in seconds (optional)
115
+ - costHour (number): Cost per hour (optional)
116
+ - desc (string): Description of work (optional)
117
+ - userId (string): User/Employee ID (optional)
118
+ - taskId (string): Task ID (optional)
119
+
120
+ Returns:
121
+ The updated time-tracking.`,
122
+ inputSchema: UpdateProjectTimeTrackingInputSchema,
123
+ annotations: {
124
+ readOnlyHint: false,
125
+ destructiveHint: false,
126
+ idempotentHint: true,
127
+ openWorldHint: true,
128
+ },
129
+ }, withErrorHandling(async (params) => {
130
+ const { project_id, time_id, ...updateData } = params;
131
+ const time = await makeApiRequest("projects", `projects/${project_id}/times/${time_id}`, "PUT", updateData);
132
+ return {
133
+ content: [
134
+ {
135
+ type: "text",
136
+ text: `Project time-tracking updated successfully.\n\n${JSON.stringify(time, null, 2)}`,
137
+ },
138
+ ],
139
+ structuredContent: toStructuredContent(time),
140
+ };
141
+ }));
142
+ // Delete Project Time Tracking
143
+ server.registerTool("holded_projects_delete_project_time_tracking", {
144
+ title: "Delete Holded Project Time Tracking",
145
+ description: `Delete a time-tracking entry from a project in Holded.
146
+
147
+ Args:
148
+ - project_id (string): The project ID (required)
149
+ - time_id (string): The time-tracking ID to delete (required)
150
+
151
+ Returns:
152
+ Confirmation of deletion.`,
153
+ inputSchema: DeleteProjectTimeTrackingInputSchema,
154
+ annotations: {
155
+ readOnlyHint: false,
156
+ destructiveHint: true,
157
+ idempotentHint: true,
158
+ openWorldHint: true,
159
+ },
160
+ }, withErrorHandling(async (params) => {
161
+ const { project_id, time_id } = params;
162
+ await makeApiRequest("projects", `projects/${project_id}/times/${time_id}`, "DELETE");
163
+ return {
164
+ content: [
165
+ {
166
+ type: "text",
167
+ text: `Project time-tracking ${time_id} deleted successfully.`,
168
+ },
169
+ ],
170
+ structuredContent: { deleted: true, id: time_id, projectId: project_id },
171
+ };
172
+ }));
173
+ // Get Project Time Tracking
174
+ server.registerTool("holded_projects_get_project_time_tracking", {
175
+ title: "Get Holded Project Time Tracking",
176
+ description: `Get a specific time-tracking entry for a project from Holded.
177
+
178
+ Args:
179
+ - project_id (string): The project ID (required)
180
+ - time_id (string): The time-tracking ID to retrieve (required)
181
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
182
+
183
+ Returns:
184
+ Time-tracking details including duration, description, cost, and other fields.`,
185
+ inputSchema: GetProjectTimeTrackingInputSchema,
186
+ annotations: {
187
+ readOnlyHint: true,
188
+ destructiveHint: false,
189
+ idempotentHint: true,
190
+ openWorldHint: true,
191
+ },
192
+ }, withErrorHandling(async (params) => {
193
+ const { project_id, time_id, response_format } = params;
194
+ const time = await makeApiRequest("projects", `projects/${project_id}/times/${time_id}`, "GET");
195
+ let textContent;
196
+ if (response_format === ResponseFormat.MARKDOWN) {
197
+ const lines = [`# Time Tracking Entry ${time.id}`, ""];
198
+ if (time.date)
199
+ lines.push(`- **Date**: ${new Date(time.date * 1000).toLocaleDateString()}`);
200
+ if (time.hours !== undefined)
201
+ lines.push(`- **Hours**: ${time.hours}`);
202
+ if (time.duration !== undefined)
203
+ lines.push(`- **Duration**: ${time.duration} seconds`);
204
+ if (time.description)
205
+ lines.push(`- **Description**: ${time.description}`);
206
+ if (time.employeeName)
207
+ lines.push(`- **Employee**: ${time.employeeName}`);
208
+ if (time.taskName)
209
+ lines.push(`- **Task**: ${time.taskName}`);
210
+ if (time.costHour !== undefined)
211
+ lines.push(`- **Cost/Hour**: ${time.costHour}`);
212
+ if (time.total !== undefined)
213
+ lines.push(`- **Total**: ${time.total}`);
214
+ if (time.billable !== undefined)
215
+ lines.push(`- **Billable**: ${time.billable ? "Yes" : "No"}`);
216
+ textContent = lines.join("\n");
217
+ }
218
+ else {
219
+ textContent = JSON.stringify(time, null, 2);
220
+ }
221
+ return {
222
+ content: [{ type: "text", text: textContent }],
223
+ structuredContent: toStructuredContent(time),
224
+ };
225
+ }));
226
+ // List All Project Times
227
+ server.registerTool("holded_projects_list_all_times", {
228
+ title: "List All Holded Project Times",
229
+ description: `List time trackings in projects not archived from 18 months on.
230
+
231
+ Args:
232
+ - start (number): Start date as Unix timestamp (optional)
233
+ - end (number): End date as Unix timestamp (optional)
234
+ - archived (boolean): Include archived projects (optional)
235
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
236
+
237
+ Returns:
238
+ Array of projects with their time-tracking entries.`,
239
+ inputSchema: ListAllProjectTimesInputSchema,
240
+ annotations: {
241
+ readOnlyHint: true,
242
+ destructiveHint: false,
243
+ idempotentHint: true,
244
+ openWorldHint: true,
245
+ },
246
+ }, withErrorHandling(async (params) => {
247
+ const { start, end, archived, response_format } = params;
248
+ const queryParams = {};
249
+ if (start !== undefined) {
250
+ queryParams.start = start;
251
+ }
252
+ if (end !== undefined) {
253
+ queryParams.end = end;
254
+ }
255
+ if (archived !== undefined) {
256
+ queryParams.archived = archived;
257
+ }
258
+ const projects = await makeApiRequest("projects", "projects/times", "GET", undefined, queryParams);
259
+ let textContent;
260
+ if (response_format === ResponseFormat.MARKDOWN) {
261
+ if (!projects.length) {
262
+ textContent = "No project times found.";
263
+ }
264
+ else {
265
+ const lines = ["# All Project Times", "", `Found ${projects.length} projects:`, ""];
266
+ for (const project of projects) {
267
+ lines.push(`## ${project.name} (${project.id})`);
268
+ if (project.timeTracking && project.timeTracking.length > 0) {
269
+ lines.push(`**Time Entries**: ${project.timeTracking.length}`);
270
+ for (const time of project.timeTracking) {
271
+ lines.push(`- ${time.desc || "Time entry"} (${time.duration}s, ${time.total || 0} total)`);
272
+ }
273
+ }
274
+ else {
275
+ lines.push("No time entries");
276
+ }
277
+ lines.push("");
278
+ }
279
+ textContent = lines.join("\n");
280
+ }
281
+ }
282
+ else {
283
+ textContent = JSON.stringify(projects, null, 2);
284
+ }
285
+ return {
286
+ content: [{ type: "text", text: textContent }],
287
+ structuredContent: { projects, count: projects.length },
288
+ };
289
+ }));
290
+ }
291
+ //# sourceMappingURL=time-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-tracking.js","sourceRoot":"","sources":["../../../src/tools/projects/time-tracking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Employee tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { Employee } from "../../types.js";
6
+ /**
7
+ * Format employees as markdown
8
+ */
9
+ export declare function formatEmployeesMarkdown(employees: Employee[]): string;
10
+ /**
11
+ * Format a single employee as markdown
12
+ */
13
+ export declare function formatEmployeeMarkdown(employee: Employee): string;
14
+ /**
15
+ * Register all employee-related tools
16
+ */
17
+ export declare function registerEmployeeTools(server: McpServer): void;
18
+ //# sourceMappingURL=employees.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"employees.d.ts","sourceRoot":"","sources":["../../../src/tools/team/employees.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAU1C;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAoBrE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAWjE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6F7D"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Employee tools for Holded API
3
+ */
4
+ import { ListEmployeesInputSchema, GetEmployeeInputSchema, CreateEmployeeInputSchema, UpdateEmployeeInputSchema, DeleteEmployeeInputSchema, } from "../../schemas/team/employees.js";
5
+ import { registerCrudTools } from "../factory.js";
6
+ /**
7
+ * Format employees as markdown
8
+ */
9
+ export function formatEmployeesMarkdown(employees) {
10
+ if (!employees.length) {
11
+ return "No employees found.";
12
+ }
13
+ const lines = ["# Employees", "", `Found ${employees.length} employees:`, ""];
14
+ for (const employee of employees) {
15
+ lines.push(`## ${employee.name}`);
16
+ lines.push(`- **ID**: ${employee.id}`);
17
+ if (employee.email)
18
+ lines.push(`- **Email**: ${employee.email}`);
19
+ if (employee.phone)
20
+ lines.push(`- **Phone**: ${employee.phone}`);
21
+ if (employee.position)
22
+ lines.push(`- **Position**: ${employee.position}`);
23
+ if (employee.department)
24
+ lines.push(`- **Department**: ${employee.department}`);
25
+ if (employee.status)
26
+ lines.push(`- **Status**: ${employee.status}`);
27
+ if (employee.hireDate)
28
+ lines.push(`- **Hire Date**: ${new Date(employee.hireDate * 1000).toLocaleDateString()}`);
29
+ lines.push("");
30
+ }
31
+ return lines.join("\n");
32
+ }
33
+ /**
34
+ * Format a single employee as markdown
35
+ */
36
+ export function formatEmployeeMarkdown(employee) {
37
+ const lines = [`# ${employee.name}`, "", `**ID**: ${employee.id}`, ""];
38
+ if (employee.email)
39
+ lines.push(`- **Email**: ${employee.email}`);
40
+ if (employee.phone)
41
+ lines.push(`- **Phone**: ${employee.phone}`);
42
+ if (employee.position)
43
+ lines.push(`- **Position**: ${employee.position}`);
44
+ if (employee.department)
45
+ lines.push(`- **Department**: ${employee.department}`);
46
+ if (employee.status)
47
+ lines.push(`- **Status**: ${employee.status}`);
48
+ if (employee.hireDate)
49
+ lines.push(`- **Hire Date**: ${new Date(employee.hireDate * 1000).toLocaleDateString()}`);
50
+ return lines.join("\n");
51
+ }
52
+ /**
53
+ * Register all employee-related tools
54
+ */
55
+ export function registerEmployeeTools(server) {
56
+ registerCrudTools(server, {
57
+ module: "team",
58
+ toolPrefix: "holded_team",
59
+ resource: "employee",
60
+ resourcePlural: "employees",
61
+ endpoint: "employees",
62
+ idParam: "employee_id",
63
+ schemas: {
64
+ list: ListEmployeesInputSchema,
65
+ get: GetEmployeeInputSchema,
66
+ create: CreateEmployeeInputSchema,
67
+ update: UpdateEmployeeInputSchema,
68
+ delete: DeleteEmployeeInputSchema,
69
+ },
70
+ titles: {
71
+ list: "List Holded Employees",
72
+ get: "Get Holded Employee",
73
+ create: "Create Holded Employee",
74
+ update: "Update Holded Employee",
75
+ delete: "Delete Holded Employee",
76
+ },
77
+ descriptions: {
78
+ list: `List all employees from Holded.
79
+
80
+ Args:
81
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
82
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
83
+
84
+ Returns:
85
+ Array of employees with id, name, email, position, department, and status.`,
86
+ get: `Get a specific employee by ID from Holded.
87
+
88
+ Args:
89
+ - employee_id (string): The employee ID to retrieve (required)
90
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
91
+
92
+ Returns:
93
+ Employee details including name, email, position, department, and status.`,
94
+ create: `Create a new employee in Holded.
95
+
96
+ According to Holded Team API v1.0.1, employee creation supports:
97
+ - name (string): Employee name (required)
98
+ - lastName (string): Employee last name (required)
99
+ - email (string): Email address (required)
100
+ - sendInvite (boolean): Whether to send invitation email to the employee (optional)
101
+
102
+ Additional fields like phone, position, department should be set via Update Employee after creation.
103
+
104
+ Returns:
105
+ The created employee with its assigned ID.`,
106
+ update: `Update an existing employee in Holded.
107
+
108
+ Args:
109
+ - employee_id (string): The employee ID to update (required)
110
+ - name (string): Employee name
111
+ - lastName (string): Employee last name
112
+ - mainEmail (string): Main email address
113
+ - email (string): Email address
114
+ - nationality (string): Nationality
115
+ - phone (string): Phone number
116
+ - mobile (string): Mobile phone number
117
+ - dateOfBirth (string): Date of birth (dd/mm/yyyy)
118
+ - gender ('male' | 'female'): Gender
119
+ - mainLanguage (string): Main language
120
+ - iban (string): Bank IBAN
121
+ - timeOffPolicyId (string): Time off policy ID
122
+ - timeOffSupervisors (array): Array of supervisor employee IDs
123
+ - reportingTo (string): Reporting manager employee ID
124
+ - code (string): NIF/tax identification number
125
+ - socialSecurityNum (string): Social security number
126
+ - address (object): Address object with address, city, postalCode, province, country
127
+ - fiscalResidence (boolean): Fiscal residence (set to false to use fiscalAddress)
128
+ - fiscalAddress (object): Fiscal address (requires fiscalResidence to be false)
129
+ - workplace (string): Workplace ID
130
+ - teams (array): Array of team IDs
131
+ - holdedUserId (string): Holded user ID
132
+
133
+ Returns:
134
+ Confirmation with status, info, and employee ID.`,
135
+ delete: `Delete an employee from Holded.
136
+
137
+ Args:
138
+ - employee_id (string): The employee ID to delete (required)
139
+
140
+ Returns:
141
+ Confirmation of deletion.`,
142
+ },
143
+ formatters: {
144
+ list: formatEmployeesMarkdown,
145
+ single: formatEmployeeMarkdown,
146
+ },
147
+ });
148
+ }
149
+ //# sourceMappingURL=employees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"employees.js","sourceRoot":"","sources":["../../../src/tools/team/employees.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Team module tools registration
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ /**
6
+ * Register all team-related tools
7
+ */
8
+ export declare function registerTeamTools(server: McpServer): void;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/team/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAGzD"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Team module tools registration
3
+ */
4
+ import { registerEmployeeTools } from "./employees.js";
5
+ import { registerTimeTrackingTools } from "./time-tracking.js";
6
+ /**
7
+ * Register all team-related tools
8
+ */
9
+ export function registerTeamTools(server) {
10
+ registerEmployeeTools(server);
11
+ registerTimeTrackingTools(server);
12
+ }
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/team/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,yBAAyB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Time Tracking tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { TimeTracking } from "../../types.js";
6
+ /**
7
+ * Format time-trackings as markdown
8
+ */
9
+ export declare function formatTimeTrackingsMarkdown(times: TimeTracking[]): string;
10
+ /**
11
+ * Format a single time-tracking as markdown
12
+ */
13
+ export declare function formatTimeTrackingMarkdown(time: TimeTracking): string;
14
+ /**
15
+ * Register all time-tracking-related tools
16
+ */
17
+ export declare function registerTimeTrackingTools(server: McpServer): void;
18
+ //# sourceMappingURL=time-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-tracking.d.ts","sourceRoot":"","sources":["../../../src/tools/team/time-tracking.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAyB9C;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAoBzE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAWrE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgdjE"}