@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,272 @@
1
+ /**
2
+ * Booking tools for Holded API
3
+ */
4
+ import { makeApiRequest } from "../../services/api.js";
5
+ import { ResponseFormat } from "../../constants.js";
6
+ import { ListBookingsInputSchema, CreateBookingInputSchema, UpdateBookingInputSchema, GetBookingInputSchema, DeleteBookingInputSchema, ListBookingLocationsInputSchema, GetAvailableSlotsInputSchema, } from "../../schemas/crm/bookings.js";
7
+ import { registerCrudTools } from "../factory.js";
8
+ import { withErrorHandling } from "../utilities.js";
9
+ /**
10
+ * Format bookings as markdown
11
+ */
12
+ export function formatBookingsMarkdown(bookings) {
13
+ if (!bookings.length) {
14
+ return "No bookings found.";
15
+ }
16
+ const lines = ["# Bookings", "", `Found ${bookings.length} bookings:`, ""];
17
+ for (const booking of bookings) {
18
+ // Get service name for display
19
+ const serviceName = Array.isArray(booking.service)
20
+ ? booking.service[0]?.name
21
+ : booking.service?.name;
22
+ lines.push(`## ${serviceName || `Booking ${booking.id}`}`);
23
+ lines.push(`- **ID**: ${booking.id}`);
24
+ lines.push(`- **Start**: ${new Date(booking.startTime * 1000).toLocaleString()}`);
25
+ lines.push(`- **End**: ${new Date(booking.endTime * 1000).toLocaleString()}`);
26
+ lines.push(`- **Duration**: ${Math.round(booking.duration / 60)} min`);
27
+ if (booking.status)
28
+ lines.push(`- **Status**: ${booking.status}`);
29
+ // Get space name if available
30
+ const spaceName = Array.isArray(booking.space)
31
+ ? booking.space[0]?.name
32
+ : booking.space?.name;
33
+ if (spaceName)
34
+ lines.push(`- **Space**: ${spaceName}`);
35
+ lines.push("");
36
+ }
37
+ return lines.join("\n");
38
+ }
39
+ /**
40
+ * Format a single booking as markdown
41
+ */
42
+ export function formatBookingMarkdown(booking) {
43
+ // Get service name for display
44
+ const serviceName = Array.isArray(booking.service)
45
+ ? booking.service[0]?.name
46
+ : booking.service?.name;
47
+ const lines = [`# ${serviceName || `Booking ${booking.id}`}`, ""];
48
+ lines.push(`- **ID**: ${booking.id}`);
49
+ lines.push(`- **Start**: ${new Date(booking.startTime * 1000).toLocaleString()}`);
50
+ lines.push(`- **End**: ${new Date(booking.endTime * 1000).toLocaleString()}`);
51
+ lines.push(`- **Duration**: ${Math.round(booking.duration / 60)} min`);
52
+ if (booking.status)
53
+ lines.push(`- **Status**: ${booking.status}`);
54
+ // Get space info if available
55
+ const space = Array.isArray(booking.space) ? booking.space[0] : booking.space;
56
+ if (space)
57
+ lines.push(`- **Space**: ${space.name} (ID: ${space.id})`);
58
+ // Get service details
59
+ const service = Array.isArray(booking.service) ? booking.service[0] : booking.service;
60
+ if (service) {
61
+ lines.push("");
62
+ lines.push("### Service");
63
+ lines.push(`- **Name**: ${service.name}`);
64
+ if (service.description)
65
+ lines.push(`- **Description**: ${service.description}`);
66
+ // Handle array format for total (API may return as array or object)
67
+ if (service.total) {
68
+ const total = Array.isArray(service.total) ? service.total[0] : service.total;
69
+ if (total)
70
+ lines.push(`- **Total**: ${total.amount} ${total.currency}`);
71
+ }
72
+ }
73
+ // Show custom fields if available (handle both field names from API)
74
+ const customFieldsList = booking.customFieldsValues ?? booking.customFields;
75
+ if (customFieldsList?.length) {
76
+ lines.push("");
77
+ lines.push("### Custom Fields");
78
+ for (const field of customFieldsList) {
79
+ lines.push(`- **${field.label}**: ${field.value}`);
80
+ }
81
+ }
82
+ return lines.join("\n");
83
+ }
84
+ /**
85
+ * Register all booking-related tools
86
+ */
87
+ export function registerBookingTools(server) {
88
+ // ── Standard CRUD via factory ───────────────────────────
89
+ registerCrudTools(server, {
90
+ module: "crm",
91
+ toolPrefix: "holded_crm",
92
+ resource: "booking",
93
+ resourcePlural: "bookings",
94
+ endpoint: "bookings",
95
+ idParam: "booking_id",
96
+ schemas: {
97
+ list: ListBookingsInputSchema,
98
+ get: GetBookingInputSchema,
99
+ create: CreateBookingInputSchema,
100
+ update: UpdateBookingInputSchema,
101
+ delete: DeleteBookingInputSchema,
102
+ },
103
+ titles: {
104
+ list: "List Holded Bookings",
105
+ get: "Get Holded Booking",
106
+ create: "Create Holded Booking",
107
+ update: "Update Holded Booking",
108
+ delete: "Cancel Holded Booking",
109
+ },
110
+ descriptions: {
111
+ list: `List all bookings from Holded CRM.
112
+
113
+ Args:
114
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
115
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
116
+
117
+ Returns:
118
+ Array of bookings with id, startTime, endTime, duration, status, service, space, and customFieldsValues.`,
119
+ get: `Get a specific booking by ID from Holded CRM.
120
+
121
+ Args:
122
+ - booking_id (string): The booking ID to retrieve (required)
123
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
124
+
125
+ Returns:
126
+ Booking details including startTime, endTime, duration, status, service, space, outcome, and customFieldsValues.`,
127
+ create: `Create a new booking in Holded CRM.
128
+
129
+ Args:
130
+ - locationId (string): Location ID for the booking (required)
131
+ - serviceId (string): Service ID for the booking (required)
132
+ - dateTime (number): Booking date and time as Unix timestamp (required)
133
+ - timezone (string): Timezone (e.g., 'Europe/Luxembourg') (required)
134
+ - language (string): Language code (e.g., 'es', 'en') (required)
135
+ - customFields (array): Array of custom fields with key-value pairs (required)
136
+ Typically includes:
137
+ - key: "name", value: customer name
138
+ - key: "email", value: customer email
139
+
140
+ Returns:
141
+ The created booking with status and id.`,
142
+ update: `Update an existing booking in Holded CRM. Only the params included in the operation will update the booking.
143
+
144
+ Args:
145
+ - booking_id (string): The booking ID to update (required)
146
+ - dateTime (number): Booking date and time as Unix timestamp (optional)
147
+ - customFields (array): Array of custom fields with key-value pairs (optional)
148
+ Each custom field should have:
149
+ - key (string): Custom field key
150
+ - value (string): Custom field value
151
+
152
+ Returns:
153
+ Confirmation with status and booking ID.`,
154
+ delete: `Cancel a booking in Holded CRM.
155
+
156
+ Note: This endpoint cancels the booking (the Holded API calls this operation "Cancel Booking").
157
+
158
+ Args:
159
+ - booking_id (string): The booking ID to cancel (required)
160
+
161
+ Returns:
162
+ Confirmation of deletion.`,
163
+ },
164
+ formatters: {
165
+ list: formatBookingsMarkdown,
166
+ single: formatBookingMarkdown,
167
+ },
168
+ });
169
+ // ── Manual tools (non-standard endpoints) ───────────────
170
+ // List Booking Locations
171
+ server.registerTool("holded_crm_list_booking_locations", {
172
+ title: "List Holded Booking Locations",
173
+ description: `List all booking locations from Holded CRM.
174
+
175
+ Args:
176
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
177
+
178
+ Returns:
179
+ Array of booking locations with id, name, description, active status, and availableServices.`,
180
+ inputSchema: ListBookingLocationsInputSchema,
181
+ annotations: {
182
+ readOnlyHint: true,
183
+ destructiveHint: false,
184
+ idempotentHint: true,
185
+ openWorldHint: true,
186
+ },
187
+ }, withErrorHandling(async (params) => {
188
+ const typedParams = params;
189
+ const locations = await makeApiRequest("crm", "bookings/locations", "GET");
190
+ let textContent;
191
+ if (typedParams.response_format === ResponseFormat.MARKDOWN) {
192
+ if (!locations.length) {
193
+ textContent = "No booking locations found.";
194
+ }
195
+ else {
196
+ const lines = ["# Booking Locations", "", `Found ${locations.length} locations:`, ""];
197
+ for (const loc of locations) {
198
+ lines.push(`## ${loc.name}`);
199
+ lines.push(`- **ID**: ${loc.id}`);
200
+ if (loc.description)
201
+ lines.push(`- **Description**: ${loc.description}`);
202
+ lines.push(`- **Active**: ${loc.active ? "Yes" : "No"}`);
203
+ if (loc.availableServices?.length) {
204
+ lines.push(`- **Available Services**: ${loc.availableServices.length} service(s)`);
205
+ for (const serviceId of loc.availableServices) {
206
+ lines.push(` - ${serviceId}`);
207
+ }
208
+ }
209
+ lines.push("");
210
+ }
211
+ textContent = lines.join("\n");
212
+ }
213
+ }
214
+ else {
215
+ textContent = JSON.stringify(locations, null, 2);
216
+ }
217
+ return {
218
+ content: [{ type: "text", text: textContent }],
219
+ structuredContent: { locations, count: locations.length },
220
+ };
221
+ }));
222
+ // Get Available Slots
223
+ server.registerTool("holded_crm_get_available_slots", {
224
+ title: "Get Holded Available Booking Slots",
225
+ description: `Get available time slots for a specific booking location from Holded CRM.
226
+
227
+ Args:
228
+ - location_id (string): The location ID (required)
229
+ - serviceId (string): Service ID (required)
230
+ - day (string): Day in yyyy-mm-dd format (required)
231
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
232
+
233
+ Returns:
234
+ Array of available time slots for the location with dateTime, from, to, and duration.`,
235
+ inputSchema: GetAvailableSlotsInputSchema,
236
+ annotations: {
237
+ readOnlyHint: true,
238
+ destructiveHint: false,
239
+ idempotentHint: true,
240
+ openWorldHint: true,
241
+ },
242
+ }, withErrorHandling(async (params) => {
243
+ const typedParams = params;
244
+ // API requires serviceId and day as query parameters
245
+ const queryParams = {
246
+ serviceId: typedParams.serviceId,
247
+ day: typedParams.day,
248
+ };
249
+ const slots = await makeApiRequest("crm", `bookings/locations/${typedParams.location_id}/slots`, "GET", undefined, queryParams);
250
+ let textContent;
251
+ if (typedParams.response_format === ResponseFormat.MARKDOWN) {
252
+ if (!slots.length) {
253
+ textContent = "No available slots found for this location.";
254
+ }
255
+ else {
256
+ const lines = ["# Available Booking Slots", "", `Found ${slots.length} slots:`, ""];
257
+ for (const slot of slots) {
258
+ lines.push(`- **${slot.from}** to **${slot.to}** (${Math.round(slot.duration / 60)} min)`);
259
+ }
260
+ textContent = lines.join("\n");
261
+ }
262
+ }
263
+ else {
264
+ textContent = JSON.stringify(slots, null, 2);
265
+ }
266
+ return {
267
+ content: [{ type: "text", text: textContent }],
268
+ structuredContent: { slots, count: slots.length, locationId: typedParams.location_id },
269
+ };
270
+ }));
271
+ }
272
+ //# sourceMappingURL=bookings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bookings.js","sourceRoot":"","sources":["../../../src/tools/crm/bookings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Event tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { CrmEvent } from "../../types.js";
6
+ /**
7
+ * Format events as markdown
8
+ */
9
+ export declare function formatEventsMarkdown(events: CrmEvent[]): string;
10
+ /**
11
+ * Format a single event as markdown
12
+ */
13
+ export declare function formatEventMarkdown(event: CrmEvent): string;
14
+ /**
15
+ * Register all event-related tools
16
+ */
17
+ export declare function registerEventTools(server: McpServer): void;
18
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/tools/crm/events.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,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAkB/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAY3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiF1D"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Event tools for Holded API
3
+ */
4
+ import { ListEventsInputSchema, GetEventInputSchema, CreateEventInputSchema, UpdateEventInputSchema, DeleteEventInputSchema, } from "../../schemas/crm/events.js";
5
+ import { registerCrudTools } from "../factory.js";
6
+ /**
7
+ * Format events as markdown
8
+ */
9
+ export function formatEventsMarkdown(events) {
10
+ if (!events.length) {
11
+ return "No events found.";
12
+ }
13
+ const lines = ["# Events", "", `Found ${events.length} events:`, ""];
14
+ for (const event of events) {
15
+ lines.push(`## ${event.name}`);
16
+ lines.push(`- **ID**: ${event.id}`);
17
+ lines.push(`- **Start**: ${new Date(event.start * 1000).toLocaleString()}`);
18
+ if (event.end)
19
+ lines.push(`- **End**: ${new Date(event.end * 1000).toLocaleString()}`);
20
+ if (event.leadId)
21
+ lines.push(`- **Lead ID**: ${event.leadId}`);
22
+ if (event.contactId)
23
+ lines.push(`- **Contact ID**: ${event.contactId}`);
24
+ lines.push("");
25
+ }
26
+ return lines.join("\n");
27
+ }
28
+ /**
29
+ * Format a single event as markdown
30
+ */
31
+ export function formatEventMarkdown(event) {
32
+ const lines = [`# ${event.name}`, ""];
33
+ lines.push(`- **ID**: ${event.id}`);
34
+ lines.push(`- **Start**: ${new Date(event.start * 1000).toLocaleString()}`);
35
+ if (event.end)
36
+ lines.push(`- **End**: ${new Date(event.end * 1000).toLocaleString()}`);
37
+ if (event.allDay !== undefined)
38
+ lines.push(`- **All Day**: ${event.allDay ? "Yes" : "No"}`);
39
+ if (event.description)
40
+ lines.push(`- **Description**: ${event.description}`);
41
+ if (event.leadId)
42
+ lines.push(`- **Lead ID**: ${event.leadId}`);
43
+ if (event.contactId)
44
+ lines.push(`- **Contact ID**: ${event.contactId}`);
45
+ if (event.assignedTo)
46
+ lines.push(`- **Assigned To**: ${event.assignedTo}`);
47
+ return lines.join("\n");
48
+ }
49
+ /**
50
+ * Register all event-related tools
51
+ */
52
+ export function registerEventTools(server) {
53
+ registerCrudTools(server, {
54
+ module: "crm",
55
+ toolPrefix: "holded_crm",
56
+ resource: "event",
57
+ resourcePlural: "events",
58
+ endpoint: "events",
59
+ idParam: "event_id",
60
+ schemas: {
61
+ list: ListEventsInputSchema,
62
+ get: GetEventInputSchema,
63
+ create: CreateEventInputSchema,
64
+ update: UpdateEventInputSchema,
65
+ delete: DeleteEventInputSchema,
66
+ },
67
+ titles: {
68
+ list: "List Holded Events",
69
+ get: "Get Holded Event",
70
+ create: "Create Holded Event",
71
+ update: "Update Holded Event",
72
+ delete: "Delete Holded Event",
73
+ },
74
+ descriptions: {
75
+ list: `List all events from Holded CRM.
76
+
77
+ Args:
78
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
79
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
80
+
81
+ Returns:
82
+ Array of events with id, name, start, end, and associated lead/contact.`,
83
+ get: `Get a specific event by ID from Holded CRM.
84
+
85
+ Args:
86
+ - event_id (string): The event ID to retrieve (required)
87
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
88
+
89
+ Returns:
90
+ Event details including start, end, description, and associated entities.`,
91
+ create: `Create a new event in Holded CRM.
92
+
93
+ Args:
94
+ - name (string): Event name (required)
95
+ - start (number): Start time as Unix timestamp (required)
96
+ - end (number): End time as Unix timestamp
97
+ - allDay (boolean): Whether the event is all-day
98
+ - description (string): Event description
99
+ - leadId (string): Associated lead ID
100
+ - contactId (string): Associated contact ID
101
+ - assignedTo (string): User ID to assign the event to
102
+
103
+ Returns:
104
+ The created event with its assigned ID.`,
105
+ update: `Update an existing event in Holded CRM.
106
+
107
+ Args:
108
+ - event_id (string): The event ID to update (required)
109
+ - name (string): Event name
110
+ - start (number): Start time as Unix timestamp
111
+ - end (number): End time as Unix timestamp
112
+ - allDay (boolean): Whether the event is all-day
113
+ - description (string): Event description
114
+ - leadId (string): Associated lead ID
115
+ - contactId (string): Associated contact ID
116
+ - assignedTo (string): User ID to assign the event to
117
+
118
+ Returns:
119
+ The updated event.`,
120
+ delete: `Delete an event from Holded CRM.
121
+
122
+ Args:
123
+ - event_id (string): The event ID to delete (required)
124
+
125
+ Returns:
126
+ Confirmation of deletion.`,
127
+ },
128
+ formatters: {
129
+ list: formatEventsMarkdown,
130
+ single: formatEventMarkdown,
131
+ },
132
+ });
133
+ }
134
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/tools/crm/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAkB;IACrD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,SAAS,MAAM,CAAC,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAErE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI,KAAK,CAAC,GAAG;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACvF,IAAI,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,IAAI,KAAK,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAe;IACjD,MAAM,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACvF,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5F,IAAI,KAAK,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7E,IAAI,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,IAAI,KAAK,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IACxE,IAAI,KAAK,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAE3E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,iBAAiB,CAAW,MAAM,EAAE;QAClC,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,YAAY;QACxB,QAAQ,EAAE,OAAO;QACjB,cAAc,EAAE,QAAQ;QACxB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE;YACP,IAAI,EAAE,qBAAqB;YAC3B,GAAG,EAAE,mBAAmB;YACxB,MAAM,EAAE,sBAAsB;YAC9B,MAAM,EAAE,sBAAsB;YAC9B,MAAM,EAAE,sBAAsB;SAC/B;QACD,MAAM,EAAE;YACN,IAAI,EAAE,oBAAoB;YAC1B,GAAG,EAAE,kBAAkB;YACvB,MAAM,EAAE,qBAAqB;YAC7B,MAAM,EAAE,qBAAqB;YAC7B,MAAM,EAAE,qBAAqB;SAC9B;QACD,YAAY,EAAE;YACZ,IAAI,EAAE;;;;;;;0EAO8D;YACpE,GAAG,EAAE;;;;;;;4EAOiE;YACtE,MAAM,EAAE;;;;;;;;;;;;;0CAa4B;YACpC,MAAM,EAAE;;;;;;;;;;;;;;qBAcO;YACf,MAAM,EAAE;;;;;;4BAMc;SACvB;QACD,UAAU,EAAE;YACV,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,mBAAmB;SAC5B;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Funnel tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { Funnel } from "../../types.js";
6
+ /**
7
+ * Format funnels as markdown
8
+ */
9
+ export declare function formatFunnelsMarkdown(funnels: Funnel[]): string;
10
+ /**
11
+ * Format a single funnel as markdown
12
+ */
13
+ export declare function formatFunnelMarkdown(funnel: Funnel): string;
14
+ /**
15
+ * Register all funnel-related tools
16
+ */
17
+ export declare function registerFunnelTools(server: McpServer): void;
18
+ //# sourceMappingURL=funnels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"funnels.d.ts","sourceRoot":"","sources":["../../../src/tools/crm/funnels.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAUxC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAoB/D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAW3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoE3D"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Funnel tools for Holded API
3
+ */
4
+ import { ListFunnelsInputSchema, CreateFunnelInputSchema, UpdateFunnelInputSchema, GetFunnelInputSchema, DeleteFunnelInputSchema, } from "../../schemas/crm/funnels.js";
5
+ import { registerCrudTools } from "../factory.js";
6
+ /**
7
+ * Format funnels as markdown
8
+ */
9
+ export function formatFunnelsMarkdown(funnels) {
10
+ if (!funnels.length) {
11
+ return "No funnels found.";
12
+ }
13
+ const lines = ["# Sales Funnels", "", `Found ${funnels.length} funnels:`, ""];
14
+ for (const funnel of funnels) {
15
+ lines.push(`## ${funnel.name}`);
16
+ lines.push(`- **ID**: ${funnel.id}`);
17
+ if (funnel.stages && funnel.stages.length > 0) {
18
+ lines.push("- **Stages**:");
19
+ for (const stage of funnel.stages) {
20
+ lines.push(` - ${stage.name} (ID: ${stage.id}, Order: ${stage.order})`);
21
+ }
22
+ }
23
+ lines.push("");
24
+ }
25
+ return lines.join("\n");
26
+ }
27
+ /**
28
+ * Format a single funnel as markdown
29
+ */
30
+ export function formatFunnelMarkdown(funnel) {
31
+ const lines = [`# ${funnel.name}`, ""];
32
+ lines.push(`- **ID**: ${funnel.id}`);
33
+ if (funnel.stages && funnel.stages.length > 0) {
34
+ lines.push("", "## Stages");
35
+ for (const stage of funnel.stages) {
36
+ lines.push(`- **${stage.name}** (ID: ${stage.id}, Order: ${stage.order})`);
37
+ }
38
+ }
39
+ return lines.join("\n");
40
+ }
41
+ /**
42
+ * Register all funnel-related tools
43
+ */
44
+ export function registerFunnelTools(server) {
45
+ registerCrudTools(server, {
46
+ module: "crm",
47
+ toolPrefix: "holded_crm",
48
+ resource: "funnel",
49
+ resourcePlural: "funnels",
50
+ endpoint: "funnels",
51
+ idParam: "funnel_id",
52
+ schemas: {
53
+ list: ListFunnelsInputSchema,
54
+ get: GetFunnelInputSchema,
55
+ create: CreateFunnelInputSchema,
56
+ update: UpdateFunnelInputSchema,
57
+ delete: DeleteFunnelInputSchema,
58
+ },
59
+ titles: {
60
+ list: "List Holded Funnels",
61
+ get: "Get Holded Funnel",
62
+ create: "Create Holded Funnel",
63
+ update: "Update Holded Funnel",
64
+ delete: "Delete Holded Funnel",
65
+ },
66
+ descriptions: {
67
+ list: `List all sales funnels from Holded CRM.
68
+
69
+ Args:
70
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
71
+
72
+ Returns:
73
+ Array of funnels with id, name, and stages.`,
74
+ get: `Get a specific funnel by ID from Holded CRM.
75
+
76
+ Args:
77
+ - funnel_id (string): The funnel ID to retrieve (required)
78
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
79
+
80
+ Returns:
81
+ Funnel details including name and stages.`,
82
+ create: `Create a new sales funnel in Holded CRM.
83
+
84
+ Args:
85
+ - name (string): Funnel name (required)
86
+ - stages (array): Initial funnel stages with name, order, and probability
87
+
88
+ Returns:
89
+ The created funnel with its assigned ID.`,
90
+ update: `Update an existing sales funnel in Holded CRM.
91
+
92
+ Args:
93
+ - funnel_id (string): The funnel ID to update (required)
94
+ - name (string): Funnel name
95
+ - stages (array): Updated funnel stages
96
+
97
+ Returns:
98
+ The updated funnel.`,
99
+ delete: `Delete a funnel from Holded CRM.
100
+
101
+ Args:
102
+ - funnel_id (string): The funnel ID to delete (required)
103
+
104
+ Returns:
105
+ Confirmation of deletion.`,
106
+ },
107
+ formatters: {
108
+ list: formatFunnelsMarkdown,
109
+ single: formatFunnelMarkdown,
110
+ },
111
+ });
112
+ }
113
+ //# sourceMappingURL=funnels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"funnels.js","sourceRoot":"","sources":["../../../src/tools/crm/funnels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CRM module tools registration
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ /**
6
+ * Register all CRM-related tools
7
+ */
8
+ export declare function registerCrmTools(server: McpServer): void;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/crm/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAKxD"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * CRM module tools registration
3
+ */
4
+ import { registerLeadTools } from "./leads.js";
5
+ import { registerFunnelTools } from "./funnels.js";
6
+ import { registerEventTools } from "./events.js";
7
+ import { registerBookingTools } from "./bookings.js";
8
+ /**
9
+ * Register all CRM-related tools
10
+ */
11
+ export function registerCrmTools(server) {
12
+ registerLeadTools(server);
13
+ registerFunnelTools(server);
14
+ registerEventTools(server);
15
+ registerBookingTools(server);
16
+ }
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/crm/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Lead tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { Lead } from "../../types.js";
6
+ /**
7
+ * Format leads as markdown
8
+ */
9
+ export declare function formatLeadsMarkdown(leads: Lead[]): string;
10
+ /**
11
+ * Format a single lead as markdown
12
+ */
13
+ export declare function formatLeadMarkdown(lead: Lead): string;
14
+ /**
15
+ * Register all lead-related tools
16
+ */
17
+ export declare function registerLeadTools(server: McpServer): void;
18
+ //# sourceMappingURL=leads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leads.d.ts","sourceRoot":"","sources":["../../../src/tools/crm/leads.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,IAAI,EAAsB,MAAM,gBAAgB,CAAC;AA+B1D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAkBzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAqBrD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwiBzD"}