@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,29 @@
1
+ /**
2
+ * Services tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ interface Service {
6
+ id: string;
7
+ name: string;
8
+ desc?: string;
9
+ subtotal?: number;
10
+ tax?: number;
11
+ cost?: number;
12
+ salesChannelId?: string;
13
+ tags?: string[];
14
+ [key: string]: unknown;
15
+ }
16
+ /**
17
+ * Format services as markdown
18
+ */
19
+ export declare function formatServicesMarkdown(services: Service[]): string;
20
+ /**
21
+ * Format a single service as markdown
22
+ */
23
+ export declare function formatServiceMarkdown(service: Service): string;
24
+ /**
25
+ * Register services tools
26
+ */
27
+ export declare function registerServicesTools(server: McpServer): void;
28
+ export {};
29
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../../src/tools/invoicing/services.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAclE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAa9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+E7D"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Services tools for Holded API
3
+ */
4
+ import { ListServicesInputSchema, GetServiceInputSchema, CreateServiceInputSchema, UpdateServiceInputSchema, DeleteServiceInputSchema, } from "../../schemas/invoicing/services.js";
5
+ import { registerCrudTools } from "../factory.js";
6
+ /**
7
+ * Format services as markdown
8
+ */
9
+ export function formatServicesMarkdown(services) {
10
+ if (!services.length) {
11
+ return "No services found.";
12
+ }
13
+ const lines = ["# Services", "", `Found ${services.length} services:`, ""];
14
+ for (const service of services) {
15
+ lines.push(`## ${service.name}`);
16
+ lines.push(`- **ID**: ${service.id}`);
17
+ lines.push("");
18
+ }
19
+ return lines.join("\n");
20
+ }
21
+ /**
22
+ * Format a single service as markdown
23
+ */
24
+ export function formatServiceMarkdown(service) {
25
+ const lines = [`# ${service.name || "Service"}`, "", `**ID**: ${service.id}`, ""];
26
+ if (service.desc)
27
+ lines.push(`- **Description**: ${service.desc}`);
28
+ if (service.subtotal !== undefined)
29
+ lines.push(`- **Subtotal**: ${service.subtotal}`);
30
+ if (service.tax !== undefined)
31
+ lines.push(`- **Tax**: ${service.tax}`);
32
+ if (service.cost !== undefined)
33
+ lines.push(`- **Cost**: ${service.cost}`);
34
+ if (service.salesChannelId)
35
+ lines.push(`- **Sales Channel ID**: ${service.salesChannelId}`);
36
+ if (service.tags && Array.isArray(service.tags) && service.tags.length > 0) {
37
+ lines.push(`- **Tags**: ${service.tags.join(", ")}`);
38
+ }
39
+ return lines.join("\n");
40
+ }
41
+ /**
42
+ * Register services tools
43
+ */
44
+ export function registerServicesTools(server) {
45
+ registerCrudTools(server, {
46
+ module: "invoicing",
47
+ toolPrefix: "holded_invoicing",
48
+ resource: "service",
49
+ resourcePlural: "services",
50
+ endpoint: "services",
51
+ idParam: "service_id",
52
+ schemas: {
53
+ list: ListServicesInputSchema,
54
+ get: GetServiceInputSchema,
55
+ create: CreateServiceInputSchema,
56
+ update: UpdateServiceInputSchema,
57
+ delete: DeleteServiceInputSchema,
58
+ },
59
+ titles: {
60
+ list: "List Holded Services",
61
+ get: "Get Holded Service",
62
+ create: "Create Holded Service",
63
+ update: "Update Holded Service",
64
+ delete: "Delete Holded Service",
65
+ },
66
+ descriptions: {
67
+ list: `List all services from Holded.
68
+
69
+ Args:
70
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
71
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
72
+
73
+ Returns:
74
+ Array of services with id and name.`,
75
+ get: `Get a specific service by ID from Holded.
76
+
77
+ Args:
78
+ - service_id (string): The service ID to retrieve (required)
79
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
80
+
81
+ Returns:
82
+ Service details including name, description, price, and other fields.`,
83
+ create: `Create a new service in Holded.
84
+
85
+ Args:
86
+ - name (string): Service name (required)
87
+ - desc (string): Service description
88
+ - tags (array): Service tags
89
+ - tax (number): Tax rate
90
+ - subtotal (number): Subtotal in cents
91
+ - salesChannelId (string): Sales channel ID
92
+ - cost (number): Service cost
93
+
94
+ Returns:
95
+ The created service with its assigned ID.`,
96
+ update: `Update an existing service in Holded. Only provided fields will be updated.
97
+
98
+ Args:
99
+ - service_id (string): The service ID to update (required)
100
+ - name (string): Service name
101
+ - desc (string): Service description
102
+ - tags (array): Service tags
103
+ - tax (number): Tax rate
104
+ - subtotal (number): Subtotal in cents
105
+ - salesChannelId (string): Sales channel ID
106
+ - cost (number): Service cost
107
+
108
+ Returns:
109
+ The updated service.`,
110
+ delete: `Delete a service from Holded.
111
+
112
+ Args:
113
+ - service_id (string): The service ID to delete (required)
114
+
115
+ Returns:
116
+ Confirmation of deletion.`,
117
+ },
118
+ formatters: {
119
+ list: formatServicesMarkdown,
120
+ single: formatServiceMarkdown,
121
+ },
122
+ });
123
+ }
124
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../../src/tools/invoicing/services.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Taxes tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ /**
6
+ * Format taxes as markdown
7
+ */
8
+ export declare function formatTaxesMarkdown(taxes: Array<{
9
+ id: string;
10
+ name: string;
11
+ rate?: number;
12
+ [key: string]: unknown;
13
+ }>): string;
14
+ /**
15
+ * Register taxes tools
16
+ */
17
+ export declare function registerTaxesTools(server: McpServer): void;
18
+ //# sourceMappingURL=taxes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taxes.d.ts","sourceRoot":"","sources":["../../../src/tools/invoicing/taxes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,GAAG,MAAM,CAe7H;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwC1D"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Taxes tools for Holded API
3
+ */
4
+ import { makeApiRequest } from "../../services/api.js";
5
+ import { ResponseFormat } from "../../constants.js";
6
+ import { withErrorHandling } from "../utilities.js";
7
+ import { GetTaxesInputSchema, } from "../../schemas/invoicing/taxes.js";
8
+ /**
9
+ * Format taxes as markdown
10
+ */
11
+ export function formatTaxesMarkdown(taxes) {
12
+ if (!taxes.length) {
13
+ return "No taxes found.";
14
+ }
15
+ const lines = ["# Taxes", "", `Found ${taxes.length} taxes:`, ""];
16
+ for (const tax of taxes) {
17
+ lines.push(`## ${tax.name}`);
18
+ lines.push(`- **ID**: ${tax.id}`);
19
+ if (tax.rate !== undefined)
20
+ lines.push(`- **Rate**: ${tax.rate}%`);
21
+ lines.push("");
22
+ }
23
+ return lines.join("\n");
24
+ }
25
+ /**
26
+ * Register taxes tools
27
+ */
28
+ export function registerTaxesTools(server) {
29
+ // Get Taxes
30
+ server.registerTool("holded_invoicing_get_taxes", {
31
+ title: "Get Holded Taxes",
32
+ description: `Get all taxes information from Holded.
33
+
34
+ Args:
35
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
36
+
37
+ Returns:
38
+ Array of taxes with id, name, and rate information.`,
39
+ inputSchema: GetTaxesInputSchema,
40
+ annotations: {
41
+ readOnlyHint: true,
42
+ destructiveHint: false,
43
+ idempotentHint: true,
44
+ openWorldHint: true,
45
+ },
46
+ }, withErrorHandling(async (params) => {
47
+ const { response_format } = params;
48
+ const taxes = await makeApiRequest("invoicing", "taxes", "GET");
49
+ const textContent = response_format === ResponseFormat.MARKDOWN
50
+ ? formatTaxesMarkdown(taxes)
51
+ : JSON.stringify(taxes, null, 2);
52
+ return {
53
+ content: [{ type: "text", text: textContent }],
54
+ structuredContent: { taxes, count: taxes.length },
55
+ };
56
+ }));
57
+ }
58
+ //# sourceMappingURL=taxes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taxes.js","sourceRoot":"","sources":["../../../src/tools/invoicing/taxes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,mBAAmB,GAEpB,MAAM,kCAAkC,CAAC;AAE1C;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAiF;IACnH,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,SAAS,KAAK,CAAC,MAAM,SAAS,EAAE,EAAE,CAAC,CAAC;IAElE,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QACnE,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,kBAAkB,CAAC,MAAiB;IAClD,YAAY;IACZ,MAAM,CAAC,YAAY,CACjB,4BAA4B,EAC5B;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE;;;;;;sDAMmC;QAChD,WAAW,EAAE,mBAAmB;QAChC,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACjC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAkC,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,cAAc,CAChC,WAAW,EACX,OAAO,EACP,KAAK,CACN,CAAC;QAEF,MAAM,WAAW,GACf,eAAe,KAAK,cAAc,CAAC,QAAQ;YACzC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAErC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YAC9C,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE;SAClD,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Treasury and Payment Methods tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ /**
6
+ * Register all treasury and payment methods tools
7
+ */
8
+ export declare function registerTreasuryTools(server: McpServer): void;
9
+ //# sourceMappingURL=treasury.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treasury.d.ts","sourceRoot":"","sources":["../../../src/tools/invoicing/treasury.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgBpE;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkN7D"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Treasury and Payment Methods tools for Holded API
3
+ */
4
+ import { makeApiRequest, toStructuredContent } from "../../services/api.js";
5
+ import { ResponseFormat } from "../../constants.js";
6
+ import { withErrorHandling } from "../utilities.js";
7
+ import { CreateTreasuryInputSchema, ListPaymentMethodsInputSchema, ListTreasuriesInputSchema, GetTreasuryInputSchema, } from "../../schemas/invoicing/treasury.js";
8
+ /**
9
+ * Register all treasury and payment methods tools
10
+ */
11
+ export function registerTreasuryTools(server) {
12
+ // Create Treasury
13
+ server.registerTool("holded_invoicing_create_treasury", {
14
+ title: "Create Holded Treasury Account",
15
+ description: `Create a new treasury/bank account in Holded.
16
+
17
+ Args:
18
+ - name (string): Treasury account name (required)
19
+ - id (string): Treasury account ID (optional, auto-generated if not provided)
20
+ - type (string): Account type (e.g., 'bank', 'cash', 'creditcard')
21
+ - balance (integer): Initial balance
22
+ - accountNumber (integer): Accounting account number. If blank, a new account with prefix 572 will be created
23
+ - iban (string): Bank IBAN
24
+ - swift (string): Bank SWIFT/BIC code
25
+ - bank (string): Bank identifier
26
+ - bankname (string): Bank name
27
+
28
+ Returns:
29
+ The created treasury account with its assigned ID.`,
30
+ inputSchema: CreateTreasuryInputSchema,
31
+ annotations: {
32
+ readOnlyHint: false,
33
+ destructiveHint: false,
34
+ idempotentHint: false,
35
+ openWorldHint: true,
36
+ },
37
+ }, withErrorHandling(async (params) => {
38
+ const typedParams = params;
39
+ const treasury = await makeApiRequest("invoicing", "treasury", "POST", typedParams);
40
+ return {
41
+ content: [
42
+ {
43
+ type: "text",
44
+ text: `Treasury account created successfully.\n\n${JSON.stringify(treasury, null, 2)}`,
45
+ },
46
+ ],
47
+ structuredContent: toStructuredContent(treasury),
48
+ };
49
+ }));
50
+ // List Payment Methods
51
+ server.registerTool("holded_invoicing_list_payment_methods", {
52
+ title: "List Holded Payment Methods",
53
+ description: `List all payment methods from Holded.
54
+
55
+ Args:
56
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
57
+
58
+ Returns:
59
+ Array of payment methods with id, name, and configuration.`,
60
+ inputSchema: ListPaymentMethodsInputSchema,
61
+ annotations: {
62
+ readOnlyHint: true,
63
+ destructiveHint: false,
64
+ idempotentHint: true,
65
+ openWorldHint: true,
66
+ },
67
+ }, withErrorHandling(async (params) => {
68
+ const { response_format } = params;
69
+ const paymentMethods = await makeApiRequest("invoicing", "paymentmethods", "GET");
70
+ let textContent;
71
+ if (response_format === ResponseFormat.MARKDOWN) {
72
+ if (!paymentMethods.length) {
73
+ textContent = "No payment methods found.";
74
+ }
75
+ else {
76
+ const lines = ["# Payment Methods", "", `Found ${paymentMethods.length} payment methods:`, ""];
77
+ for (const method of paymentMethods) {
78
+ lines.push(`- **${method.name}** (ID: ${method.id})`);
79
+ }
80
+ textContent = lines.join("\n");
81
+ }
82
+ }
83
+ else {
84
+ textContent = JSON.stringify(paymentMethods, null, 2);
85
+ }
86
+ return {
87
+ content: [{ type: "text", text: textContent }],
88
+ structuredContent: { paymentMethods, count: paymentMethods.length },
89
+ };
90
+ }));
91
+ // List Treasuries
92
+ server.registerTool("holded_invoicing_list_treasuries", {
93
+ title: "List Holded Treasury Accounts",
94
+ description: `List all treasury/bank accounts from Holded.
95
+
96
+ Args:
97
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
98
+
99
+ Returns:
100
+ Array of treasury accounts with id, name, type, currency, and balance.`,
101
+ inputSchema: ListTreasuriesInputSchema,
102
+ annotations: {
103
+ readOnlyHint: true,
104
+ destructiveHint: false,
105
+ idempotentHint: true,
106
+ openWorldHint: true,
107
+ },
108
+ }, withErrorHandling(async (params) => {
109
+ const { response_format } = params;
110
+ const treasuries = await makeApiRequest("invoicing", "treasury", "GET");
111
+ let textContent;
112
+ if (response_format === ResponseFormat.MARKDOWN) {
113
+ if (!treasuries.length) {
114
+ textContent = "No treasury accounts found.";
115
+ }
116
+ else {
117
+ const lines = ["# Treasury Accounts", "", `Found ${treasuries.length} accounts:`, ""];
118
+ for (const t of treasuries) {
119
+ lines.push(`## ${t.name}`);
120
+ lines.push(`- **ID**: ${t.id}`);
121
+ lines.push(`- **Type**: ${t.type}`);
122
+ if (t.currency)
123
+ lines.push(`- **Currency**: ${t.currency}`);
124
+ if (t.balance !== undefined)
125
+ lines.push(`- **Balance**: ${t.balance}`);
126
+ if (t.accountNumber !== undefined)
127
+ lines.push(`- **Account Number**: ${t.accountNumber}`);
128
+ if (t.iban)
129
+ lines.push(`- **IBAN**: ${t.iban}`);
130
+ if (t.swift)
131
+ lines.push(`- **SWIFT/BIC**: ${t.swift}`);
132
+ lines.push("");
133
+ }
134
+ textContent = lines.join("\n");
135
+ }
136
+ }
137
+ else {
138
+ textContent = JSON.stringify(treasuries, null, 2);
139
+ }
140
+ return {
141
+ content: [{ type: "text", text: textContent }],
142
+ structuredContent: { treasuries, count: treasuries.length },
143
+ };
144
+ }));
145
+ // Get Treasury
146
+ server.registerTool("holded_invoicing_get_treasury", {
147
+ title: "Get Holded Treasury Account",
148
+ description: `Get a specific treasury/bank account by ID from Holded.
149
+
150
+ Args:
151
+ - treasury_id (string): The treasury account ID to retrieve (required)
152
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
153
+
154
+ Returns:
155
+ Treasury account details including balance and bank information.`,
156
+ inputSchema: GetTreasuryInputSchema,
157
+ annotations: {
158
+ readOnlyHint: true,
159
+ destructiveHint: false,
160
+ idempotentHint: true,
161
+ openWorldHint: true,
162
+ },
163
+ }, withErrorHandling(async (params) => {
164
+ const { treasury_id, response_format } = params;
165
+ const treasury = await makeApiRequest("invoicing", `treasury/${treasury_id}`, "GET");
166
+ let textContent;
167
+ if (response_format === ResponseFormat.MARKDOWN) {
168
+ const lines = [`# ${treasury.name}`, ""];
169
+ lines.push(`- **ID**: ${treasury.id}`);
170
+ lines.push(`- **Type**: ${treasury.type}`);
171
+ if (treasury.currency)
172
+ lines.push(`- **Currency**: ${treasury.currency}`);
173
+ if (treasury.balance !== undefined)
174
+ lines.push(`- **Balance**: ${treasury.balance}`);
175
+ if (treasury.accountNumber !== undefined)
176
+ lines.push(`- **Account Number**: ${treasury.accountNumber}`);
177
+ if (treasury.iban)
178
+ lines.push(`- **IBAN**: ${treasury.iban}`);
179
+ if (treasury.swift)
180
+ lines.push(`- **SWIFT/BIC**: ${treasury.swift}`);
181
+ if (treasury.bank)
182
+ lines.push(`- **Bank**: ${treasury.bank}`);
183
+ if (treasury.bankname)
184
+ lines.push(`- **Bank Name**: ${treasury.bankname}`);
185
+ textContent = lines.join("\n");
186
+ }
187
+ else {
188
+ textContent = JSON.stringify(treasury, null, 2);
189
+ }
190
+ return {
191
+ content: [{ type: "text", text: textContent }],
192
+ structuredContent: toStructuredContent(treasury),
193
+ };
194
+ }));
195
+ }
196
+ //# sourceMappingURL=treasury.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treasury.js","sourceRoot":"","sources":["../../../src/tools/invoicing/treasury.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Warehouse tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { Warehouse } from "../../types.js";
6
+ /**
7
+ * Format warehouses as markdown
8
+ */
9
+ export declare function formatWarehousesMarkdown(warehouses: Warehouse[]): string;
10
+ /**
11
+ * Format a single warehouse as markdown
12
+ */
13
+ export declare function formatWarehouseMarkdown(warehouse: Warehouse): string;
14
+ /**
15
+ * Register all warehouse-related tools
16
+ */
17
+ export declare function registerWarehouseTools(server: McpServer): void;
18
+ //# sourceMappingURL=warehouses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warehouses.d.ts","sourceRoot":"","sources":["../../../src/tools/invoicing/warehouses.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAU3C;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAsBxE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAiBpE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuE9D"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Warehouse tools for Holded API
3
+ */
4
+ import { ListWarehousesInputSchema, GetWarehouseInputSchema, CreateWarehouseInputSchema, UpdateWarehouseInputSchema, DeleteWarehouseInputSchema, } from "../../schemas/invoicing/warehouses.js";
5
+ import { registerCrudTools } from "../factory.js";
6
+ /**
7
+ * Format warehouses as markdown
8
+ */
9
+ export function formatWarehousesMarkdown(warehouses) {
10
+ if (!warehouses.length) {
11
+ return "No warehouses found.";
12
+ }
13
+ const lines = ["# Warehouses", "", `Found ${warehouses.length} warehouses:`, ""];
14
+ for (const warehouse of warehouses) {
15
+ lines.push(`## ${warehouse.name}`);
16
+ lines.push(`- **ID**: ${warehouse.id}`);
17
+ if (warehouse.address) {
18
+ const addr = warehouse.address;
19
+ if (addr.address)
20
+ lines.push(`- **Address**: ${addr.address}`);
21
+ if (addr.city)
22
+ lines.push(`- **City**: ${addr.city}`);
23
+ if (addr.postalCode)
24
+ lines.push(`- **Postal Code**: ${addr.postalCode}`);
25
+ if (addr.country)
26
+ lines.push(`- **Country**: ${addr.country}`);
27
+ }
28
+ if (warehouse.active !== undefined)
29
+ lines.push(`- **Active**: ${warehouse.active ? "Yes" : "No"}`);
30
+ lines.push("");
31
+ }
32
+ return lines.join("\n");
33
+ }
34
+ /**
35
+ * Format a single warehouse as markdown
36
+ */
37
+ export function formatWarehouseMarkdown(warehouse) {
38
+ const lines = [`# ${warehouse.name}`, "", `**ID**: ${warehouse.id}`, ""];
39
+ if (warehouse.address) {
40
+ lines.push("### Address");
41
+ const addr = warehouse.address;
42
+ if (addr.address)
43
+ lines.push(`- ${addr.address}`);
44
+ if (addr.city)
45
+ lines.push(`- ${addr.city}`);
46
+ if (addr.postalCode)
47
+ lines.push(`- ${addr.postalCode}`);
48
+ if (addr.province)
49
+ lines.push(`- ${addr.province}`);
50
+ if (addr.country)
51
+ lines.push(`- ${addr.country}`);
52
+ lines.push("");
53
+ }
54
+ if (warehouse.active !== undefined)
55
+ lines.push(`- **Active**: ${warehouse.active ? "Yes" : "No"}`);
56
+ return lines.join("\n");
57
+ }
58
+ /**
59
+ * Register all warehouse-related tools
60
+ */
61
+ export function registerWarehouseTools(server) {
62
+ registerCrudTools(server, {
63
+ module: "invoicing",
64
+ toolPrefix: "holded_invoicing",
65
+ resource: "warehouse",
66
+ resourcePlural: "warehouses",
67
+ endpoint: "warehouses",
68
+ idParam: "warehouse_id",
69
+ schemas: {
70
+ list: ListWarehousesInputSchema,
71
+ get: GetWarehouseInputSchema,
72
+ create: CreateWarehouseInputSchema,
73
+ update: UpdateWarehouseInputSchema,
74
+ delete: DeleteWarehouseInputSchema,
75
+ },
76
+ titles: {
77
+ list: "List Holded Warehouses",
78
+ get: "Get Holded Warehouse",
79
+ create: "Create Holded Warehouse",
80
+ update: "Update Holded Warehouse",
81
+ delete: "Delete Holded Warehouse",
82
+ },
83
+ descriptions: {
84
+ list: `List all warehouses from Holded.
85
+
86
+ Args:
87
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
88
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
89
+
90
+ Returns:
91
+ Array of warehouses with id, name, address, and status.`,
92
+ get: `Get a specific warehouse by ID from Holded.
93
+
94
+ Args:
95
+ - warehouse_id (string): The warehouse ID to retrieve (required)
96
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
97
+
98
+ Returns:
99
+ Warehouse details including name, address, and status.`,
100
+ create: `Create a new warehouse in Holded.
101
+
102
+ Args:
103
+ - name (string): Warehouse name (required)
104
+ - address (object): Warehouse address
105
+ - active (boolean): Whether the warehouse is active
106
+
107
+ Returns:
108
+ The created warehouse with its assigned ID.`,
109
+ update: `Update an existing warehouse in Holded.
110
+
111
+ Args:
112
+ - warehouse_id (string): The warehouse ID to update (required)
113
+ - name (string): Warehouse name
114
+ - address (object): Warehouse address
115
+ - active (boolean): Whether the warehouse is active
116
+
117
+ Returns:
118
+ The updated warehouse.`,
119
+ delete: `Delete a warehouse from Holded.
120
+
121
+ Args:
122
+ - warehouse_id (string): The warehouse ID to delete (required)
123
+
124
+ Returns:
125
+ Confirmation of deletion.`,
126
+ },
127
+ formatters: {
128
+ list: formatWarehousesMarkdown,
129
+ single: formatWarehouseMarkdown,
130
+ },
131
+ });
132
+ }
133
+ //# sourceMappingURL=warehouses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warehouses.js","sourceRoot":"","sources":["../../../src/tools/invoicing/warehouses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Projects module tools registration
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ /**
6
+ * Register all projects-related tools
7
+ */
8
+ export declare function registerProjectsTools(server: McpServer): void;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/projects/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAI7D"}