@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.
- package/LICENSE +21 -0
- package/README.md +1040 -0
- package/dist/constants.d.ts +60 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +72 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/accounting/account-balances.d.ts +19 -0
- package/dist/schemas/accounting/account-balances.d.ts.map +1 -0
- package/dist/schemas/accounting/account-balances.js +28 -0
- package/dist/schemas/accounting/account-balances.js.map +1 -0
- package/dist/schemas/accounting/accounts.d.ts +49 -0
- package/dist/schemas/accounting/accounts.d.ts.map +1 -0
- package/dist/schemas/accounting/accounts.js +50 -0
- package/dist/schemas/accounting/accounts.js.map +1 -0
- package/dist/schemas/accounting/daily-ledger.d.ts +45 -0
- package/dist/schemas/accounting/daily-ledger.d.ts.map +1 -0
- package/dist/schemas/accounting/daily-ledger.js +57 -0
- package/dist/schemas/accounting/daily-ledger.js.map +1 -0
- package/dist/schemas/common.d.ts +118 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +126 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/crm/bookings.d.ts +108 -0
- package/dist/schemas/crm/bookings.d.ts.map +1 -0
- package/dist/schemas/crm/bookings.js +96 -0
- package/dist/schemas/crm/bookings.js.map +1 -0
- package/dist/schemas/crm/events.d.ts +57 -0
- package/dist/schemas/crm/events.d.ts.map +1 -0
- package/dist/schemas/crm/events.js +53 -0
- package/dist/schemas/crm/events.js.map +1 -0
- package/dist/schemas/crm/funnels.d.ts +60 -0
- package/dist/schemas/crm/funnels.d.ts.map +1 -0
- package/dist/schemas/crm/funnels.js +48 -0
- package/dist/schemas/crm/funnels.js.map +1 -0
- package/dist/schemas/crm/leads.d.ts +146 -0
- package/dist/schemas/crm/leads.d.ts.map +1 -0
- package/dist/schemas/crm/leads.js +129 -0
- package/dist/schemas/crm/leads.js.map +1 -0
- package/dist/schemas/invoicing/contacts.d.ts +352 -0
- package/dist/schemas/invoicing/contacts.d.ts.map +1 -0
- package/dist/schemas/invoicing/contacts.js +187 -0
- package/dist/schemas/invoicing/contacts.js.map +1 -0
- package/dist/schemas/invoicing/documents.d.ts +424 -0
- package/dist/schemas/invoicing/documents.d.ts.map +1 -0
- package/dist/schemas/invoicing/documents.js +217 -0
- package/dist/schemas/invoicing/documents.js.map +1 -0
- package/dist/schemas/invoicing/expenses-accounts.d.ts +47 -0
- package/dist/schemas/invoicing/expenses-accounts.d.ts.map +1 -0
- package/dist/schemas/invoicing/expenses-accounts.js +43 -0
- package/dist/schemas/invoicing/expenses-accounts.js.map +1 -0
- package/dist/schemas/invoicing/numbering-series.d.ts +94 -0
- package/dist/schemas/invoicing/numbering-series.d.ts.map +1 -0
- package/dist/schemas/invoicing/numbering-series.js +43 -0
- package/dist/schemas/invoicing/numbering-series.js.map +1 -0
- package/dist/schemas/invoicing/payments.d.ts +50 -0
- package/dist/schemas/invoicing/payments.d.ts.map +1 -0
- package/dist/schemas/invoicing/payments.js +46 -0
- package/dist/schemas/invoicing/payments.js.map +1 -0
- package/dist/schemas/invoicing/products.d.ts +176 -0
- package/dist/schemas/invoicing/products.d.ts.map +1 -0
- package/dist/schemas/invoicing/products.js +149 -0
- package/dist/schemas/invoicing/products.js.map +1 -0
- package/dist/schemas/invoicing/remittances.d.ts +21 -0
- package/dist/schemas/invoicing/remittances.d.ts.map +1 -0
- package/dist/schemas/invoicing/remittances.js +20 -0
- package/dist/schemas/invoicing/remittances.js.map +1 -0
- package/dist/schemas/invoicing/sales-channels.d.ts +45 -0
- package/dist/schemas/invoicing/sales-channels.d.ts.map +1 -0
- package/dist/schemas/invoicing/sales-channels.js +41 -0
- package/dist/schemas/invoicing/sales-channels.js.map +1 -0
- package/dist/schemas/invoicing/services.d.ts +55 -0
- package/dist/schemas/invoicing/services.d.ts.map +1 -0
- package/dist/schemas/invoicing/services.js +51 -0
- package/dist/schemas/invoicing/services.js.map +1 -0
- package/dist/schemas/invoicing/taxes.d.ts +12 -0
- package/dist/schemas/invoicing/taxes.d.ts.map +1 -0
- package/dist/schemas/invoicing/taxes.js +12 -0
- package/dist/schemas/invoicing/taxes.js.map +1 -0
- package/dist/schemas/invoicing/treasury.d.ts +42 -0
- package/dist/schemas/invoicing/treasury.d.ts.map +1 -0
- package/dist/schemas/invoicing/treasury.js +39 -0
- package/dist/schemas/invoicing/treasury.js.map +1 -0
- package/dist/schemas/invoicing/warehouses.d.ts +61 -0
- package/dist/schemas/invoicing/warehouses.d.ts.map +1 -0
- package/dist/schemas/invoicing/warehouses.js +43 -0
- package/dist/schemas/invoicing/warehouses.js.map +1 -0
- package/dist/schemas/projects/projects.d.ts +60 -0
- package/dist/schemas/projects/projects.d.ts.map +1 -0
- package/dist/schemas/projects/projects.js +55 -0
- package/dist/schemas/projects/projects.js.map +1 -0
- package/dist/schemas/projects/tasks.d.ts +68 -0
- package/dist/schemas/projects/tasks.d.ts.map +1 -0
- package/dist/schemas/projects/tasks.js +64 -0
- package/dist/schemas/projects/tasks.js.map +1 -0
- package/dist/schemas/projects/time-tracking.d.ts +80 -0
- package/dist/schemas/projects/time-tracking.d.ts.map +1 -0
- package/dist/schemas/projects/time-tracking.js +75 -0
- package/dist/schemas/projects/time-tracking.js.map +1 -0
- package/dist/schemas/team/employees.d.ts +135 -0
- package/dist/schemas/team/employees.d.ts.map +1 -0
- package/dist/schemas/team/employees.js +144 -0
- package/dist/schemas/team/employees.js.map +1 -0
- package/dist/schemas/team/time-tracking.d.ts +98 -0
- package/dist/schemas/team/time-tracking.d.ts.map +1 -0
- package/dist/schemas/team/time-tracking.js +89 -0
- package/dist/schemas/team/time-tracking.js.map +1 -0
- package/dist/services/api.d.ts +118 -0
- package/dist/services/api.d.ts.map +1 -0
- package/dist/services/api.js +441 -0
- package/dist/services/api.js.map +1 -0
- package/dist/tools/accounting/account-balances.d.ts +44 -0
- package/dist/tools/accounting/account-balances.d.ts.map +1 -0
- package/dist/tools/accounting/account-balances.js +240 -0
- package/dist/tools/accounting/account-balances.js.map +1 -0
- package/dist/tools/accounting/accounts.d.ts +18 -0
- package/dist/tools/accounting/accounts.d.ts.map +1 -0
- package/dist/tools/accounting/accounts.js +131 -0
- package/dist/tools/accounting/accounts.js.map +1 -0
- package/dist/tools/accounting/daily-ledger.d.ts +9 -0
- package/dist/tools/accounting/daily-ledger.d.ts.map +1 -0
- package/dist/tools/accounting/daily-ledger.js +117 -0
- package/dist/tools/accounting/daily-ledger.js.map +1 -0
- package/dist/tools/accounting/index.d.ts +9 -0
- package/dist/tools/accounting/index.d.ts.map +1 -0
- package/dist/tools/accounting/index.js +15 -0
- package/dist/tools/accounting/index.js.map +1 -0
- package/dist/tools/crm/bookings.d.ts +18 -0
- package/dist/tools/crm/bookings.d.ts.map +1 -0
- package/dist/tools/crm/bookings.js +272 -0
- package/dist/tools/crm/bookings.js.map +1 -0
- package/dist/tools/crm/events.d.ts +18 -0
- package/dist/tools/crm/events.d.ts.map +1 -0
- package/dist/tools/crm/events.js +134 -0
- package/dist/tools/crm/events.js.map +1 -0
- package/dist/tools/crm/funnels.d.ts +18 -0
- package/dist/tools/crm/funnels.d.ts.map +1 -0
- package/dist/tools/crm/funnels.js +113 -0
- package/dist/tools/crm/funnels.js.map +1 -0
- package/dist/tools/crm/index.d.ts +9 -0
- package/dist/tools/crm/index.d.ts.map +1 -0
- package/dist/tools/crm/index.js +17 -0
- package/dist/tools/crm/index.js.map +1 -0
- package/dist/tools/crm/leads.d.ts +18 -0
- package/dist/tools/crm/leads.d.ts.map +1 -0
- package/dist/tools/crm/leads.js +519 -0
- package/dist/tools/crm/leads.js.map +1 -0
- package/dist/tools/factory.d.ts +55 -0
- package/dist/tools/factory.d.ts.map +1 -0
- package/dist/tools/factory.js +145 -0
- package/dist/tools/factory.js.map +1 -0
- package/dist/tools/invoicing/contacts.d.ts +26 -0
- package/dist/tools/invoicing/contacts.d.ts.map +1 -0
- package/dist/tools/invoicing/contacts.js +358 -0
- package/dist/tools/invoicing/contacts.js.map +1 -0
- package/dist/tools/invoicing/documents.d.ts +18 -0
- package/dist/tools/invoicing/documents.d.ts.map +1 -0
- package/dist/tools/invoicing/documents.js +578 -0
- package/dist/tools/invoicing/documents.js.map +1 -0
- package/dist/tools/invoicing/expenses-accounts.d.ts +25 -0
- package/dist/tools/invoicing/expenses-accounts.d.ts.map +1 -0
- package/dist/tools/invoicing/expenses-accounts.js +111 -0
- package/dist/tools/invoicing/expenses-accounts.js.map +1 -0
- package/dist/tools/invoicing/index.d.ts +9 -0
- package/dist/tools/invoicing/index.d.ts.map +1 -0
- package/dist/tools/invoicing/index.js +33 -0
- package/dist/tools/invoicing/index.js.map +1 -0
- package/dist/tools/invoicing/numbering-series.d.ts +9 -0
- package/dist/tools/invoicing/numbering-series.d.ts.map +1 -0
- package/dist/tools/invoicing/numbering-series.js +161 -0
- package/dist/tools/invoicing/numbering-series.js.map +1 -0
- package/dist/tools/invoicing/payments.d.ts +18 -0
- package/dist/tools/invoicing/payments.d.ts.map +1 -0
- package/dist/tools/invoicing/payments.js +175 -0
- package/dist/tools/invoicing/payments.js.map +1 -0
- package/dist/tools/invoicing/products.d.ts +18 -0
- package/dist/tools/invoicing/products.d.ts.map +1 -0
- package/dist/tools/invoicing/products.js +389 -0
- package/dist/tools/invoicing/products.js.map +1 -0
- package/dist/tools/invoicing/remittances.d.ts +17 -0
- package/dist/tools/invoicing/remittances.d.ts.map +1 -0
- package/dist/tools/invoicing/remittances.js +76 -0
- package/dist/tools/invoicing/remittances.js.map +1 -0
- package/dist/tools/invoicing/sales-channels.d.ts +24 -0
- package/dist/tools/invoicing/sales-channels.d.ts.map +1 -0
- package/dist/tools/invoicing/sales-channels.js +105 -0
- package/dist/tools/invoicing/sales-channels.js.map +1 -0
- package/dist/tools/invoicing/services.d.ts +29 -0
- package/dist/tools/invoicing/services.d.ts.map +1 -0
- package/dist/tools/invoicing/services.js +124 -0
- package/dist/tools/invoicing/services.js.map +1 -0
- package/dist/tools/invoicing/taxes.d.ts +18 -0
- package/dist/tools/invoicing/taxes.d.ts.map +1 -0
- package/dist/tools/invoicing/taxes.js +58 -0
- package/dist/tools/invoicing/taxes.js.map +1 -0
- package/dist/tools/invoicing/treasury.d.ts +9 -0
- package/dist/tools/invoicing/treasury.d.ts.map +1 -0
- package/dist/tools/invoicing/treasury.js +196 -0
- package/dist/tools/invoicing/treasury.js.map +1 -0
- package/dist/tools/invoicing/warehouses.d.ts +18 -0
- package/dist/tools/invoicing/warehouses.d.ts.map +1 -0
- package/dist/tools/invoicing/warehouses.js +133 -0
- package/dist/tools/invoicing/warehouses.js.map +1 -0
- package/dist/tools/projects/index.d.ts +9 -0
- package/dist/tools/projects/index.d.ts.map +1 -0
- package/dist/tools/projects/index.js +15 -0
- package/dist/tools/projects/index.js.map +1 -0
- package/dist/tools/projects/projects.d.ts +18 -0
- package/dist/tools/projects/projects.d.ts.map +1 -0
- package/dist/tools/projects/projects.js +203 -0
- package/dist/tools/projects/projects.js.map +1 -0
- package/dist/tools/projects/tasks.d.ts +18 -0
- package/dist/tools/projects/tasks.d.ts.map +1 -0
- package/dist/tools/projects/tasks.js +154 -0
- package/dist/tools/projects/tasks.js.map +1 -0
- package/dist/tools/projects/time-tracking.d.ts +14 -0
- package/dist/tools/projects/time-tracking.d.ts.map +1 -0
- package/dist/tools/projects/time-tracking.js +291 -0
- package/dist/tools/projects/time-tracking.js.map +1 -0
- package/dist/tools/team/employees.d.ts +18 -0
- package/dist/tools/team/employees.d.ts.map +1 -0
- package/dist/tools/team/employees.js +149 -0
- package/dist/tools/team/employees.js.map +1 -0
- package/dist/tools/team/index.d.ts +9 -0
- package/dist/tools/team/index.d.ts.map +1 -0
- package/dist/tools/team/index.js +13 -0
- package/dist/tools/team/index.js.map +1 -0
- package/dist/tools/team/time-tracking.d.ts +18 -0
- package/dist/tools/team/time-tracking.d.ts.map +1 -0
- package/dist/tools/team/time-tracking.js +398 -0
- package/dist/tools/team/time-tracking.js.map +1 -0
- package/dist/tools/utilities.d.ts +45 -0
- package/dist/tools/utilities.d.ts.map +1 -0
- package/dist/tools/utilities.js +55 -0
- package/dist/tools/utilities.js.map +1 -0
- package/dist/types.d.ts +640 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +29 -0
- package/dist/types.js.map +1 -0
- 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"}
|