parasut-node-sdk-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 (274) hide show
  1. package/.github/workflows/deploy.yaml +51 -0
  2. package/.github/workflows/npm-publish.yml +71 -0
  3. package/.travis.yml +15 -0
  4. package/.yo-rc.json +11 -0
  5. package/LICENSE +21 -0
  6. package/README.md +187 -0
  7. package/gulpfile.js +50 -0
  8. package/package.json +42 -0
  9. package/packages/parasut-mcp-server/README.md +312 -0
  10. package/packages/parasut-mcp-server/dist/client.d.ts +24 -0
  11. package/packages/parasut-mcp-server/dist/client.d.ts.map +1 -0
  12. package/packages/parasut-mcp-server/dist/client.js +46 -0
  13. package/packages/parasut-mcp-server/dist/client.js.map +1 -0
  14. package/packages/parasut-mcp-server/dist/config.d.ts +39 -0
  15. package/packages/parasut-mcp-server/dist/config.d.ts.map +1 -0
  16. package/packages/parasut-mcp-server/dist/config.js +74 -0
  17. package/packages/parasut-mcp-server/dist/config.js.map +1 -0
  18. package/packages/parasut-mcp-server/dist/index.d.ts +21 -0
  19. package/packages/parasut-mcp-server/dist/index.d.ts.map +1 -0
  20. package/packages/parasut-mcp-server/dist/index.js +26 -0
  21. package/packages/parasut-mcp-server/dist/index.js.map +1 -0
  22. package/packages/parasut-mcp-server/dist/server.d.ts +17 -0
  23. package/packages/parasut-mcp-server/dist/server.d.ts.map +1 -0
  24. package/packages/parasut-mcp-server/dist/server.js +61 -0
  25. package/packages/parasut-mcp-server/dist/server.js.map +1 -0
  26. package/packages/parasut-mcp-server/dist/tools/bills.d.ts +13 -0
  27. package/packages/parasut-mcp-server/dist/tools/bills.d.ts.map +1 -0
  28. package/packages/parasut-mcp-server/dist/tools/bills.js +387 -0
  29. package/packages/parasut-mcp-server/dist/tools/bills.js.map +1 -0
  30. package/packages/parasut-mcp-server/dist/tools/contacts.d.ts +13 -0
  31. package/packages/parasut-mcp-server/dist/tools/contacts.d.ts.map +1 -0
  32. package/packages/parasut-mcp-server/dist/tools/contacts.js +522 -0
  33. package/packages/parasut-mcp-server/dist/tools/contacts.js.map +1 -0
  34. package/packages/parasut-mcp-server/dist/tools/edocuments.d.ts +13 -0
  35. package/packages/parasut-mcp-server/dist/tools/edocuments.d.ts.map +1 -0
  36. package/packages/parasut-mcp-server/dist/tools/edocuments.js +514 -0
  37. package/packages/parasut-mcp-server/dist/tools/edocuments.js.map +1 -0
  38. package/packages/parasut-mcp-server/dist/tools/financial.d.ts +13 -0
  39. package/packages/parasut-mcp-server/dist/tools/financial.d.ts.map +1 -0
  40. package/packages/parasut-mcp-server/dist/tools/financial.js +321 -0
  41. package/packages/parasut-mcp-server/dist/tools/financial.js.map +1 -0
  42. package/packages/parasut-mcp-server/dist/tools/index.d.ts +19 -0
  43. package/packages/parasut-mcp-server/dist/tools/index.d.ts.map +1 -0
  44. package/packages/parasut-mcp-server/dist/tools/index.js +132 -0
  45. package/packages/parasut-mcp-server/dist/tools/index.js.map +1 -0
  46. package/packages/parasut-mcp-server/dist/tools/inventory.d.ts +11 -0
  47. package/packages/parasut-mcp-server/dist/tools/inventory.d.ts.map +1 -0
  48. package/packages/parasut-mcp-server/dist/tools/inventory.js +143 -0
  49. package/packages/parasut-mcp-server/dist/tools/inventory.js.map +1 -0
  50. package/packages/parasut-mcp-server/dist/tools/invoices.d.ts +16 -0
  51. package/packages/parasut-mcp-server/dist/tools/invoices.d.ts.map +1 -0
  52. package/packages/parasut-mcp-server/dist/tools/invoices.js +850 -0
  53. package/packages/parasut-mcp-server/dist/tools/invoices.js.map +1 -0
  54. package/packages/parasut-mcp-server/dist/tools/organization.d.ts +14 -0
  55. package/packages/parasut-mcp-server/dist/tools/organization.d.ts.map +1 -0
  56. package/packages/parasut-mcp-server/dist/tools/organization.js +377 -0
  57. package/packages/parasut-mcp-server/dist/tools/organization.js.map +1 -0
  58. package/packages/parasut-mcp-server/dist/tools/products.d.ts +13 -0
  59. package/packages/parasut-mcp-server/dist/tools/products.d.ts.map +1 -0
  60. package/packages/parasut-mcp-server/dist/tools/products.js +299 -0
  61. package/packages/parasut-mcp-server/dist/tools/products.js.map +1 -0
  62. package/packages/parasut-mcp-server/dist/utils/errors.d.ts +34 -0
  63. package/packages/parasut-mcp-server/dist/utils/errors.d.ts.map +1 -0
  64. package/packages/parasut-mcp-server/dist/utils/errors.js +217 -0
  65. package/packages/parasut-mcp-server/dist/utils/errors.js.map +1 -0
  66. package/packages/parasut-mcp-server/dist/utils/response.d.ts +94 -0
  67. package/packages/parasut-mcp-server/dist/utils/response.d.ts.map +1 -0
  68. package/packages/parasut-mcp-server/dist/utils/response.js +194 -0
  69. package/packages/parasut-mcp-server/dist/utils/response.js.map +1 -0
  70. package/packages/parasut-mcp-server/package-lock.json +2831 -0
  71. package/packages/parasut-mcp-server/package.json +70 -0
  72. package/packages/parasut-mcp-server/src/client.ts +55 -0
  73. package/packages/parasut-mcp-server/src/config.ts +99 -0
  74. package/packages/parasut-mcp-server/src/index.ts +27 -0
  75. package/packages/parasut-mcp-server/src/server.ts +79 -0
  76. package/packages/parasut-mcp-server/src/tools/bills.ts +416 -0
  77. package/packages/parasut-mcp-server/src/tools/contacts.ts +549 -0
  78. package/packages/parasut-mcp-server/src/tools/edocuments.ts +543 -0
  79. package/packages/parasut-mcp-server/src/tools/financial.ts +345 -0
  80. package/packages/parasut-mcp-server/src/tools/index.ts +158 -0
  81. package/packages/parasut-mcp-server/src/tools/inventory.ts +154 -0
  82. package/packages/parasut-mcp-server/src/tools/invoices.ts +905 -0
  83. package/packages/parasut-mcp-server/src/tools/organization.ts +405 -0
  84. package/packages/parasut-mcp-server/src/tools/products.ts +320 -0
  85. package/packages/parasut-mcp-server/src/utils/errors.ts +296 -0
  86. package/packages/parasut-mcp-server/src/utils/response.ts +280 -0
  87. package/packages/parasut-mcp-server/tsconfig.json +48 -0
  88. package/packages/parasut-node-sdk/README.md +393 -0
  89. package/packages/parasut-node-sdk/dist/client/HttpTransport.d.ts +92 -0
  90. package/packages/parasut-node-sdk/dist/client/HttpTransport.d.ts.map +1 -0
  91. package/packages/parasut-node-sdk/dist/client/HttpTransport.js +237 -0
  92. package/packages/parasut-node-sdk/dist/client/HttpTransport.js.map +1 -0
  93. package/packages/parasut-node-sdk/dist/client/JsonApi.d.ts +122 -0
  94. package/packages/parasut-node-sdk/dist/client/JsonApi.d.ts.map +1 -0
  95. package/packages/parasut-node-sdk/dist/client/JsonApi.js +192 -0
  96. package/packages/parasut-node-sdk/dist/client/JsonApi.js.map +1 -0
  97. package/packages/parasut-node-sdk/dist/client/OAuth.d.ts +117 -0
  98. package/packages/parasut-node-sdk/dist/client/OAuth.d.ts.map +1 -0
  99. package/packages/parasut-node-sdk/dist/client/OAuth.js +322 -0
  100. package/packages/parasut-node-sdk/dist/client/OAuth.js.map +1 -0
  101. package/packages/parasut-node-sdk/dist/client/ParasutClient.d.ts +198 -0
  102. package/packages/parasut-node-sdk/dist/client/ParasutClient.d.ts.map +1 -0
  103. package/packages/parasut-node-sdk/dist/client/ParasutClient.js +334 -0
  104. package/packages/parasut-node-sdk/dist/client/ParasutClient.js.map +1 -0
  105. package/packages/parasut-node-sdk/dist/client/QueryBuilder.d.ts +115 -0
  106. package/packages/parasut-node-sdk/dist/client/QueryBuilder.d.ts.map +1 -0
  107. package/packages/parasut-node-sdk/dist/client/QueryBuilder.js +206 -0
  108. package/packages/parasut-node-sdk/dist/client/QueryBuilder.js.map +1 -0
  109. package/packages/parasut-node-sdk/dist/client/RateLimiter.d.ts +77 -0
  110. package/packages/parasut-node-sdk/dist/client/RateLimiter.d.ts.map +1 -0
  111. package/packages/parasut-node-sdk/dist/client/RateLimiter.js +142 -0
  112. package/packages/parasut-node-sdk/dist/client/RateLimiter.js.map +1 -0
  113. package/packages/parasut-node-sdk/dist/client/RetryHandler.d.ts +88 -0
  114. package/packages/parasut-node-sdk/dist/client/RetryHandler.d.ts.map +1 -0
  115. package/packages/parasut-node-sdk/dist/client/RetryHandler.js +125 -0
  116. package/packages/parasut-node-sdk/dist/client/RetryHandler.js.map +1 -0
  117. package/packages/parasut-node-sdk/dist/client/errors.d.ts +87 -0
  118. package/packages/parasut-node-sdk/dist/client/errors.d.ts.map +1 -0
  119. package/packages/parasut-node-sdk/dist/client/errors.js +153 -0
  120. package/packages/parasut-node-sdk/dist/client/errors.js.map +1 -0
  121. package/packages/parasut-node-sdk/dist/generated/operations.d.ts +157 -0
  122. package/packages/parasut-node-sdk/dist/generated/operations.d.ts.map +1 -0
  123. package/packages/parasut-node-sdk/dist/generated/operations.js +1285 -0
  124. package/packages/parasut-node-sdk/dist/generated/operations.js.map +1 -0
  125. package/packages/parasut-node-sdk/dist/generated/types.d.ts +1743 -0
  126. package/packages/parasut-node-sdk/dist/generated/types.d.ts.map +1 -0
  127. package/packages/parasut-node-sdk/dist/generated/types.js +6 -0
  128. package/packages/parasut-node-sdk/dist/generated/types.js.map +1 -0
  129. package/packages/parasut-node-sdk/dist/index.d.ts +49 -0
  130. package/packages/parasut-node-sdk/dist/index.d.ts.map +1 -0
  131. package/packages/parasut-node-sdk/dist/index.js +91 -0
  132. package/packages/parasut-node-sdk/dist/index.js.map +1 -0
  133. package/packages/parasut-node-sdk/dist/resources/BaseResource.d.ts +143 -0
  134. package/packages/parasut-node-sdk/dist/resources/BaseResource.d.ts.map +1 -0
  135. package/packages/parasut-node-sdk/dist/resources/BaseResource.js +148 -0
  136. package/packages/parasut-node-sdk/dist/resources/BaseResource.js.map +1 -0
  137. package/packages/parasut-node-sdk/dist/resources/accounts.d.ts +71 -0
  138. package/packages/parasut-node-sdk/dist/resources/accounts.d.ts.map +1 -0
  139. package/packages/parasut-node-sdk/dist/resources/accounts.js +43 -0
  140. package/packages/parasut-node-sdk/dist/resources/accounts.js.map +1 -0
  141. package/packages/parasut-node-sdk/dist/resources/bankFees.d.ts +52 -0
  142. package/packages/parasut-node-sdk/dist/resources/bankFees.d.ts.map +1 -0
  143. package/packages/parasut-node-sdk/dist/resources/bankFees.js +25 -0
  144. package/packages/parasut-node-sdk/dist/resources/bankFees.js.map +1 -0
  145. package/packages/parasut-node-sdk/dist/resources/contacts.d.ts +62 -0
  146. package/packages/parasut-node-sdk/dist/resources/contacts.d.ts.map +1 -0
  147. package/packages/parasut-node-sdk/dist/resources/contacts.js +43 -0
  148. package/packages/parasut-node-sdk/dist/resources/contacts.js.map +1 -0
  149. package/packages/parasut-node-sdk/dist/resources/eArchives.d.ts +125 -0
  150. package/packages/parasut-node-sdk/dist/resources/eArchives.d.ts.map +1 -0
  151. package/packages/parasut-node-sdk/dist/resources/eArchives.js +100 -0
  152. package/packages/parasut-node-sdk/dist/resources/eArchives.js.map +1 -0
  153. package/packages/parasut-node-sdk/dist/resources/eInvoiceInboxes.d.ts +48 -0
  154. package/packages/parasut-node-sdk/dist/resources/eInvoiceInboxes.d.ts.map +1 -0
  155. package/packages/parasut-node-sdk/dist/resources/eInvoiceInboxes.js +46 -0
  156. package/packages/parasut-node-sdk/dist/resources/eInvoiceInboxes.js.map +1 -0
  157. package/packages/parasut-node-sdk/dist/resources/eInvoices.d.ts +104 -0
  158. package/packages/parasut-node-sdk/dist/resources/eInvoices.d.ts.map +1 -0
  159. package/packages/parasut-node-sdk/dist/resources/eInvoices.js +72 -0
  160. package/packages/parasut-node-sdk/dist/resources/eInvoices.js.map +1 -0
  161. package/packages/parasut-node-sdk/dist/resources/eSmms.d.ts +73 -0
  162. package/packages/parasut-node-sdk/dist/resources/eSmms.d.ts.map +1 -0
  163. package/packages/parasut-node-sdk/dist/resources/eSmms.js +59 -0
  164. package/packages/parasut-node-sdk/dist/resources/eSmms.js.map +1 -0
  165. package/packages/parasut-node-sdk/dist/resources/employees.d.ts +37 -0
  166. package/packages/parasut-node-sdk/dist/resources/employees.d.ts.map +1 -0
  167. package/packages/parasut-node-sdk/dist/resources/employees.js +31 -0
  168. package/packages/parasut-node-sdk/dist/resources/employees.js.map +1 -0
  169. package/packages/parasut-node-sdk/dist/resources/index.d.ts +26 -0
  170. package/packages/parasut-node-sdk/dist/resources/index.d.ts.map +1 -0
  171. package/packages/parasut-node-sdk/dist/resources/index.js +35 -0
  172. package/packages/parasut-node-sdk/dist/resources/index.js.map +1 -0
  173. package/packages/parasut-node-sdk/dist/resources/inventoryLevels.d.ts +25 -0
  174. package/packages/parasut-node-sdk/dist/resources/inventoryLevels.d.ts.map +1 -0
  175. package/packages/parasut-node-sdk/dist/resources/inventoryLevels.js +22 -0
  176. package/packages/parasut-node-sdk/dist/resources/inventoryLevels.js.map +1 -0
  177. package/packages/parasut-node-sdk/dist/resources/itemCategories.d.ts +31 -0
  178. package/packages/parasut-node-sdk/dist/resources/itemCategories.d.ts.map +1 -0
  179. package/packages/parasut-node-sdk/dist/resources/itemCategories.js +22 -0
  180. package/packages/parasut-node-sdk/dist/resources/itemCategories.js.map +1 -0
  181. package/packages/parasut-node-sdk/dist/resources/products.d.ts +50 -0
  182. package/packages/parasut-node-sdk/dist/resources/products.d.ts.map +1 -0
  183. package/packages/parasut-node-sdk/dist/resources/products.js +31 -0
  184. package/packages/parasut-node-sdk/dist/resources/products.js.map +1 -0
  185. package/packages/parasut-node-sdk/dist/resources/purchaseBills.d.ts +105 -0
  186. package/packages/parasut-node-sdk/dist/resources/purchaseBills.d.ts.map +1 -0
  187. package/packages/parasut-node-sdk/dist/resources/purchaseBills.js +67 -0
  188. package/packages/parasut-node-sdk/dist/resources/purchaseBills.js.map +1 -0
  189. package/packages/parasut-node-sdk/dist/resources/salaries.d.ts +50 -0
  190. package/packages/parasut-node-sdk/dist/resources/salaries.d.ts.map +1 -0
  191. package/packages/parasut-node-sdk/dist/resources/salaries.js +25 -0
  192. package/packages/parasut-node-sdk/dist/resources/salaries.js.map +1 -0
  193. package/packages/parasut-node-sdk/dist/resources/salesInvoices.d.ts +137 -0
  194. package/packages/parasut-node-sdk/dist/resources/salesInvoices.d.ts.map +1 -0
  195. package/packages/parasut-node-sdk/dist/resources/salesInvoices.js +84 -0
  196. package/packages/parasut-node-sdk/dist/resources/salesInvoices.js.map +1 -0
  197. package/packages/parasut-node-sdk/dist/resources/salesOffers.d.ts +72 -0
  198. package/packages/parasut-node-sdk/dist/resources/salesOffers.d.ts.map +1 -0
  199. package/packages/parasut-node-sdk/dist/resources/salesOffers.js +66 -0
  200. package/packages/parasut-node-sdk/dist/resources/salesOffers.js.map +1 -0
  201. package/packages/parasut-node-sdk/dist/resources/shipmentDocuments.d.ts +26 -0
  202. package/packages/parasut-node-sdk/dist/resources/shipmentDocuments.d.ts.map +1 -0
  203. package/packages/parasut-node-sdk/dist/resources/shipmentDocuments.js +16 -0
  204. package/packages/parasut-node-sdk/dist/resources/shipmentDocuments.js.map +1 -0
  205. package/packages/parasut-node-sdk/dist/resources/stockMovements.d.ts +27 -0
  206. package/packages/parasut-node-sdk/dist/resources/stockMovements.d.ts.map +1 -0
  207. package/packages/parasut-node-sdk/dist/resources/stockMovements.js +16 -0
  208. package/packages/parasut-node-sdk/dist/resources/stockMovements.js.map +1 -0
  209. package/packages/parasut-node-sdk/dist/resources/tags.d.ts +22 -0
  210. package/packages/parasut-node-sdk/dist/resources/tags.d.ts.map +1 -0
  211. package/packages/parasut-node-sdk/dist/resources/tags.js +16 -0
  212. package/packages/parasut-node-sdk/dist/resources/tags.js.map +1 -0
  213. package/packages/parasut-node-sdk/dist/resources/taxes.d.ts +50 -0
  214. package/packages/parasut-node-sdk/dist/resources/taxes.d.ts.map +1 -0
  215. package/packages/parasut-node-sdk/dist/resources/taxes.js +25 -0
  216. package/packages/parasut-node-sdk/dist/resources/taxes.js.map +1 -0
  217. package/packages/parasut-node-sdk/dist/resources/trackableJobs.d.ts +72 -0
  218. package/packages/parasut-node-sdk/dist/resources/trackableJobs.d.ts.map +1 -0
  219. package/packages/parasut-node-sdk/dist/resources/trackableJobs.js +108 -0
  220. package/packages/parasut-node-sdk/dist/resources/trackableJobs.js.map +1 -0
  221. package/packages/parasut-node-sdk/dist/resources/transactions.d.ts +26 -0
  222. package/packages/parasut-node-sdk/dist/resources/transactions.d.ts.map +1 -0
  223. package/packages/parasut-node-sdk/dist/resources/transactions.js +16 -0
  224. package/packages/parasut-node-sdk/dist/resources/transactions.js.map +1 -0
  225. package/packages/parasut-node-sdk/package-lock.json +4030 -0
  226. package/packages/parasut-node-sdk/package.json +71 -0
  227. package/packages/parasut-node-sdk/scripts/generate-types.ts +495 -0
  228. package/packages/parasut-node-sdk/src/client/HttpTransport.ts +334 -0
  229. package/packages/parasut-node-sdk/src/client/JsonApi.ts +314 -0
  230. package/packages/parasut-node-sdk/src/client/OAuth.ts +446 -0
  231. package/packages/parasut-node-sdk/src/client/ParasutClient.ts +423 -0
  232. package/packages/parasut-node-sdk/src/client/QueryBuilder.ts +292 -0
  233. package/packages/parasut-node-sdk/src/client/RateLimiter.ts +190 -0
  234. package/packages/parasut-node-sdk/src/client/RetryHandler.ts +216 -0
  235. package/packages/parasut-node-sdk/src/client/errors.ts +209 -0
  236. package/packages/parasut-node-sdk/src/generated/operations.ts +1454 -0
  237. package/packages/parasut-node-sdk/src/generated/types.ts +1856 -0
  238. package/packages/parasut-node-sdk/src/index.ts +235 -0
  239. package/packages/parasut-node-sdk/src/resources/BaseResource.ts +275 -0
  240. package/packages/parasut-node-sdk/src/resources/accounts.ts +108 -0
  241. package/packages/parasut-node-sdk/src/resources/bankFees.ts +74 -0
  242. package/packages/parasut-node-sdk/src/resources/contacts.ts +96 -0
  243. package/packages/parasut-node-sdk/src/resources/eArchives.ts +202 -0
  244. package/packages/parasut-node-sdk/src/resources/eInvoiceInboxes.ts +78 -0
  245. package/packages/parasut-node-sdk/src/resources/eInvoices.ts +166 -0
  246. package/packages/parasut-node-sdk/src/resources/eSmms.ts +132 -0
  247. package/packages/parasut-node-sdk/src/resources/employees.ts +69 -0
  248. package/packages/parasut-node-sdk/src/resources/index.ts +44 -0
  249. package/packages/parasut-node-sdk/src/resources/inventoryLevels.ts +45 -0
  250. package/packages/parasut-node-sdk/src/resources/itemCategories.ts +49 -0
  251. package/packages/parasut-node-sdk/src/resources/products.ts +78 -0
  252. package/packages/parasut-node-sdk/src/resources/purchaseBills.ts +162 -0
  253. package/packages/parasut-node-sdk/src/resources/salaries.ts +72 -0
  254. package/packages/parasut-node-sdk/src/resources/salesInvoices.ts +194 -0
  255. package/packages/parasut-node-sdk/src/resources/salesOffers.ts +149 -0
  256. package/packages/parasut-node-sdk/src/resources/shipmentDocuments.ts +40 -0
  257. package/packages/parasut-node-sdk/src/resources/stockMovements.ts +41 -0
  258. package/packages/parasut-node-sdk/src/resources/tags.ts +32 -0
  259. package/packages/parasut-node-sdk/src/resources/taxes.ts +68 -0
  260. package/packages/parasut-node-sdk/src/resources/trackableJobs.ts +167 -0
  261. package/packages/parasut-node-sdk/src/resources/transactions.ts +40 -0
  262. package/packages/parasut-node-sdk/tsconfig.json +47 -0
  263. package/scripts/build.js +14 -0
  264. package/scripts/deploy-branch.js +16 -0
  265. package/spec/README.md +24 -0
  266. package/spec/code_samples/README.md +9 -0
  267. package/spec/swagger.yaml +19616 -0
  268. package/web/CNAME +1 -0
  269. package/web/custom.css +34 -0
  270. package/web/favicon.ico +0 -0
  271. package/web/favicon.png +0 -0
  272. package/web/index.html +26 -0
  273. package/web/logo.png +0 -0
  274. package/web/v4.html +3 -0
@@ -0,0 +1,405 @@
1
+ /**
2
+ * Organization Tools
3
+ *
4
+ * Tools for categories, tags, employees, salaries, and taxes.
5
+ */
6
+
7
+ import { z } from 'zod';
8
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
9
+ import { getClient } from '../client.js';
10
+ import { formatSuccess, formatList, formatCreated, type ToolResponse } from '../utils/response.js';
11
+ import { handleError } from '../utils/errors.js';
12
+
13
+ // ============================================================================
14
+ // Schemas
15
+ // ============================================================================
16
+
17
+ const ListCategoriesSchema = z.object({
18
+ category_type: z
19
+ .enum(['Product', 'Contact', 'Employee', 'Salary', 'Tax', 'BankFee', 'PurchaseBill'])
20
+ .optional()
21
+ .describe('Filter by category type'),
22
+ });
23
+
24
+ const ListTagsSchema = z.object({
25
+ page: z.number().int().min(1).default(1),
26
+ limit: z.number().int().min(1).max(100).default(100),
27
+ });
28
+
29
+ const ListEmployeesSchema = z.object({
30
+ page: z.number().int().min(1).default(1),
31
+ limit: z.number().int().min(1).max(100).default(100),
32
+ });
33
+
34
+ const CreateSalarySchema = z.object({
35
+ employee_id: z.string().describe('Employee ID'),
36
+ amount: z.number().positive().describe('Salary amount'),
37
+ date: z.string().optional().describe('Salary date'),
38
+ description: z.string().optional().describe('Description'),
39
+ confirm: z.boolean().optional().describe('⚠️ Set to true to confirm salary payment. Required to execute.'),
40
+ });
41
+
42
+ const CreateTaxSchema = z.object({
43
+ amount: z.number().positive().describe('Tax amount'),
44
+ date: z.string().optional().describe('Tax date'),
45
+ tax_type: z
46
+ .enum(['kdv', 'stopaj', 'sgk', 'other'])
47
+ .default('other')
48
+ .describe('Tax type'),
49
+ description: z.string().optional().describe('Description'),
50
+ confirm: z.boolean().optional().describe('⚠️ Set to true to confirm tax payment. Required to execute.'),
51
+ });
52
+
53
+ // ============================================================================
54
+ // Tool Definitions
55
+ // ============================================================================
56
+
57
+ export const organizationTools: Tool[] = [
58
+ {
59
+ name: 'list_categories',
60
+ description: `
61
+ <usecase>
62
+ List item categories for organization.
63
+ Use when: Finding category IDs for products, contacts, or expenses.
64
+ Do NOT use when: Looking for tags (use list_tags instead).
65
+ </usecase>
66
+
67
+ <example>
68
+ list_categories()
69
+ list_categories(category_type="Product")
70
+ </example>
71
+
72
+ <returns>
73
+ List of categories with: id, name, category_type, bg_color.
74
+ </returns>
75
+ `.trim(),
76
+ inputSchema: {
77
+ type: 'object',
78
+ properties: {
79
+ category_type: {
80
+ type: 'string',
81
+ enum: ['Product', 'Contact', 'Employee', 'Salary', 'Tax', 'BankFee', 'PurchaseBill'],
82
+ description: 'Filter by type. MUST be one of: Product, Contact, Employee, Salary, Tax, BankFee, PurchaseBill',
83
+ },
84
+ },
85
+ },
86
+ },
87
+ {
88
+ name: 'list_tags',
89
+ description: `
90
+ <usecase>
91
+ List all tags used for organizing resources.
92
+ Use when: Finding tag IDs for filtering or applying to contacts/invoices.
93
+ Do NOT use when: Looking for categories (use list_categories instead).
94
+ </usecase>
95
+
96
+ <example>
97
+ list_tags()
98
+ </example>
99
+
100
+ <returns>
101
+ List of tags with: id, name.
102
+ </returns>
103
+ `.trim(),
104
+ inputSchema: {
105
+ type: 'object',
106
+ properties: {
107
+ page: { type: 'number', default: 1 },
108
+ limit: { type: 'number', default: 100 },
109
+ },
110
+ },
111
+ },
112
+ {
113
+ name: 'list_employees',
114
+ description: `
115
+ <usecase>
116
+ List all employees in the organization.
117
+ Use when: Finding employee IDs for salary payments.
118
+ Do NOT use when: Looking for contacts/customers (use search_contacts instead).
119
+ </usecase>
120
+
121
+ <example>
122
+ list_employees()
123
+ </example>
124
+
125
+ <returns>
126
+ List of employees with: id, name, email, iban.
127
+ Use the ID for create_salary.
128
+ </returns>
129
+ `.trim(),
130
+ inputSchema: {
131
+ type: 'object',
132
+ properties: {
133
+ page: { type: 'number', default: 1 },
134
+ limit: { type: 'number', default: 100 },
135
+ },
136
+ },
137
+ },
138
+ {
139
+ name: 'create_salary',
140
+ description: `
141
+ <usecase>
142
+ 💵 Record a salary payment for an employee. THIS AFFECTS FINANCIAL RECORDS.
143
+ Use when: Recording payroll or salary payments.
144
+ Do NOT use when: Recording supplier payments (use record_bill_payment instead).
145
+ </usecase>
146
+
147
+ <instructions>
148
+ ⚠️ REQUIRES CONFIRMATION: Set confirm=true to execute.
149
+ - employee_id: Employee ID (required)
150
+ - amount: Salary amount (required)
151
+ - confirm: Must be true to execute. Without confirm=true, returns preview only.
152
+ </instructions>
153
+
154
+ <example>
155
+ create_salary(employee_id="12345", amount=15000) # Preview only
156
+ create_salary(employee_id="12345", amount=15000, confirm=true) # Actually records
157
+ </example>
158
+
159
+ <returns>
160
+ Without confirm: Preview of salary to be recorded.
161
+ With confirm=true: Created salary record with: id, amount.
162
+ </returns>
163
+ `.trim(),
164
+ inputSchema: {
165
+ type: 'object',
166
+ properties: {
167
+ employee_id: { type: 'string', description: 'Employee ID (from list_employees)' },
168
+ amount: { type: 'number', description: 'Salary amount' },
169
+ confirm: { type: 'boolean', description: '⚠️ Set to true to confirm salary. Required to execute.' },
170
+ date: { type: 'string', description: 'Salary date (YYYY-MM-DD)' },
171
+ description: { type: 'string', description: 'Description' },
172
+ },
173
+ required: ['employee_id', 'amount'],
174
+ },
175
+ },
176
+ {
177
+ name: 'create_tax',
178
+ description: `
179
+ <usecase>
180
+ 🏛️ Record a tax payment. THIS AFFECTS FINANCIAL RECORDS.
181
+ Use when: Recording KDV, Stopaj, SGK, or other tax payments.
182
+ Do NOT use when: Recording bank fees (use create_bank_fee instead).
183
+ </usecase>
184
+
185
+ <instructions>
186
+ ⚠️ REQUIRES CONFIRMATION: Set confirm=true to execute.
187
+ - amount: Tax amount (required)
188
+ - tax_type: Must be kdv, stopaj, sgk, or other
189
+ - confirm: Must be true to execute. Without confirm=true, returns preview only.
190
+ </instructions>
191
+
192
+ <example>
193
+ create_tax(amount=5000, tax_type="kdv") # Preview only
194
+ create_tax(amount=5000, tax_type="kdv", confirm=true) # Actually records
195
+ </example>
196
+
197
+ <returns>
198
+ Without confirm: Preview of tax payment to be recorded.
199
+ With confirm=true: Created tax payment with: id, amount, type.
200
+ </returns>
201
+ `.trim(),
202
+ inputSchema: {
203
+ type: 'object',
204
+ properties: {
205
+ amount: { type: 'number', description: 'Tax amount' },
206
+ confirm: { type: 'boolean', description: '⚠️ Set to true to confirm tax payment. Required to execute.' },
207
+ date: { type: 'string', description: 'Tax date (YYYY-MM-DD)' },
208
+ tax_type: { type: 'string', enum: ['kdv', 'stopaj', 'sgk', 'other'], description: 'Tax type. MUST be one of: kdv, stopaj, sgk, other' },
209
+ description: { type: 'string', description: 'Description' },
210
+ },
211
+ required: ['amount'],
212
+ },
213
+ },
214
+ ];
215
+
216
+ // ============================================================================
217
+ // Handlers
218
+ // ============================================================================
219
+
220
+ export async function handleListCategories(args: unknown): Promise<ToolResponse> {
221
+ try {
222
+ const params = ListCategoriesSchema.parse(args);
223
+ const client = getClient();
224
+
225
+ const filter: Record<string, string> = {};
226
+ if (params.category_type) filter['category_type'] = params.category_type;
227
+
228
+ const response = await client.itemCategories.list({
229
+ filter,
230
+ page: { number: 1, size: 100 },
231
+ });
232
+
233
+ const categories = response.data.map((cat) => ({
234
+ id: cat.id,
235
+ name: cat.attributes.name,
236
+ category_type: cat.attributes.category_type,
237
+ bg_color: cat.attributes.bg_color,
238
+ }));
239
+
240
+ return formatSuccess({ categories }, {
241
+ summary: `Found ${categories.length} categories`,
242
+ });
243
+ } catch (error) {
244
+ return handleError(error, { operation: 'List categories' });
245
+ }
246
+ }
247
+
248
+ export async function handleListTags(args: unknown): Promise<ToolResponse> {
249
+ try {
250
+ const params = ListTagsSchema.parse(args);
251
+ const client = getClient();
252
+
253
+ const response = await client.tags.list({
254
+ page: { number: params.page, size: params.limit },
255
+ });
256
+
257
+ const tags = response.data.map((tag) => ({
258
+ id: tag.id,
259
+ name: tag.attributes.name,
260
+ }));
261
+
262
+ return formatList(tags, {
263
+ totalCount: response.meta.total_count,
264
+ currentPage: response.meta.current_page,
265
+ totalPages: response.meta.total_pages,
266
+ });
267
+ } catch (error) {
268
+ return handleError(error, { operation: 'List tags' });
269
+ }
270
+ }
271
+
272
+ export async function handleListEmployees(args: unknown): Promise<ToolResponse> {
273
+ try {
274
+ const params = ListEmployeesSchema.parse(args);
275
+ const client = getClient();
276
+
277
+ const response = await client.employees.list({
278
+ page: { number: params.page, size: params.limit },
279
+ });
280
+
281
+ const employees = response.data.map((emp) => ({
282
+ id: emp.id,
283
+ name: emp.attributes.name,
284
+ email: emp.attributes.email,
285
+ iban: emp.attributes.iban,
286
+ }));
287
+
288
+ return formatList(employees, {
289
+ totalCount: response.meta.total_count,
290
+ currentPage: response.meta.current_page,
291
+ totalPages: response.meta.total_pages,
292
+ }, {
293
+ nextSteps: [
294
+ { action: 'Record salary', example: 'create_salary(employee_id="<id>", amount=...)' },
295
+ ],
296
+ });
297
+ } catch (error) {
298
+ return handleError(error, { operation: 'List employees' });
299
+ }
300
+ }
301
+
302
+ export async function handleCreateSalary(args: unknown): Promise<ToolResponse> {
303
+ try {
304
+ const params = CreateSalarySchema.parse(args);
305
+ const client = getClient();
306
+
307
+ const issueDate = params.date ?? new Date().toISOString().split('T')[0]!;
308
+
309
+ // If not confirmed, return preview
310
+ if (!params.confirm) {
311
+ // Try to get employee info for preview
312
+ const employees = await client.employees.list({ page: { number: 1, size: 100 } });
313
+ const employee = employees.data.find(e => e.id === params.employee_id);
314
+
315
+ return formatSuccess({
316
+ preview: true,
317
+ salary_to_record: {
318
+ employee_id: params.employee_id,
319
+ employee_name: employee?.attributes.name ?? 'Unknown',
320
+ amount: params.amount,
321
+ date: issueDate,
322
+ description: params.description ?? 'Salary',
323
+ },
324
+ warning: '⚠️ This will record a salary payment and affect financial records. Call again with confirm=true to proceed.',
325
+ }, {
326
+ summary: `Preview: Record salary of ${params.amount} for ${employee?.attributes.name ?? 'employee'}`,
327
+ nextSteps: [
328
+ { action: 'Confirm salary', example: `create_salary(employee_id="${params.employee_id}", amount=${params.amount}, confirm=true)` },
329
+ ],
330
+ });
331
+ }
332
+
333
+ const response = await client.salaries.create({
334
+ data: {
335
+ type: 'salaries',
336
+ attributes: {
337
+ issue_date: issueDate,
338
+ due_date: issueDate,
339
+ description: params.description ?? 'Salary',
340
+ net_total: params.amount,
341
+ },
342
+ relationships: {
343
+ employee: {
344
+ data: { id: params.employee_id, type: 'employees' },
345
+ },
346
+ },
347
+ },
348
+ });
349
+
350
+ return formatCreated('Salary', {
351
+ id: response.data.id,
352
+ amount: params.amount,
353
+ });
354
+ } catch (error) {
355
+ return handleError(error, { operation: 'Create salary' });
356
+ }
357
+ }
358
+
359
+ export async function handleCreateTax(args: unknown): Promise<ToolResponse> {
360
+ try {
361
+ const params = CreateTaxSchema.parse(args);
362
+ const client = getClient();
363
+
364
+ const issueDate = params.date ?? new Date().toISOString().split('T')[0]!;
365
+
366
+ // If not confirmed, return preview
367
+ if (!params.confirm) {
368
+ return formatSuccess({
369
+ preview: true,
370
+ tax_to_record: {
371
+ amount: params.amount,
372
+ tax_type: params.tax_type,
373
+ date: issueDate,
374
+ description: params.description ?? `${params.tax_type} payment`,
375
+ },
376
+ warning: '⚠️ This will record a tax payment and affect financial records. Call again with confirm=true to proceed.',
377
+ }, {
378
+ summary: `Preview: Record ${params.tax_type.toUpperCase()} tax payment of ${params.amount}`,
379
+ nextSteps: [
380
+ { action: 'Confirm tax payment', example: `create_tax(amount=${params.amount}, tax_type="${params.tax_type}", confirm=true)` },
381
+ ],
382
+ });
383
+ }
384
+
385
+ const response = await client.taxes.create({
386
+ data: {
387
+ type: 'taxes',
388
+ attributes: {
389
+ issue_date: issueDate,
390
+ due_date: issueDate,
391
+ description: params.description ?? `${params.tax_type} payment`,
392
+ net_total: params.amount,
393
+ },
394
+ },
395
+ });
396
+
397
+ return formatCreated('Tax Payment', {
398
+ id: response.data.id,
399
+ amount: params.amount,
400
+ type: params.tax_type,
401
+ });
402
+ } catch (error) {
403
+ return handleError(error, { operation: 'Create tax' });
404
+ }
405
+ }