@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,240 @@
1
+ /**
2
+ * Account Balances tool for Holded API
3
+ *
4
+ * Computes accurate, date-scoped per-account debit/credit/balance totals
5
+ * by aggregating from individual daily ledger entries with cross-fiscal-year
6
+ * leak filtering.
7
+ */
8
+ import { makeApiRequest } from "../../services/api.js";
9
+ import { ResponseFormat } from "../../constants.js";
10
+ import { withErrorHandling } from "../utilities.js";
11
+ import { AccountBalancesInputSchema, } from "../../schemas/accounting/account-balances.js";
12
+ /** Maximum entry lines per page returned by the daily ledger API (docs say 500, actual is 250) */
13
+ const LEDGER_PAGE_SIZE = 250;
14
+ /**
15
+ * Fetch all daily ledger entry lines for a date range, auto-paginating.
16
+ */
17
+ async function fetchAllLedgerEntries(starttmp, endtmp) {
18
+ const allEntries = [];
19
+ let page = 1;
20
+ while (true) {
21
+ const queryParams = { starttmp, endtmp };
22
+ if (page > 1) {
23
+ queryParams.page = page;
24
+ }
25
+ const pageEntries = await makeApiRequest("accounting", "dailyledger", "GET", undefined, queryParams);
26
+ allEntries.push(...pageEntries);
27
+ if (pageEntries.length < LEDGER_PAGE_SIZE) {
28
+ break;
29
+ }
30
+ page++;
31
+ }
32
+ return { entries: allEntries, pagesFetched: page };
33
+ }
34
+ /**
35
+ * Entry types that legitimately appear at the fiscal year boundary timestamp.
36
+ * Any other type at that timestamp is considered a cross-year leak.
37
+ */
38
+ const BOUNDARY_SAFE_TYPES = new Set(["opening", "vat_regularization"]);
39
+ /**
40
+ * Filter out cross-fiscal-year leaked entries from daily ledger results.
41
+ *
42
+ * Detection uses two signals:
43
+ * 1. Entries sharing the same timestamp as the opening balance entry are candidates.
44
+ * 2. Candidates are confirmed as leaked if their entryNumber also appears at a
45
+ * different timestamp (duplicate = different fiscal year).
46
+ * 3. Fallback: candidates at the opening timestamp whose type is not "opening" or
47
+ * "vat_regularization" are excluded even without a duplicate entryNumber.
48
+ *
49
+ * Exported for unit testing.
50
+ */
51
+ export function filterLeakedEntries(entries, includeOpening) {
52
+ if (entries.length === 0) {
53
+ return { filtered: [], leakedCount: 0, openingExcluded: false };
54
+ }
55
+ // Step 1: Find opening entry timestamps
56
+ const openingTimestamps = new Set();
57
+ for (const e of entries) {
58
+ if (e.type === "opening") {
59
+ openingTimestamps.add(e.timestamp);
60
+ }
61
+ }
62
+ // No opening entry → no fiscal year boundary in range → no leakage possible
63
+ if (openingTimestamps.size === 0) {
64
+ return { filtered: [...entries], leakedCount: 0, openingExcluded: false };
65
+ }
66
+ // Step 2: Build a map of entryNumber → set of distinct timestamps
67
+ const entryNumberTimestamps = new Map();
68
+ for (const e of entries) {
69
+ let ts = entryNumberTimestamps.get(e.entryNumber);
70
+ if (!ts) {
71
+ ts = new Set();
72
+ entryNumberTimestamps.set(e.entryNumber, ts);
73
+ }
74
+ ts.add(e.timestamp);
75
+ }
76
+ // Step 3: Filter
77
+ let leakedCount = 0;
78
+ let openingExcluded = false;
79
+ const filtered = [];
80
+ for (const e of entries) {
81
+ const atBoundary = openingTimestamps.has(e.timestamp);
82
+ if (!atBoundary) {
83
+ // Not at boundary → always keep
84
+ filtered.push(e);
85
+ continue;
86
+ }
87
+ // At boundary: handle by type
88
+ if (e.type === "opening") {
89
+ if (includeOpening) {
90
+ filtered.push(e);
91
+ }
92
+ else {
93
+ openingExcluded = true;
94
+ }
95
+ continue;
96
+ }
97
+ if (BOUNDARY_SAFE_TYPES.has(e.type)) {
98
+ // vat_regularization at boundary is legitimate
99
+ filtered.push(e);
100
+ continue;
101
+ }
102
+ // Non-safe type at boundary → check for duplicate entryNumber (primary signal)
103
+ const timestamps = entryNumberTimestamps.get(e.entryNumber);
104
+ const hasDuplicate = timestamps.size > 1;
105
+ if (hasDuplicate) {
106
+ // Confirmed leak: same entryNumber exists at a different timestamp
107
+ leakedCount++;
108
+ }
109
+ else {
110
+ // Fallback: non-safe type at opening timestamp, no duplicate found.
111
+ // Still exclude — legitimate entries at the exact boundary are limited to safe types.
112
+ leakedCount++;
113
+ }
114
+ // Either way, this entry is excluded (not pushed to filtered)
115
+ }
116
+ return { filtered, leakedCount, openingExcluded };
117
+ }
118
+ /**
119
+ * Aggregate daily ledger entries into per-account debit/credit totals.
120
+ *
121
+ * Exported for unit testing.
122
+ */
123
+ export function aggregateByAccount(entries) {
124
+ const map = new Map();
125
+ for (const e of entries) {
126
+ let acc = map.get(e.account);
127
+ if (!acc) {
128
+ acc = { debit: 0, credit: 0 };
129
+ map.set(e.account, acc);
130
+ }
131
+ acc.debit += e.debit;
132
+ acc.credit += e.credit;
133
+ }
134
+ return map;
135
+ }
136
+ /**
137
+ * Format account balances as markdown
138
+ */
139
+ export function formatAccountBalancesMarkdown(accounts) {
140
+ if (!accounts.length) {
141
+ return "No account balances found for the requested period.";
142
+ }
143
+ const lines = [
144
+ "# Account Balances",
145
+ "",
146
+ `Found ${accounts.length} accounts:`,
147
+ "",
148
+ "| Account | Name | Group | Debit | Credit | Balance |",
149
+ "|---------|------|-------|------:|-------:|--------:|",
150
+ ];
151
+ for (const a of accounts) {
152
+ lines.push(`| ${a.num} | ${a.name} | ${a.group} | ${a.debit.toFixed(2)} | ${a.credit.toFixed(2)} | ${a.balance.toFixed(2)} |`);
153
+ }
154
+ return lines.join("\n");
155
+ }
156
+ /**
157
+ * Register the account balances tool.
158
+ */
159
+ export function registerAccountBalancesTools(server) {
160
+ server.registerTool("holded_accounting_list_account_balances", {
161
+ title: "Holded Accounting Account Balances",
162
+ description: `Compute accurate, date-scoped per-account debit/credit/balance totals.
163
+
164
+ Aggregates from individual daily ledger entries and filters out cross-fiscal-year leakage to produce correct period-scoped balances.
165
+
166
+ Use this tool when you need account totals for a specific period (P&L, trial balance, balance sheet).
167
+
168
+ Args:
169
+ - starttmp (number): Period start as Unix timestamp (required)
170
+ - endtmp (number): Period end as Unix timestamp (required)
171
+ - account_filter (number[]): Filter to specific account numbers (optional, returns all if omitted)
172
+ - include_opening (boolean): Include opening balance entry in totals (default: false — set true for balance sheet, false for P&L)
173
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
174
+
175
+ Returns:
176
+ Per-account debit/credit/balance totals, plus metadata about filtered entries.`,
177
+ inputSchema: AccountBalancesInputSchema,
178
+ annotations: {
179
+ readOnlyHint: true,
180
+ destructiveHint: false,
181
+ idempotentHint: true,
182
+ openWorldHint: true,
183
+ },
184
+ }, withErrorHandling(async (params) => {
185
+ const { starttmp, endtmp, account_filter, include_opening, response_format } = params;
186
+ // 1. Fetch all ledger entries (auto-paginate)
187
+ const { entries, pagesFetched } = await fetchAllLedgerEntries(starttmp, endtmp);
188
+ // 2. Filter leaked entries
189
+ const { filtered, leakedCount, openingExcluded } = filterLeakedEntries(entries, include_opening);
190
+ // 3. Aggregate by account
191
+ const totals = aggregateByAccount(filtered);
192
+ // 4. Enrich with account metadata from list_accounts
193
+ const accountMeta = await makeApiRequest("accounting", "chartofaccounts", "GET", undefined, { starttmp, endtmp, includeEmpty: 0 });
194
+ const metaByNum = new Map();
195
+ for (const a of accountMeta) {
196
+ metaByNum.set(a.num, a);
197
+ }
198
+ // 5. Build result
199
+ let accounts = [];
200
+ for (const [num, { debit, credit }] of totals) {
201
+ const meta = metaByNum.get(num);
202
+ accounts.push({
203
+ num,
204
+ name: meta?.name ?? String(num),
205
+ group: meta?.group ?? "",
206
+ debit: Math.round(debit * 100) / 100,
207
+ credit: Math.round(credit * 100) / 100,
208
+ balance: Math.round((debit - credit) * 100) / 100,
209
+ });
210
+ }
211
+ // 6. Apply account filter
212
+ if (account_filter && account_filter.length > 0) {
213
+ const filterSet = new Set(account_filter);
214
+ accounts = accounts.filter((a) => filterSet.has(a.num));
215
+ }
216
+ // Sort by account number
217
+ accounts.sort((a, b) => a.num - b.num);
218
+ const structured = {
219
+ accounts,
220
+ count: accounts.length,
221
+ period: {
222
+ starttmp,
223
+ endtmp,
224
+ },
225
+ filtered_entries: {
226
+ leaked_cross_year: leakedCount,
227
+ opening_balance_excluded: openingExcluded,
228
+ },
229
+ pages_fetched: pagesFetched,
230
+ };
231
+ const textContent = response_format === ResponseFormat.MARKDOWN
232
+ ? formatAccountBalancesMarkdown(accounts)
233
+ : JSON.stringify(structured, null, 2);
234
+ return {
235
+ content: [{ type: "text", text: textContent }],
236
+ structuredContent: structured,
237
+ };
238
+ }));
239
+ }
240
+ //# sourceMappingURL=account-balances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-balances.js","sourceRoot":"","sources":["../../../src/tools/accounting/account-balances.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,0BAA0B,GAE3B,MAAM,8CAA8C,CAAC;AAEtD,kGAAkG;AAClG,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAY7B;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAClC,QAAgB,EAChB,MAAc;IAEd,MAAM,UAAU,GAAsB,EAAE,CAAC;IACzC,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,WAAW,GAA4B,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAClE,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,cAAc,CACtC,YAAY,EACZ,aAAa,EACb,KAAK,EACL,SAAS,EACT,WAAW,CACZ,CAAC;QAEF,UAAU,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;QAEhC,IAAI,WAAW,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAC1C,MAAM;QACR,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAEvE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA0B,EAC1B,cAAuB;IAEvB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAClE,CAAC;IAED,wCAAwC;IACxC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACzB,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,IAAI,iBAAiB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAC5E,CAAC;IAED,kEAAkE;IAClE,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,EAAE,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;YACf,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACtB,CAAC;IAED,iBAAiB;IACjB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEtD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,gCAAgC;YAChC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,cAAc,EAAE,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,eAAe,GAAG,IAAI,CAAC;YACzB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,+CAA+C;YAC/C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QAED,+EAA+E;QAC/E,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAE,CAAC;QAC7D,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;QAEzC,IAAI,YAAY,EAAE,CAAC;YACjB,mEAAmE;YACnE,WAAW,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,sFAAsF;YACtF,WAAW,EAAE,CAAC;QAChB,CAAC;QACD,8DAA8D;IAChE,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA0B;IAE1B,MAAM,GAAG,GAAG,IAAI,GAAG,EAA6C,CAAC;IAEjE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;QACrB,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC;IACzB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAAC,QAA0B;IACtE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,oBAAoB;QACpB,EAAE;QACF,SAAS,QAAQ,CAAC,MAAM,YAAY;QACpC,EAAE;QACF,uDAAuD;QACvD,uDAAuD;KACxD,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACnH,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,YAAY,CACjB,yCAAyC,EACzC;QACE,KAAK,EAAE,oCAAoC;QAC3C,WAAW,EAAE;;;;;;;;;;;;;;iFAc8D;QAC3E,WAAW,EAAE,0BAA0B;QACvC,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,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,GAAG,MAAyC,CAAC;QAEzH,8CAA8C;QAC9C,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,qBAAqB,CAC3D,QAAQ,EACR,MAAM,CACP,CAAC;QAEF,2BAA2B;QAC3B,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,mBAAmB,CACpE,OAAO,EACP,eAAe,CAChB,CAAC;QAEF,0BAA0B;QAC1B,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAE5C,qDAAqD;QACrD,MAAM,WAAW,GAAG,MAAM,cAAc,CACtC,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,SAAS,EACT,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,CACtC,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC;QAED,kBAAkB;QAClB,IAAI,QAAQ,GAAqB,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC;gBACZ,GAAG;gBACH,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC;gBAC/B,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;gBACxB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG;gBACpC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG;gBACtC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;aAClD,CAAC,CAAC;QACL,CAAC;QAED,0BAA0B;QAC1B,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;YAC1C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,yBAAyB;QACzB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAEvC,MAAM,UAAU,GAAG;YACjB,QAAQ;YACR,KAAK,EAAE,QAAQ,CAAC,MAAM;YACtB,MAAM,EAAE;gBACN,QAAQ;gBACR,MAAM;aACP;YACD,gBAAgB,EAAE;gBAChB,iBAAiB,EAAE,WAAW;gBAC9B,wBAAwB,EAAE,eAAe;aAC1C;YACD,aAAa,EAAE,YAAY;SAC5B,CAAC;QAEF,MAAM,WAAW,GACf,eAAe,KAAK,cAAc,CAAC,QAAQ;YACzC,CAAC,CAAC,6BAA6B,CAAC,QAAQ,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YAC9C,iBAAiB,EAAE,UAAU;SAC9B,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Accounting Account tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { AccountingAccount } from "../../types.js";
6
+ /**
7
+ * Format accounting accounts as markdown
8
+ */
9
+ export declare function formatAccountingAccountsMarkdown(accounts: AccountingAccount[]): string;
10
+ /**
11
+ * Format a single accounting account as markdown
12
+ */
13
+ export declare function formatAccountingAccountMarkdown(account: AccountingAccount): string;
14
+ /**
15
+ * Register all accounting account-related tools
16
+ */
17
+ export declare function registerAccountTools(server: McpServer): void;
18
+ //# sourceMappingURL=accounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/tools/accounting/accounts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAUnD;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAiBtF;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAOlF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwF5D"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Accounting Account tools for Holded API
3
+ */
4
+ import { ListAccountingAccountsInputSchema, CreateAccountInputSchema, GetAccountInputSchema, UpdateAccountInputSchema, DeleteAccountInputSchema, } from "../../schemas/accounting/accounts.js";
5
+ import { registerCrudTools } from "../factory.js";
6
+ /**
7
+ * Format accounting accounts as markdown
8
+ */
9
+ export function formatAccountingAccountsMarkdown(accounts) {
10
+ if (!accounts.length) {
11
+ return "No accounting accounts found.";
12
+ }
13
+ const lines = ["# Accounting Accounts", "", `Found ${accounts.length} accounts:`, ""];
14
+ for (const account of accounts) {
15
+ lines.push(`## ${account.name}`);
16
+ lines.push(`- **ID**: ${account.id}`);
17
+ lines.push(`- **Code**: ${account.code}`);
18
+ if (account.type)
19
+ lines.push(`- **Type**: ${account.type}`);
20
+ if (account.parentId)
21
+ lines.push(`- **Parent ID**: ${account.parentId}`);
22
+ lines.push("");
23
+ }
24
+ return lines.join("\n");
25
+ }
26
+ /**
27
+ * Format a single accounting account as markdown
28
+ */
29
+ export function formatAccountingAccountMarkdown(account) {
30
+ const lines = [`# ${account.name}`, "", `**ID**: ${account.id}`, ""];
31
+ lines.push(`- **Code**: ${account.code}`);
32
+ if (account.type)
33
+ lines.push(`- **Type**: ${account.type}`);
34
+ if (account.parentId)
35
+ lines.push(`- **Parent ID**: ${account.parentId}`);
36
+ return lines.join("\n");
37
+ }
38
+ /**
39
+ * Register all accounting account-related tools
40
+ */
41
+ export function registerAccountTools(server) {
42
+ registerCrudTools(server, {
43
+ module: "accounting",
44
+ toolPrefix: "holded_accounting",
45
+ resource: "account",
46
+ resourcePlural: "accounts",
47
+ endpoint: "account",
48
+ listEndpoint: "chartofaccounts",
49
+ idParam: "account_id",
50
+ schemas: {
51
+ list: ListAccountingAccountsInputSchema,
52
+ get: GetAccountInputSchema,
53
+ create: CreateAccountInputSchema,
54
+ update: UpdateAccountInputSchema,
55
+ delete: DeleteAccountInputSchema,
56
+ },
57
+ titles: {
58
+ list: "List Holded Accounting Accounts",
59
+ get: "Get Holded Accounting Account",
60
+ create: "Create Holded Accounting Account",
61
+ update: "Update Holded Accounting Account",
62
+ delete: "Delete Holded Accounting Account",
63
+ },
64
+ descriptions: {
65
+ list: `List all accounting accounts (chart of accounts/PGC accounts) from Holded.
66
+
67
+ Returns paginated list of accounting accounts. Use page parameter to navigate through results.
68
+
69
+ For date-scoped account balances (debit/credit/balance totals for a specific period), use holded_accounting_list_account_balances instead.
70
+
71
+ Args:
72
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
73
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
74
+ - include_empty (boolean): Include empty accounts in the results (default: true)
75
+
76
+ Returns:
77
+ Array of accounting accounts with id, code, name, type, and parent account information.`,
78
+ get: `Get a specific accounting account by ID from Holded.
79
+
80
+ Args:
81
+ - account_id (string): The accounting account ID to retrieve (required)
82
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
83
+
84
+ Returns:
85
+ Accounting account details including code, name, type, and parent account.`,
86
+ create: `Create a new accounting account in Holded.
87
+
88
+ The prefix parameter takes a 4-digit integer that matches the prefix of the corresponding account in Holded.
89
+ The API will create an account at the next available number under this prefix.
90
+
91
+ Example: 7000 -> 70000001 (Sales)
92
+
93
+ Args:
94
+ - prefix (number): 4-digit prefix for the account code (required, e.g., 7000 for sales)
95
+ - name (string): Account name (uses parent account name if not provided)
96
+ - color (string): Account color as hex code (e.g., #FF0000)
97
+
98
+ Returns:
99
+ The created accounting account with its assigned code.`,
100
+ update: `Update an existing accounting account in Holded.
101
+
102
+ Args:
103
+ - account_id (string): The accounting account ID to update (required)
104
+ - name (string): Account name
105
+ - code (string): Account code
106
+ - type (string): Account type
107
+ - parentId (string): Parent account ID
108
+
109
+ Returns:
110
+ The updated accounting account.`,
111
+ delete: `Delete an accounting account from Holded.
112
+
113
+ Args:
114
+ - account_id (string): The accounting account ID to delete (required)
115
+
116
+ Returns:
117
+ Confirmation of deletion.`,
118
+ },
119
+ formatters: {
120
+ list: formatAccountingAccountsMarkdown,
121
+ single: formatAccountingAccountMarkdown,
122
+ },
123
+ listQueryParams: (params) => {
124
+ const qp = {};
125
+ if (params.include_empty !== undefined)
126
+ qp.includeEmpty = params.include_empty ? 1 : 0;
127
+ return qp;
128
+ },
129
+ });
130
+ }
131
+ //# sourceMappingURL=accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/tools/accounting/accounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Daily Ledger tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ /**
6
+ * Register all daily ledger-related tools
7
+ */
8
+ export declare function registerDailyLedgerTools(server: McpServer): void;
9
+ //# sourceMappingURL=daily-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-ledger.d.ts","sourceRoot":"","sources":["../../../src/tools/accounting/daily-ledger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYpE;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8HhE"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Daily Ledger 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 { ListDailyLedgerInputSchema, CreateEntryInputSchema, } from "../../schemas/accounting/daily-ledger.js";
8
+ /**
9
+ * Register all daily ledger-related tools
10
+ */
11
+ export function registerDailyLedgerTools(server) {
12
+ // List Daily Ledger Entries
13
+ server.registerTool("holded_accounting_list_daily_ledger", {
14
+ title: "List Holded Daily Ledger Entries",
15
+ description: `List daily ledger entries from Holded Accounting.
16
+
17
+ Args:
18
+ - starttmp (number): Starting timestamp as Unix timestamp (required, filters entries from this date)
19
+ - endtmp (number): Ending timestamp as Unix timestamp (required, filters entries until this date)
20
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
21
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
22
+
23
+ Note: The starttmp and endtmp parameters are required by the API. Results may include entries belonging to adjacent fiscal years whose timestamps fall near the period boundary. Pagination order is non-deterministic.
24
+
25
+ Returns:
26
+ Array of daily ledger entries with date, account, amount, and description.`,
27
+ inputSchema: ListDailyLedgerInputSchema,
28
+ annotations: {
29
+ readOnlyHint: true,
30
+ destructiveHint: false,
31
+ idempotentHint: true,
32
+ openWorldHint: true,
33
+ },
34
+ }, withErrorHandling(async (params) => {
35
+ const { starttmp, endtmp, page, response_format } = params;
36
+ const queryParams = {
37
+ starttmp,
38
+ endtmp,
39
+ };
40
+ if (page > 1) {
41
+ queryParams.page = page;
42
+ }
43
+ const entries = await makeApiRequest("accounting", "dailyledger", "GET", undefined, queryParams);
44
+ let textContent;
45
+ if (response_format === ResponseFormat.MARKDOWN) {
46
+ if (!entries.length) {
47
+ textContent = "No daily ledger entries found.";
48
+ }
49
+ else {
50
+ const lines = ["# Daily Ledger Entries", "", `Found ${entries.length} entries:`, ""];
51
+ for (const entry of entries) {
52
+ lines.push(`## Entry ${entry.id}`);
53
+ lines.push(`- **ID**: ${entry.id}`);
54
+ lines.push(`- **Date**: ${new Date(entry.date * 1000).toLocaleDateString()}`);
55
+ lines.push(`- **Account**: ${entry.account}`);
56
+ lines.push(`- **Amount**: ${entry.amount}`);
57
+ if (entry.description)
58
+ lines.push(`- **Description**: ${entry.description}`);
59
+ lines.push("");
60
+ }
61
+ textContent = lines.join("\n");
62
+ }
63
+ }
64
+ else {
65
+ textContent = JSON.stringify(entries, null, 2);
66
+ }
67
+ return {
68
+ content: [{ type: "text", text: textContent }],
69
+ structuredContent: { entries, count: entries.length, page },
70
+ };
71
+ }));
72
+ // Create Daily Ledger Entry
73
+ server.registerTool("holded_accounting_create_entry", {
74
+ title: "Create Holded Daily Ledger Entry",
75
+ description: `Create a new daily ledger entry in Holded Accounting.
76
+
77
+ Args:
78
+ - date (number): Entry date as Unix timestamp (required)
79
+ - lines (array): Array of entry lines, minimum 2 lines required (required)
80
+ Each line object contains:
81
+ - account (number): Accounting account number as integer (required)
82
+ - debit (number): Debit amount (optional, cannot have both debit and credit)
83
+ - credit (number): Credit amount (optional, cannot have both debit and credit)
84
+ - description (string): Line description (optional)
85
+ - tags (array): Array of tags for this entry line (optional)
86
+ - notes (string): Entry note (optional)
87
+
88
+ Requirements:
89
+ - At least 2 entry lines are required
90
+ - Each line must have either debit or credit (not both)
91
+ - Total debits must equal total credits
92
+ - Account numbers must match existing accounting accounts
93
+
94
+ Returns:
95
+ The created daily ledger entry with its assigned ID.`,
96
+ inputSchema: CreateEntryInputSchema,
97
+ annotations: {
98
+ readOnlyHint: false,
99
+ destructiveHint: false,
100
+ idempotentHint: false,
101
+ openWorldHint: true,
102
+ },
103
+ }, withErrorHandling(async (params) => {
104
+ const typedParams = params;
105
+ const response = await makeApiRequest("accounting", "entry", "POST", typedParams);
106
+ return {
107
+ content: [
108
+ {
109
+ type: "text",
110
+ text: `Daily ledger entry created successfully.\n\n${JSON.stringify(response, null, 2)}`,
111
+ },
112
+ ],
113
+ structuredContent: toStructuredContent(response),
114
+ };
115
+ }));
116
+ }
117
+ //# sourceMappingURL=daily-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-ledger.js","sourceRoot":"","sources":["../../../src/tools/accounting/daily-ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Accounting module tools registration
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ /**
6
+ * Register all accounting-related tools
7
+ */
8
+ export declare function registerAccountingTools(server: McpServer): void;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/accounting/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAI/D"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Accounting module tools registration
3
+ */
4
+ import { registerAccountTools } from "./accounts.js";
5
+ import { registerDailyLedgerTools } from "./daily-ledger.js";
6
+ import { registerAccountBalancesTools } from "./account-balances.js";
7
+ /**
8
+ * Register all accounting-related tools
9
+ */
10
+ export function registerAccountingTools(server) {
11
+ registerAccountTools(server);
12
+ registerDailyLedgerTools(server);
13
+ registerAccountBalancesTools(server);
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/accounting/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAErE;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,4BAA4B,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Booking tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { Booking } from "../../types.js";
6
+ /**
7
+ * Format bookings as markdown
8
+ */
9
+ export declare function formatBookingsMarkdown(bookings: Booking[]): string;
10
+ /**
11
+ * Format a single booking as markdown
12
+ */
13
+ export declare function formatBookingMarkdown(booking: Booking): string;
14
+ /**
15
+ * Register all booking-related tools
16
+ */
17
+ export declare function registerBookingTools(server: McpServer): void;
18
+ //# sourceMappingURL=bookings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bookings.d.ts","sourceRoot":"","sources":["../../../src/tools/crm/bookings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,OAAO,EAAkC,MAAM,gBAAgB,CAAC;AAezE;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CA0BlE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAsC9D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6M5D"}