@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,145 @@
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 { makeApiRequest, toStructuredContent } from "../services/api.js";
8
+ import { buildToolResponse, withErrorHandling } from "./utilities.js";
9
+ /**
10
+ * Register CRUD tools for a resource on the given MCP server.
11
+ *
12
+ * Only tools whose schemas are provided in the config will be registered.
13
+ */
14
+ export function registerCrudTools(server, config) {
15
+ const { module, toolPrefix, resource, resourcePlural, endpoint, listEndpoint, idParam, schemas, titles, descriptions, formatters, listQueryParams, bodyTransform, } = config;
16
+ // ── List ───────────────────────────────────────────────
17
+ if (schemas.list) {
18
+ server.registerTool(`${toolPrefix}_list_${resourcePlural}`, {
19
+ title: titles.list,
20
+ description: descriptions.list,
21
+ inputSchema: schemas.list,
22
+ annotations: {
23
+ readOnlyHint: true,
24
+ destructiveHint: false,
25
+ idempotentHint: true,
26
+ openWorldHint: true,
27
+ },
28
+ }, withErrorHandling(async (params) => {
29
+ const queryParams = {};
30
+ if (params.page > 1) {
31
+ queryParams.page = params.page;
32
+ }
33
+ if (listQueryParams) {
34
+ Object.assign(queryParams, listQueryParams(params));
35
+ }
36
+ const items = await makeApiRequest(module, listEndpoint ?? endpoint, "GET", undefined, queryParams);
37
+ return buildToolResponse(items, params.response_format, formatters.list, {
38
+ [resourcePlural]: items,
39
+ count: items.length,
40
+ page: params.page,
41
+ });
42
+ }));
43
+ }
44
+ // ── Get ────────────────────────────────────────────────
45
+ if (schemas.get) {
46
+ server.registerTool(`${toolPrefix}_get_${resource}`, {
47
+ title: titles.get,
48
+ description: descriptions.get,
49
+ inputSchema: schemas.get,
50
+ annotations: {
51
+ readOnlyHint: true,
52
+ destructiveHint: false,
53
+ idempotentHint: true,
54
+ openWorldHint: true,
55
+ },
56
+ }, withErrorHandling(async (params) => {
57
+ const id = params[idParam];
58
+ const item = await makeApiRequest(module, `${endpoint}/${id}`, "GET");
59
+ return buildToolResponse(item, params.response_format, formatters.single);
60
+ }));
61
+ }
62
+ const Resource = resource.charAt(0).toUpperCase() + resource.slice(1);
63
+ // ── Create ─────────────────────────────────────────────
64
+ if (schemas.create) {
65
+ server.registerTool(`${toolPrefix}_create_${resource}`, {
66
+ title: titles.create,
67
+ description: descriptions.create,
68
+ inputSchema: schemas.create,
69
+ annotations: {
70
+ readOnlyHint: false,
71
+ destructiveHint: false,
72
+ idempotentHint: false,
73
+ openWorldHint: true,
74
+ },
75
+ }, withErrorHandling(async (params) => {
76
+ const { response_format: _response_format, ...body } = params;
77
+ const requestBody = bodyTransform ? bodyTransform(body) : body;
78
+ const item = await makeApiRequest(module, endpoint, "POST", requestBody);
79
+ return {
80
+ content: [
81
+ {
82
+ type: "text",
83
+ text: `${Resource} created successfully.\n\n${JSON.stringify(item, null, 2)}`,
84
+ },
85
+ ],
86
+ structuredContent: toStructuredContent(item),
87
+ };
88
+ }));
89
+ }
90
+ // ── Update ─────────────────────────────────────────────
91
+ if (schemas.update) {
92
+ server.registerTool(`${toolPrefix}_update_${resource}`, {
93
+ title: titles.update,
94
+ description: descriptions.update,
95
+ inputSchema: schemas.update,
96
+ annotations: {
97
+ readOnlyHint: false,
98
+ destructiveHint: false,
99
+ idempotentHint: true,
100
+ openWorldHint: true,
101
+ },
102
+ }, withErrorHandling(async (params) => {
103
+ const id = params[idParam];
104
+ const { [idParam]: _id, response_format: _rf, ...updateData } = params;
105
+ const requestBody = bodyTransform ? bodyTransform(updateData) : updateData;
106
+ const item = await makeApiRequest(module, `${endpoint}/${id}`, "PUT", requestBody);
107
+ return {
108
+ content: [
109
+ {
110
+ type: "text",
111
+ text: `${Resource} updated successfully.\n\n${JSON.stringify(item, null, 2)}`,
112
+ },
113
+ ],
114
+ structuredContent: toStructuredContent(item),
115
+ };
116
+ }));
117
+ }
118
+ // ── Delete ─────────────────────────────────────────────
119
+ if (schemas.delete) {
120
+ server.registerTool(`${toolPrefix}_delete_${resource}`, {
121
+ title: titles.delete,
122
+ description: descriptions.delete,
123
+ inputSchema: schemas.delete,
124
+ annotations: {
125
+ readOnlyHint: false,
126
+ destructiveHint: true,
127
+ idempotentHint: true,
128
+ openWorldHint: true,
129
+ },
130
+ }, withErrorHandling(async (params) => {
131
+ const id = params[idParam];
132
+ await makeApiRequest(module, `${endpoint}/${id}`, "DELETE");
133
+ return {
134
+ content: [
135
+ {
136
+ type: "text",
137
+ text: `${Resource} ${id} deleted successfully.`,
138
+ },
139
+ ],
140
+ structuredContent: { deleted: true, id },
141
+ };
142
+ }));
143
+ }
144
+ }
145
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/tools/factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Contact and Contact Group tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { Contact, ContactGroup } from "../../types.js";
6
+ /**
7
+ * Format contacts as markdown
8
+ */
9
+ export declare function formatContactsMarkdown(contacts: Contact[]): string;
10
+ /**
11
+ * Format a single contact as markdown
12
+ */
13
+ export declare function formatContactMarkdown(contact: Contact): string;
14
+ /**
15
+ * Format contact groups as markdown
16
+ */
17
+ export declare function formatContactGroupsMarkdown(groups: ContactGroup[]): string;
18
+ /**
19
+ * Format a single contact group as markdown
20
+ */
21
+ export declare function formatContactGroupMarkdown(group: ContactGroup): string;
22
+ /**
23
+ * Register all contact-related tools
24
+ */
25
+ export declare function registerContactTools(server: McpServer): void;
26
+ //# sourceMappingURL=contacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../../src/tools/invoicing/contacts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAsBvD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAkBlE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CA2B9D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAU1E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAEtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0S5D"}
@@ -0,0 +1,358 @@
1
+ /**
2
+ * Contact and Contact Group tools for Holded API
3
+ */
4
+ import { makeApiRequest, makeMultipartApiRequest } from "../../services/api.js";
5
+ import { ResponseFormat } from "../../constants.js";
6
+ import { ListContactsInputSchema, GetContactInputSchema, CreateContactInputSchema, UpdateContactInputSchema, DeleteContactInputSchema, ListContactGroupsInputSchema, GetContactGroupInputSchema, CreateContactGroupInputSchema, UpdateContactGroupInputSchema, DeleteContactGroupInputSchema, ListContactAttachmentsInputSchema, GetContactAttachmentInputSchema, UploadContactAttachmentInputSchema, } from "../../schemas/invoicing/contacts.js";
7
+ import { registerCrudTools } from "../factory.js";
8
+ import { withErrorHandling } from "../utilities.js";
9
+ /**
10
+ * Format contacts as markdown
11
+ */
12
+ export function formatContactsMarkdown(contacts) {
13
+ if (!contacts.length) {
14
+ return "No contacts found.";
15
+ }
16
+ const lines = ["# Contacts", "", `Found ${contacts.length} contacts:`, ""];
17
+ for (const contact of contacts) {
18
+ lines.push(`## ${contact.name}`);
19
+ lines.push(`- **ID**: ${contact.id}`);
20
+ if (contact.email)
21
+ lines.push(`- **Email**: ${contact.email}`);
22
+ if (contact.phone)
23
+ lines.push(`- **Phone**: ${contact.phone}`);
24
+ if (contact.type)
25
+ lines.push(`- **Type**: ${contact.type}`);
26
+ if (contact.vatnumber)
27
+ lines.push(`- **VAT**: ${contact.vatnumber}`);
28
+ lines.push("");
29
+ }
30
+ return lines.join("\n");
31
+ }
32
+ /**
33
+ * Format a single contact as markdown
34
+ */
35
+ export function formatContactMarkdown(contact) {
36
+ const lines = [`# ${contact.name}`, "", `**ID**: ${contact.id}`, ""];
37
+ if (contact.code)
38
+ lines.push(`- **Code**: ${contact.code}`);
39
+ if (contact.email)
40
+ lines.push(`- **Email**: ${contact.email}`);
41
+ if (contact.phone)
42
+ lines.push(`- **Phone**: ${contact.phone}`);
43
+ if (contact.mobile)
44
+ lines.push(`- **Mobile**: ${contact.mobile}`);
45
+ if (contact.type)
46
+ lines.push(`- **Type**: ${contact.type}`);
47
+ if (contact.vatnumber)
48
+ lines.push(`- **VAT Number**: ${contact.vatnumber}`);
49
+ if (contact.tradeName)
50
+ lines.push(`- **Trade Name**: ${contact.tradeName}`);
51
+ if (contact.currency)
52
+ lines.push(`- **Currency**: ${contact.currency}`);
53
+ if (contact.billAddress) {
54
+ lines.push("", "### Billing Address");
55
+ const addr = contact.billAddress;
56
+ if (addr.address)
57
+ lines.push(`- ${addr.address}`);
58
+ if (addr.city)
59
+ lines.push(`- ${addr.city}`);
60
+ if (addr.postalCode)
61
+ lines.push(`- ${addr.postalCode}`);
62
+ if (addr.province)
63
+ lines.push(`- ${addr.province}`);
64
+ if (addr.country)
65
+ lines.push(`- ${addr.country}`);
66
+ }
67
+ if (contact.notes) {
68
+ lines.push("", "### Notes", contact.notes);
69
+ }
70
+ return lines.join("\n");
71
+ }
72
+ /**
73
+ * Format contact groups as markdown
74
+ */
75
+ export function formatContactGroupsMarkdown(groups) {
76
+ if (!groups.length) {
77
+ return "No contact groups found.";
78
+ }
79
+ const lines = ["# Contact Groups", "", `Found ${groups.length} groups:`, ""];
80
+ for (const group of groups) {
81
+ lines.push(`- **${group.name}** (ID: ${group.id})`);
82
+ }
83
+ return lines.join("\n");
84
+ }
85
+ /**
86
+ * Format a single contact group as markdown
87
+ */
88
+ export function formatContactGroupMarkdown(group) {
89
+ return `# ${group.name}\n\n**ID**: ${group.id}`;
90
+ }
91
+ /**
92
+ * Register all contact-related tools
93
+ */
94
+ export function registerContactTools(server) {
95
+ // ── Contacts CRUD via factory ─────────────────────────
96
+ registerCrudTools(server, {
97
+ module: "invoicing",
98
+ toolPrefix: "holded_invoicing",
99
+ resource: "contact",
100
+ resourcePlural: "contacts",
101
+ endpoint: "contacts",
102
+ idParam: "contact_id",
103
+ schemas: {
104
+ list: ListContactsInputSchema,
105
+ get: GetContactInputSchema,
106
+ create: CreateContactInputSchema,
107
+ update: UpdateContactInputSchema,
108
+ delete: DeleteContactInputSchema,
109
+ },
110
+ titles: {
111
+ list: "List Holded Contacts",
112
+ get: "Get Holded Contact",
113
+ create: "Create Holded Contact",
114
+ update: "Update Holded Contact",
115
+ delete: "Delete Holded Contact",
116
+ },
117
+ descriptions: {
118
+ list: `List all contacts from Holded (clients, suppliers, etc.).
119
+
120
+ Returns paginated list of contacts (max 500 per page). Use page parameter to navigate through results.
121
+
122
+ Args:
123
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
124
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
125
+
126
+ Returns:
127
+ Array of contacts with id, name, email, phone, type, and other details.`,
128
+ get: `Get a specific contact by ID from Holded.
129
+
130
+ Args:
131
+ - contact_id (string): The contact ID to retrieve (required)
132
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
133
+
134
+ Returns:
135
+ Contact details including name, email, phone, addresses, and custom fields.`,
136
+ create: `Create a new contact in Holded.
137
+
138
+ Args:
139
+ - name (string): Contact name (required)
140
+ - email (string): Email address
141
+ - phone (string): Phone number
142
+ - type ('client' | 'supplier' | 'lead' | 'debtor' | 'creditor'): Contact type
143
+ - And other optional fields for address, social networks, defaults, etc.
144
+
145
+ Returns:
146
+ The created contact with its assigned ID.`,
147
+ update: `Update an existing contact in Holded. Only provided fields will be updated.
148
+
149
+ Args:
150
+ - contact_id (string): The contact ID to update (required)
151
+ - name (string): Contact name
152
+ - email (string): Email address
153
+ - phone (string): Phone number
154
+ - And other optional fields to update
155
+
156
+ Returns:
157
+ The updated contact.`,
158
+ delete: `Delete a contact from Holded.
159
+
160
+ Args:
161
+ - contact_id (string): The contact ID to delete (required)
162
+
163
+ Returns:
164
+ Confirmation of deletion.`,
165
+ },
166
+ formatters: {
167
+ list: formatContactsMarkdown,
168
+ single: formatContactMarkdown,
169
+ },
170
+ });
171
+ // ── Contact Groups CRUD via factory ───────────────────
172
+ registerCrudTools(server, {
173
+ module: "invoicing",
174
+ toolPrefix: "holded_invoicing",
175
+ resource: "contact_group",
176
+ resourcePlural: "contact_groups",
177
+ endpoint: "contactgroups",
178
+ idParam: "group_id",
179
+ schemas: {
180
+ list: ListContactGroupsInputSchema,
181
+ get: GetContactGroupInputSchema,
182
+ create: CreateContactGroupInputSchema,
183
+ update: UpdateContactGroupInputSchema,
184
+ delete: DeleteContactGroupInputSchema,
185
+ },
186
+ titles: {
187
+ list: "List Holded Contact Groups",
188
+ get: "Get Holded Contact Group",
189
+ create: "Create Holded Contact Group",
190
+ update: "Update Holded Contact Group",
191
+ delete: "Delete Holded Contact Group",
192
+ },
193
+ descriptions: {
194
+ list: `List all contact groups from Holded.
195
+
196
+ Args:
197
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
198
+
199
+ Returns:
200
+ Array of contact groups with id and name.`,
201
+ get: `Get a specific contact group by ID from Holded.
202
+
203
+ Args:
204
+ - group_id (string): The contact group ID to retrieve (required)
205
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
206
+
207
+ Returns:
208
+ Contact group details.`,
209
+ create: `Create a new contact group in Holded.
210
+
211
+ Args:
212
+ - name (string): Contact group name (required)
213
+ - pos (number): Position/order in the list
214
+
215
+ Returns:
216
+ The created contact group with its assigned ID.`,
217
+ update: `Update an existing contact group in Holded. Only provided fields will be updated.
218
+
219
+ Args:
220
+ - group_id (string): The contact group ID to update (required)
221
+ - name (string): Contact group name
222
+ - pos (number): Position/order in the list
223
+
224
+ Returns:
225
+ The updated contact group.`,
226
+ delete: `Delete a contact group from Holded.
227
+
228
+ Args:
229
+ - group_id (string): The contact group ID to delete (required)
230
+
231
+ Returns:
232
+ Confirmation of deletion.`,
233
+ },
234
+ formatters: {
235
+ list: formatContactGroupsMarkdown,
236
+ single: formatContactGroupMarkdown,
237
+ },
238
+ });
239
+ // ── Manual tools (attachment-specific endpoints) ──────
240
+ // List Contact Attachments
241
+ server.registerTool("holded_invoicing_list_contact_attachments", {
242
+ title: "List Holded Contact Attachments",
243
+ description: `Get attachments list for a given contact from Holded.
244
+
245
+ Args:
246
+ - contact_id (string): The contact ID to list attachments for (required)
247
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
248
+
249
+ Returns:
250
+ Array of attachment file names.`,
251
+ inputSchema: ListContactAttachmentsInputSchema,
252
+ annotations: {
253
+ readOnlyHint: true,
254
+ destructiveHint: false,
255
+ idempotentHint: true,
256
+ openWorldHint: true,
257
+ },
258
+ }, withErrorHandling(async (params) => {
259
+ const typedParams = params;
260
+ const attachments = await makeApiRequest("invoicing", `contacts/${typedParams.contact_id}/attachments/list`, "GET");
261
+ let textContent;
262
+ if (typedParams.response_format === ResponseFormat.MARKDOWN) {
263
+ if (!attachments.length) {
264
+ textContent = `No attachments found for contact ${typedParams.contact_id}.`;
265
+ }
266
+ else {
267
+ const lines = ["# Contact Attachments", "", `Found ${attachments.length} attachments:`, ""];
268
+ for (const attachment of attachments) {
269
+ lines.push(`- ${attachment}`);
270
+ }
271
+ textContent = lines.join("\n");
272
+ }
273
+ }
274
+ else {
275
+ textContent = JSON.stringify(attachments, null, 2);
276
+ }
277
+ return {
278
+ content: [{ type: "text", text: textContent }],
279
+ structuredContent: { attachments, count: attachments.length, contactId: typedParams.contact_id },
280
+ };
281
+ }));
282
+ // Get Contact Attachment
283
+ server.registerTool("holded_invoicing_get_contact_attachment", {
284
+ title: "Get Holded Contact Attachment",
285
+ description: `Get a specific attachment for a contact from Holded.
286
+
287
+ Args:
288
+ - contact_id (string): The contact ID (required)
289
+ - filename (string): The attachment filename (required)
290
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
291
+
292
+ Returns:
293
+ Attachment file data (binary format, base64 encoded or URL).`,
294
+ inputSchema: GetContactAttachmentInputSchema,
295
+ annotations: {
296
+ readOnlyHint: true,
297
+ destructiveHint: false,
298
+ idempotentHint: true,
299
+ openWorldHint: true,
300
+ },
301
+ }, withErrorHandling(async (params) => {
302
+ const typedParams = params;
303
+ const result = await makeApiRequest("invoicing", `contacts/${typedParams.contact_id}/attachments/get`, "GET", undefined, { filename: typedParams.filename });
304
+ let textContent;
305
+ if (typedParams.response_format === ResponseFormat.MARKDOWN) {
306
+ if (typeof result === "string") {
307
+ textContent = `# Contact Attachment\n\n**File**: ${typedParams.filename}\n**Data**: ${result.substring(0, 100)}...`;
308
+ }
309
+ else {
310
+ textContent = result.url
311
+ ? `# Contact Attachment\n\n**File**: ${typedParams.filename}\n**URL**: ${result.url}`
312
+ : `# Contact Attachment\n\n**File**: ${typedParams.filename}\nAttachment data available.`;
313
+ }
314
+ }
315
+ else {
316
+ textContent = JSON.stringify(result, null, 2);
317
+ }
318
+ return {
319
+ content: [{ type: "text", text: textContent }],
320
+ structuredContent: { contactId: typedParams.contact_id, filename: typedParams.filename, data: result },
321
+ };
322
+ }));
323
+ // Upload Contact Attachment
324
+ server.registerTool("holded_invoicing_upload_contact_attachment", {
325
+ title: "Upload Holded Contact Attachment",
326
+ description: `Upload an attachment to a contact in Holded.
327
+
328
+ Args:
329
+ - contact_id (string): The contact ID to upload attachment to (required)
330
+ - file_content (string): File content as base64 encoded string (required)
331
+ - file_name (string): File name (required)
332
+
333
+ Returns:
334
+ Confirmation of attachment upload with status and info.`,
335
+ inputSchema: UploadContactAttachmentInputSchema,
336
+ annotations: {
337
+ readOnlyHint: false,
338
+ destructiveHint: false,
339
+ idempotentHint: false,
340
+ openWorldHint: true,
341
+ },
342
+ }, withErrorHandling(async (params) => {
343
+ const { contact_id, file_content, file_name } = params;
344
+ // Convert base64 to buffer
345
+ const fileBuffer = Buffer.from(file_content, "base64");
346
+ const result = await makeMultipartApiRequest("invoicing", `contacts/${contact_id}/attachments`, fileBuffer, file_name);
347
+ return {
348
+ content: [
349
+ {
350
+ type: "text",
351
+ text: `Contact attachment uploaded successfully.\n\n${JSON.stringify(result, null, 2)}`,
352
+ },
353
+ ],
354
+ structuredContent: { uploaded: true, contactId: contact_id, fileName: file_name, ...result },
355
+ };
356
+ }));
357
+ }
358
+ //# sourceMappingURL=contacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../../src/tools/invoicing/contacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Document tools for Holded API (invoices, estimates, purchases, etc.)
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { Document } from "../../types.js";
6
+ /**
7
+ * Format documents as markdown
8
+ */
9
+ export declare function formatDocumentsMarkdown(documents: Document[], docType: string): string;
10
+ /**
11
+ * Format a single document as markdown
12
+ */
13
+ export declare function formatDocumentMarkdown(doc: Document): string;
14
+ /**
15
+ * Register all document-related tools
16
+ */
17
+ export declare function registerDocumentTools(server: McpServer): void;
18
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../../src/tools/invoicing/documents.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAiC1C;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBtF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAgC5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwpB7D"}