@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,519 @@
1
+ /**
2
+ * Lead tools for Holded API
3
+ */
4
+ import { makeApiRequest, toStructuredContent } from "../../services/api.js";
5
+ import { ResponseFormat } from "../../constants.js";
6
+ import { ListLeadsInputSchema, GetLeadInputSchema, CreateLeadInputSchema, UpdateLeadInputSchema, DeleteLeadInputSchema, UpdateLeadStageInputSchema, CreateLeadNoteInputSchema, UpdateLeadNoteInputSchema, UpdateLeadTaskInputSchema, DeleteLeadTaskInputSchema, UpdateLeadDatesInputSchema, CreateLeadTaskInputSchema, ListLeadNotesInputSchema, ListLeadTasksInputSchema, DeleteLeadNoteInputSchema, } from "../../schemas/crm/leads.js";
7
+ import { registerCrudTools } from "../factory.js";
8
+ import { snakeToCamel, withErrorHandling } from "../utilities.js";
9
+ /**
10
+ * Format leads as markdown
11
+ */
12
+ export function formatLeadsMarkdown(leads) {
13
+ if (!leads.length) {
14
+ return "No leads found.";
15
+ }
16
+ const lines = ["# Leads", "", `Found ${leads.length} leads:`, ""];
17
+ for (const lead of leads) {
18
+ lines.push(`## ${lead.name}`);
19
+ lines.push(`- **ID**: ${lead.id}`);
20
+ if (lead.contactName)
21
+ lines.push(`- **Contact**: ${lead.contactName}`);
22
+ if (lead.potential !== undefined)
23
+ lines.push(`- **Potential**: ${lead.potential} ${lead.currency || ""}`);
24
+ if (lead.probability !== undefined)
25
+ lines.push(`- **Probability**: ${lead.probability}%`);
26
+ if (lead.status)
27
+ lines.push(`- **Status**: ${lead.status}`);
28
+ lines.push("");
29
+ }
30
+ return lines.join("\n");
31
+ }
32
+ /**
33
+ * Format a single lead as markdown
34
+ */
35
+ export function formatLeadMarkdown(lead) {
36
+ const lines = [`# ${lead.name}`, "", `**ID**: ${lead.id}`, ""];
37
+ if (lead.contactName)
38
+ lines.push(`- **Contact**: ${lead.contactName} (${lead.contactId || "N/A"})`);
39
+ if (lead.funnelId)
40
+ lines.push(`- **Funnel ID**: ${lead.funnelId}`);
41
+ if (lead.stageId)
42
+ lines.push(`- **Stage ID**: ${lead.stageId}`);
43
+ if (lead.potential !== undefined)
44
+ lines.push(`- **Potential**: ${lead.potential} ${lead.currency || ""}`);
45
+ if (lead.probability !== undefined)
46
+ lines.push(`- **Probability**: ${lead.probability}%`);
47
+ if (lead.status)
48
+ lines.push(`- **Status**: ${lead.status}`);
49
+ if (lead.expectedCloseDate)
50
+ lines.push(`- **Expected Close**: ${new Date(lead.expectedCloseDate * 1000).toLocaleDateString()}`);
51
+ if (lead.assignedTo)
52
+ lines.push(`- **Assigned To**: ${lead.assignedTo}`);
53
+ if (lead.notes) {
54
+ lines.push("", "## Notes", lead.notes);
55
+ }
56
+ if (lead.tags && lead.tags.length > 0) {
57
+ lines.push("", `**Tags**: ${lead.tags.join(", ")}`);
58
+ }
59
+ return lines.join("\n");
60
+ }
61
+ /**
62
+ * Register all lead-related tools
63
+ */
64
+ export function registerLeadTools(server) {
65
+ // ── Standard CRUD via factory ───────────────────────────
66
+ registerCrudTools(server, {
67
+ module: "crm",
68
+ toolPrefix: "holded_crm",
69
+ resource: "lead",
70
+ resourcePlural: "leads",
71
+ endpoint: "leads",
72
+ idParam: "lead_id",
73
+ schemas: {
74
+ list: ListLeadsInputSchema,
75
+ get: GetLeadInputSchema,
76
+ create: CreateLeadInputSchema,
77
+ update: UpdateLeadInputSchema,
78
+ delete: DeleteLeadInputSchema,
79
+ },
80
+ titles: {
81
+ list: "List Holded Leads",
82
+ get: "Get Holded Lead",
83
+ create: "Create Holded Lead",
84
+ update: "Update Holded Lead",
85
+ delete: "Delete Holded Lead",
86
+ },
87
+ descriptions: {
88
+ list: `List all leads from Holded CRM.
89
+
90
+ Args:
91
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
92
+ - funnel_id (string): Filter by funnel ID (optional)
93
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
94
+
95
+ Returns:
96
+ Array of leads with id, name, contact, potential, probability, and status.`,
97
+ get: `Get a specific lead by ID from Holded CRM.
98
+
99
+ Args:
100
+ - lead_id (string): The lead ID to retrieve (required)
101
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
102
+
103
+ Returns:
104
+ Lead details including contact, potential, stage, and custom fields.`,
105
+ create: `Create a new lead in Holded CRM.
106
+
107
+ Args:
108
+ - name (string): Lead name (required)
109
+ - funnel_id (string): Funnel ID (required)
110
+ - contact_id (string): Contact ID (required)
111
+ - stage_id (string): Stage ID within the funnel
112
+ - contact_name (string): Contact name
113
+ - value (number): Monetary value of the lead
114
+ - due_date (number): Due date as Unix timestamp
115
+
116
+ Returns:
117
+ The created lead with its assigned ID.`,
118
+ update: `Update an existing lead in Holded CRM.
119
+
120
+ Args:
121
+ - lead_id (string): The lead ID to update (required)
122
+ - name (string): Lead name
123
+ - value (number): Monetary value
124
+ - due_date (number): Due date as Unix timestamp
125
+ - status (number): Lead status indicator
126
+ - customFields (array): Custom field key-value pairs
127
+
128
+ Returns:
129
+ The updated lead.`,
130
+ delete: `Delete a lead from Holded CRM.
131
+
132
+ Args:
133
+ - lead_id (string): The lead ID to delete (required)
134
+
135
+ Returns:
136
+ Confirmation of deletion.`,
137
+ },
138
+ formatters: {
139
+ list: formatLeadsMarkdown,
140
+ single: formatLeadMarkdown,
141
+ },
142
+ listQueryParams: (params) => {
143
+ const qp = {};
144
+ if (params.funnel_id)
145
+ qp.funnelId = params.funnel_id;
146
+ return qp;
147
+ },
148
+ bodyTransform: snakeToCamel,
149
+ });
150
+ // ── Manual tools (sub-resource endpoints) ───────────────
151
+ // Update Lead Stage
152
+ server.registerTool("holded_crm_update_lead_stage", {
153
+ title: "Update Holded Lead Stage",
154
+ description: `Move a lead to a different stage in the sales funnel.
155
+
156
+ Args:
157
+ - lead_id (string): The lead ID to move (required)
158
+ - stage_id (string): The target stage ID (required)
159
+
160
+ Returns:
161
+ Confirmation of stage update.`,
162
+ inputSchema: UpdateLeadStageInputSchema,
163
+ annotations: {
164
+ readOnlyHint: false,
165
+ destructiveHint: false,
166
+ idempotentHint: true,
167
+ openWorldHint: true,
168
+ },
169
+ }, withErrorHandling(async (params) => {
170
+ const typedParams = params;
171
+ const result = await makeApiRequest("crm", `leads/${typedParams.lead_id}/stages`, "PUT", { stageId: typedParams.stage_id });
172
+ return {
173
+ content: [
174
+ {
175
+ type: "text",
176
+ text: `Lead stage updated successfully.\n\n${JSON.stringify(result, null, 2)}`,
177
+ },
178
+ ],
179
+ structuredContent: { updated: true, leadId: typedParams.lead_id, stageId: typedParams.stage_id },
180
+ };
181
+ }));
182
+ // Create Lead Note
183
+ server.registerTool("holded_crm_create_lead_note", {
184
+ title: "Create Holded Lead Note",
185
+ description: `Add a note to a lead in Holded CRM.
186
+
187
+ Args:
188
+ - lead_id (string): The lead ID to add the note to (required)
189
+ - content (string): Note content (required)
190
+
191
+ Returns:
192
+ The created note.`,
193
+ inputSchema: CreateLeadNoteInputSchema,
194
+ annotations: {
195
+ readOnlyHint: false,
196
+ destructiveHint: false,
197
+ idempotentHint: false,
198
+ openWorldHint: true,
199
+ },
200
+ }, withErrorHandling(async (params) => {
201
+ const typedParams = params;
202
+ const note = await makeApiRequest("crm", `leads/${typedParams.lead_id}/notes`, "POST", { content: typedParams.content });
203
+ return {
204
+ content: [
205
+ {
206
+ type: "text",
207
+ text: `Note added successfully.\n\n${JSON.stringify(note, null, 2)}`,
208
+ },
209
+ ],
210
+ structuredContent: toStructuredContent(note),
211
+ };
212
+ }));
213
+ // Update Lead Task
214
+ server.registerTool("holded_crm_update_lead_task", {
215
+ title: "Update Holded Lead Task",
216
+ description: `Update a task associated with a lead in Holded CRM.
217
+
218
+ Args:
219
+ - lead_id (string): The lead ID (required)
220
+ - task_id (string): The task ID to update (required)
221
+ - name (string): Task name
222
+ - description (string): Task description
223
+ - due_date (number): Due date as Unix timestamp
224
+ - completed (boolean): Whether the task is completed
225
+ - assigned_to (string): User ID to assign the task to
226
+
227
+ Returns:
228
+ The updated task.`,
229
+ inputSchema: UpdateLeadTaskInputSchema,
230
+ annotations: {
231
+ readOnlyHint: false,
232
+ destructiveHint: false,
233
+ idempotentHint: true,
234
+ openWorldHint: true,
235
+ },
236
+ }, withErrorHandling(async (params) => {
237
+ const { lead_id, task_id, due_date, assigned_to, ...rest } = params;
238
+ const requestData = { ...rest };
239
+ if (due_date)
240
+ requestData.dueDate = due_date;
241
+ if (assigned_to)
242
+ requestData.assignedTo = assigned_to;
243
+ const task = await makeApiRequest("crm", `leads/${lead_id}/tasks`, "PUT", { taskId: task_id, ...requestData });
244
+ return {
245
+ content: [
246
+ {
247
+ type: "text",
248
+ text: `Task updated successfully.\n\n${JSON.stringify(task, null, 2)}`,
249
+ },
250
+ ],
251
+ structuredContent: toStructuredContent(task),
252
+ };
253
+ }));
254
+ // Update Lead Note
255
+ server.registerTool("holded_crm_update_lead_note", {
256
+ title: "Update Holded Lead Note",
257
+ description: `Update a note associated with a lead in Holded CRM.
258
+
259
+ Args:
260
+ - lead_id (string): The lead ID (required)
261
+ - note_id (string): The note ID to update (required)
262
+ - content (string): Note content (required)
263
+
264
+ Returns:
265
+ The updated note.`,
266
+ inputSchema: UpdateLeadNoteInputSchema,
267
+ annotations: {
268
+ readOnlyHint: false,
269
+ destructiveHint: false,
270
+ idempotentHint: true,
271
+ openWorldHint: true,
272
+ },
273
+ }, withErrorHandling(async (params) => {
274
+ const { lead_id, note_id, content } = params;
275
+ const note = await makeApiRequest("crm", `leads/${lead_id}/notes`, "PUT", { noteId: note_id, content });
276
+ return {
277
+ content: [
278
+ {
279
+ type: "text",
280
+ text: `Note updated successfully.\n\n${JSON.stringify(note, null, 2)}`,
281
+ },
282
+ ],
283
+ structuredContent: toStructuredContent(note),
284
+ };
285
+ }));
286
+ // Delete Lead Task
287
+ server.registerTool("holded_crm_delete_lead_task", {
288
+ title: "Delete Holded Lead Task",
289
+ description: `Delete a task associated with a lead in Holded CRM.
290
+
291
+ Args:
292
+ - lead_id (string): The lead ID (required)
293
+ - task_id (string): The task ID to delete (required)
294
+
295
+ Returns:
296
+ Confirmation of task deletion.`,
297
+ inputSchema: DeleteLeadTaskInputSchema,
298
+ annotations: {
299
+ readOnlyHint: false,
300
+ destructiveHint: true,
301
+ idempotentHint: true,
302
+ openWorldHint: true,
303
+ },
304
+ }, withErrorHandling(async (params) => {
305
+ const { lead_id, task_id } = params;
306
+ await makeApiRequest("crm", `leads/${lead_id}/tasks`, "DELETE", { taskId: task_id });
307
+ return {
308
+ content: [
309
+ {
310
+ type: "text",
311
+ text: `Task ${task_id} deleted successfully from lead ${lead_id}.`,
312
+ },
313
+ ],
314
+ structuredContent: { deleted: true, leadId: lead_id, taskId: task_id },
315
+ };
316
+ }));
317
+ // Update Lead Dates
318
+ server.registerTool("holded_crm_update_lead_dates", {
319
+ title: "Update Holded Lead Dates",
320
+ description: `Update the creation date of a lead in Holded CRM.
321
+
322
+ Args:
323
+ - lead_id (string): The lead ID (required)
324
+ - creation_date (number): Creation date as Unix timestamp (required)
325
+
326
+ Returns:
327
+ Confirmation of date update.`,
328
+ inputSchema: UpdateLeadDatesInputSchema,
329
+ annotations: {
330
+ readOnlyHint: false,
331
+ destructiveHint: false,
332
+ idempotentHint: true,
333
+ openWorldHint: true,
334
+ },
335
+ }, withErrorHandling(async (params) => {
336
+ const { lead_id, creation_date } = params;
337
+ const result = await makeApiRequest("crm", `leads/${lead_id}/dates`, "PUT", { creationDate: creation_date });
338
+ return {
339
+ content: [
340
+ {
341
+ type: "text",
342
+ text: `Lead dates updated successfully.\n\n${JSON.stringify(result, null, 2)}`,
343
+ },
344
+ ],
345
+ structuredContent: { updated: true, leadId: lead_id, creationDate: creation_date, ...result },
346
+ };
347
+ }));
348
+ // Create Lead Task
349
+ server.registerTool("holded_crm_create_lead_task", {
350
+ title: "Create Holded Lead Task",
351
+ description: `Create a new task for a lead in Holded CRM.
352
+
353
+ Args:
354
+ - lead_id (string): The lead ID to add the task to (required)
355
+ - name (string): Task name (required)
356
+ - description (string): Task description
357
+ - due_date (number): Due date as Unix timestamp
358
+ - assigned_to (string): User ID to assign the task to
359
+
360
+ Returns:
361
+ The created task.`,
362
+ inputSchema: CreateLeadTaskInputSchema,
363
+ annotations: {
364
+ readOnlyHint: false,
365
+ destructiveHint: false,
366
+ idempotentHint: false,
367
+ openWorldHint: true,
368
+ },
369
+ }, withErrorHandling(async (params) => {
370
+ const { lead_id, due_date, assigned_to, ...rest } = params;
371
+ const requestData = { ...rest };
372
+ if (due_date)
373
+ requestData.dueDate = due_date;
374
+ if (assigned_to)
375
+ requestData.assignedTo = assigned_to;
376
+ const task = await makeApiRequest("crm", `leads/${lead_id}/tasks`, "POST", requestData);
377
+ return {
378
+ content: [
379
+ {
380
+ type: "text",
381
+ text: `Task created successfully.\n\n${JSON.stringify(task, null, 2)}`,
382
+ },
383
+ ],
384
+ structuredContent: toStructuredContent(task),
385
+ };
386
+ }));
387
+ // List Lead Notes
388
+ server.registerTool("holded_crm_list_lead_notes", {
389
+ title: "List Holded Lead Notes",
390
+ description: `List all notes for a lead in Holded CRM.
391
+
392
+ Args:
393
+ - lead_id (string): The lead ID to list notes for (required)
394
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
395
+
396
+ Returns:
397
+ Array of notes with id, content, and creation date.`,
398
+ inputSchema: ListLeadNotesInputSchema,
399
+ annotations: {
400
+ readOnlyHint: true,
401
+ destructiveHint: false,
402
+ idempotentHint: true,
403
+ openWorldHint: true,
404
+ },
405
+ }, withErrorHandling(async (params) => {
406
+ const typedParams = params;
407
+ const notes = await makeApiRequest("crm", `leads/${typedParams.lead_id}/notes`, "GET");
408
+ let textContent;
409
+ if (typedParams.response_format === ResponseFormat.MARKDOWN) {
410
+ if (!notes.length) {
411
+ textContent = `No notes found for lead ${typedParams.lead_id}.`;
412
+ }
413
+ else {
414
+ const lines = ["# Lead Notes", "", `Found ${notes.length} notes:`, ""];
415
+ for (const note of notes) {
416
+ lines.push(`## Note ${note.id}`);
417
+ lines.push(`- **Content**: ${note.content}`);
418
+ if (note.createdAt)
419
+ lines.push(`- **Created**: ${new Date(note.createdAt * 1000).toLocaleDateString()}`);
420
+ if (note.createdBy)
421
+ lines.push(`- **Created By**: ${note.createdBy}`);
422
+ lines.push("");
423
+ }
424
+ textContent = lines.join("\n");
425
+ }
426
+ }
427
+ else {
428
+ textContent = JSON.stringify(notes, null, 2);
429
+ }
430
+ return {
431
+ content: [{ type: "text", text: textContent }],
432
+ structuredContent: { notes, count: notes.length, leadId: typedParams.lead_id },
433
+ };
434
+ }));
435
+ // List Lead Tasks
436
+ server.registerTool("holded_crm_list_lead_tasks", {
437
+ title: "List Holded Lead Tasks",
438
+ description: `List all tasks for a lead in Holded CRM.
439
+
440
+ Args:
441
+ - lead_id (string): The lead ID to list tasks for (required)
442
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
443
+
444
+ Returns:
445
+ Array of tasks with id, name, description, due date, and status.`,
446
+ inputSchema: ListLeadTasksInputSchema,
447
+ annotations: {
448
+ readOnlyHint: true,
449
+ destructiveHint: false,
450
+ idempotentHint: true,
451
+ openWorldHint: true,
452
+ },
453
+ }, withErrorHandling(async (params) => {
454
+ const typedParams = params;
455
+ const tasks = await makeApiRequest("crm", `leads/${typedParams.lead_id}/tasks`, "GET");
456
+ let textContent;
457
+ if (typedParams.response_format === ResponseFormat.MARKDOWN) {
458
+ if (!tasks.length) {
459
+ textContent = `No tasks found for lead ${typedParams.lead_id}.`;
460
+ }
461
+ else {
462
+ const lines = ["# Lead Tasks", "", `Found ${tasks.length} tasks:`, ""];
463
+ for (const task of tasks) {
464
+ lines.push(`## ${task.name}`);
465
+ lines.push(`- **ID**: ${task.id}`);
466
+ if (task.description)
467
+ lines.push(`- **Description**: ${task.description}`);
468
+ if (task.dueDate)
469
+ lines.push(`- **Due Date**: ${new Date(task.dueDate * 1000).toLocaleDateString()}`);
470
+ if (task.completed !== undefined)
471
+ lines.push(`- **Completed**: ${task.completed ? "Yes" : "No"}`);
472
+ if (task.assignedTo)
473
+ lines.push(`- **Assigned To**: ${task.assignedTo}`);
474
+ lines.push("");
475
+ }
476
+ textContent = lines.join("\n");
477
+ }
478
+ }
479
+ else {
480
+ textContent = JSON.stringify(tasks, null, 2);
481
+ }
482
+ return {
483
+ content: [{ type: "text", text: textContent }],
484
+ structuredContent: { tasks, count: tasks.length, leadId: typedParams.lead_id },
485
+ };
486
+ }));
487
+ // Delete Lead Note
488
+ server.registerTool("holded_crm_delete_lead_note", {
489
+ title: "Delete Holded Lead Note",
490
+ description: `Delete a note from a lead in Holded CRM.
491
+
492
+ Args:
493
+ - lead_id (string): The lead ID (required)
494
+ - note_id (string): The note ID to delete (required)
495
+
496
+ Returns:
497
+ Confirmation of note deletion.`,
498
+ inputSchema: DeleteLeadNoteInputSchema,
499
+ annotations: {
500
+ readOnlyHint: false,
501
+ destructiveHint: true,
502
+ idempotentHint: true,
503
+ openWorldHint: true,
504
+ },
505
+ }, withErrorHandling(async (params) => {
506
+ const { lead_id, note_id } = params;
507
+ await makeApiRequest("crm", `leads/${lead_id}/notes`, "DELETE", { noteId: note_id });
508
+ return {
509
+ content: [
510
+ {
511
+ type: "text",
512
+ text: `Note ${note_id} deleted successfully from lead ${lead_id}.`,
513
+ },
514
+ ],
515
+ structuredContent: { deleted: true, leadId: lead_id, noteId: note_id },
516
+ };
517
+ }));
518
+ }
519
+ //# sourceMappingURL=leads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leads.js","sourceRoot":"","sources":["../../../src/tools/crm/leads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * CRUD tool factory — registerCrudTools
3
+ *
4
+ * Generates standard list / get / create / update / delete MCP tools
5
+ * from a declarative CrudToolConfig, eliminating boilerplate.
6
+ */
7
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ import type { ZodType } from "zod";
9
+ import type { ApiModule } from "../services/api.js";
10
+ /**
11
+ * Configuration for registering CRUD tools for a resource.
12
+ */
13
+ export interface CrudToolConfig<T> {
14
+ module: ApiModule;
15
+ toolPrefix: string;
16
+ resource: string;
17
+ resourcePlural: string;
18
+ endpoint: string;
19
+ listEndpoint?: string;
20
+ idParam: string;
21
+ schemas: {
22
+ list?: ZodType;
23
+ get?: ZodType;
24
+ create?: ZodType;
25
+ update?: ZodType;
26
+ delete?: ZodType;
27
+ };
28
+ titles: {
29
+ list?: string;
30
+ get?: string;
31
+ create?: string;
32
+ update?: string;
33
+ delete?: string;
34
+ };
35
+ descriptions: {
36
+ list?: string;
37
+ get?: string;
38
+ create?: string;
39
+ update?: string;
40
+ delete?: string;
41
+ };
42
+ formatters: {
43
+ list: (items: T[]) => string;
44
+ single: (item: T) => string;
45
+ };
46
+ listQueryParams?: (params: Record<string, unknown>) => Record<string, unknown>;
47
+ bodyTransform?: (body: Record<string, unknown>) => Record<string, unknown>;
48
+ }
49
+ /**
50
+ * Register CRUD tools for a resource on the given MCP server.
51
+ *
52
+ * Only tools whose schemas are provided in the config will be registered.
53
+ */
54
+ export declare function registerCrudTools<T>(server: McpServer, config: CrudToolConfig<T>): void;
55
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/tools/factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAGnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,MAAM,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,YAAY,EAAE;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,UAAU,EAAE;QACV,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC;QAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;KAC7B,CAAC;IACF,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/E,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAwMvF"}