@stupidcodefactory/freeagent-mcp-server 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 (226) hide show
  1. package/README.md +187 -0
  2. package/dist/api/freeagent-client.d.ts +12 -0
  3. package/dist/api/freeagent-client.d.ts.map +1 -0
  4. package/dist/api/freeagent-client.js +114 -0
  5. package/dist/api/freeagent-client.js.map +1 -0
  6. package/dist/api/index.d.ts +7 -0
  7. package/dist/api/index.d.ts.map +1 -0
  8. package/dist/api/index.js +4 -0
  9. package/dist/api/index.js.map +1 -0
  10. package/dist/api/rate-limiter.d.ts +15 -0
  11. package/dist/api/rate-limiter.d.ts.map +1 -0
  12. package/dist/api/rate-limiter.js +62 -0
  13. package/dist/api/rate-limiter.js.map +1 -0
  14. package/dist/api/retry-handler.d.ts +14 -0
  15. package/dist/api/retry-handler.d.ts.map +1 -0
  16. package/dist/api/retry-handler.js +49 -0
  17. package/dist/api/retry-handler.js.map +1 -0
  18. package/dist/auth/index.d.ts +7 -0
  19. package/dist/auth/index.d.ts.map +1 -0
  20. package/dist/auth/index.js +4 -0
  21. package/dist/auth/index.js.map +1 -0
  22. package/dist/auth/oauth.d.ts +16 -0
  23. package/dist/auth/oauth.d.ts.map +1 -0
  24. package/dist/auth/oauth.js +64 -0
  25. package/dist/auth/oauth.js.map +1 -0
  26. package/dist/auth/token-manager.d.ts +10 -0
  27. package/dist/auth/token-manager.d.ts.map +1 -0
  28. package/dist/auth/token-manager.js +71 -0
  29. package/dist/auth/token-manager.js.map +1 -0
  30. package/dist/auth/token-store.d.ts +10 -0
  31. package/dist/auth/token-store.d.ts.map +1 -0
  32. package/dist/auth/token-store.js +84 -0
  33. package/dist/auth/token-store.js.map +1 -0
  34. package/dist/config.d.ts +73 -0
  35. package/dist/config.d.ts.map +1 -0
  36. package/dist/config.js +46 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +44 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/prompts/cash-flow-forecast.d.ts +12 -0
  43. package/dist/prompts/cash-flow-forecast.d.ts.map +1 -0
  44. package/dist/prompts/cash-flow-forecast.js +93 -0
  45. package/dist/prompts/cash-flow-forecast.js.map +1 -0
  46. package/dist/prompts/index.d.ts +8 -0
  47. package/dist/prompts/index.d.ts.map +1 -0
  48. package/dist/prompts/index.js +8 -0
  49. package/dist/prompts/index.js.map +1 -0
  50. package/dist/prompts/invoice-from-description.d.ts +12 -0
  51. package/dist/prompts/invoice-from-description.d.ts.map +1 -0
  52. package/dist/prompts/invoice-from-description.js +49 -0
  53. package/dist/prompts/invoice-from-description.js.map +1 -0
  54. package/dist/prompts/monthly-expense-summary.d.ts +12 -0
  55. package/dist/prompts/monthly-expense-summary.d.ts.map +1 -0
  56. package/dist/prompts/monthly-expense-summary.js +84 -0
  57. package/dist/prompts/monthly-expense-summary.js.map +1 -0
  58. package/dist/prompts/overdue-invoice-followup.d.ts +12 -0
  59. package/dist/prompts/overdue-invoice-followup.d.ts.map +1 -0
  60. package/dist/prompts/overdue-invoice-followup.js +63 -0
  61. package/dist/prompts/overdue-invoice-followup.js.map +1 -0
  62. package/dist/prompts/project-profitability.d.ts +12 -0
  63. package/dist/prompts/project-profitability.d.ts.map +1 -0
  64. package/dist/prompts/project-profitability.js +103 -0
  65. package/dist/prompts/project-profitability.js.map +1 -0
  66. package/dist/prompts/quarterly-tax-estimate.d.ts +12 -0
  67. package/dist/prompts/quarterly-tax-estimate.d.ts.map +1 -0
  68. package/dist/prompts/quarterly-tax-estimate.js +132 -0
  69. package/dist/prompts/quarterly-tax-estimate.js.map +1 -0
  70. package/dist/prompts/transaction-categorization.d.ts +12 -0
  71. package/dist/prompts/transaction-categorization.d.ts.map +1 -0
  72. package/dist/prompts/transaction-categorization.js +81 -0
  73. package/dist/prompts/transaction-categorization.js.map +1 -0
  74. package/dist/resources/bank-accounts.d.ts +8 -0
  75. package/dist/resources/bank-accounts.d.ts.map +1 -0
  76. package/dist/resources/bank-accounts.js +34 -0
  77. package/dist/resources/bank-accounts.js.map +1 -0
  78. package/dist/resources/bank-transactions.d.ts +11 -0
  79. package/dist/resources/bank-transactions.d.ts.map +1 -0
  80. package/dist/resources/bank-transactions.js +34 -0
  81. package/dist/resources/bank-transactions.js.map +1 -0
  82. package/dist/resources/bills.d.ts +13 -0
  83. package/dist/resources/bills.d.ts.map +1 -0
  84. package/dist/resources/bills.js +38 -0
  85. package/dist/resources/bills.js.map +1 -0
  86. package/dist/resources/categories.d.ts +4 -0
  87. package/dist/resources/categories.d.ts.map +1 -0
  88. package/dist/resources/categories.js +21 -0
  89. package/dist/resources/categories.js.map +1 -0
  90. package/dist/resources/company.d.ts +3 -0
  91. package/dist/resources/company.d.ts.map +1 -0
  92. package/dist/resources/company.js +12 -0
  93. package/dist/resources/company.js.map +1 -0
  94. package/dist/resources/contacts.d.ts +9 -0
  95. package/dist/resources/contacts.d.ts.map +1 -0
  96. package/dist/resources/contacts.js +37 -0
  97. package/dist/resources/contacts.js.map +1 -0
  98. package/dist/resources/expenses.d.ts +12 -0
  99. package/dist/resources/expenses.d.ts.map +1 -0
  100. package/dist/resources/expenses.js +36 -0
  101. package/dist/resources/expenses.js.map +1 -0
  102. package/dist/resources/index.d.ts +20 -0
  103. package/dist/resources/index.d.ts.map +1 -0
  104. package/dist/resources/index.js +12 -0
  105. package/dist/resources/index.js.map +1 -0
  106. package/dist/resources/invoices.d.ts +14 -0
  107. package/dist/resources/invoices.d.ts.map +1 -0
  108. package/dist/resources/invoices.js +40 -0
  109. package/dist/resources/invoices.js.map +1 -0
  110. package/dist/resources/projects.d.ts +10 -0
  111. package/dist/resources/projects.d.ts.map +1 -0
  112. package/dist/resources/projects.js +39 -0
  113. package/dist/resources/projects.js.map +1 -0
  114. package/dist/resources/timeslips.d.ts +12 -0
  115. package/dist/resources/timeslips.d.ts.map +1 -0
  116. package/dist/resources/timeslips.js +36 -0
  117. package/dist/resources/timeslips.js.map +1 -0
  118. package/dist/resources/users.d.ts +5 -0
  119. package/dist/resources/users.d.ts.map +1 -0
  120. package/dist/resources/users.js +30 -0
  121. package/dist/resources/users.js.map +1 -0
  122. package/dist/server.d.ts +9 -0
  123. package/dist/server.d.ts.map +1 -0
  124. package/dist/server.js +568 -0
  125. package/dist/server.js.map +1 -0
  126. package/dist/tools/bank-tools.d.ts +112 -0
  127. package/dist/tools/bank-tools.d.ts.map +1 -0
  128. package/dist/tools/bank-tools.js +143 -0
  129. package/dist/tools/bank-tools.js.map +1 -0
  130. package/dist/tools/bill-tools.d.ts +129 -0
  131. package/dist/tools/bill-tools.d.ts.map +1 -0
  132. package/dist/tools/bill-tools.js +121 -0
  133. package/dist/tools/bill-tools.js.map +1 -0
  134. package/dist/tools/contact-tools.d.ts +147 -0
  135. package/dist/tools/contact-tools.d.ts.map +1 -0
  136. package/dist/tools/contact-tools.js +140 -0
  137. package/dist/tools/contact-tools.js.map +1 -0
  138. package/dist/tools/index.d.ts +13 -0
  139. package/dist/tools/index.d.ts.map +1 -0
  140. package/dist/tools/index.js +13 -0
  141. package/dist/tools/index.js.map +1 -0
  142. package/dist/tools/invoice-tools.d.ts +171 -0
  143. package/dist/tools/invoice-tools.d.ts.map +1 -0
  144. package/dist/tools/invoice-tools.js +168 -0
  145. package/dist/tools/invoice-tools.js.map +1 -0
  146. package/dist/tools/project-tools.d.ts +117 -0
  147. package/dist/tools/project-tools.d.ts.map +1 -0
  148. package/dist/tools/project-tools.js +153 -0
  149. package/dist/tools/project-tools.js.map +1 -0
  150. package/dist/tools/query-tools.d.ts +91 -0
  151. package/dist/tools/query-tools.d.ts.map +1 -0
  152. package/dist/tools/query-tools.js +127 -0
  153. package/dist/tools/query-tools.js.map +1 -0
  154. package/dist/transformers/bank-transformer.d.ts +8 -0
  155. package/dist/transformers/bank-transformer.d.ts.map +1 -0
  156. package/dist/transformers/bank-transformer.js +46 -0
  157. package/dist/transformers/bank-transformer.js.map +1 -0
  158. package/dist/transformers/bill-transformer.d.ts +6 -0
  159. package/dist/transformers/bill-transformer.d.ts.map +1 -0
  160. package/dist/transformers/bill-transformer.js +34 -0
  161. package/dist/transformers/bill-transformer.js.map +1 -0
  162. package/dist/transformers/category-transformer.d.ts +5 -0
  163. package/dist/transformers/category-transformer.d.ts.map +1 -0
  164. package/dist/transformers/category-transformer.js +14 -0
  165. package/dist/transformers/category-transformer.js.map +1 -0
  166. package/dist/transformers/common.d.ts +7 -0
  167. package/dist/transformers/common.d.ts.map +1 -0
  168. package/dist/transformers/common.js +33 -0
  169. package/dist/transformers/common.js.map +1 -0
  170. package/dist/transformers/company-transformer.d.ts +4 -0
  171. package/dist/transformers/company-transformer.d.ts.map +1 -0
  172. package/dist/transformers/company-transformer.js +10 -0
  173. package/dist/transformers/company-transformer.js.map +1 -0
  174. package/dist/transformers/contact-transformer.d.ts +5 -0
  175. package/dist/transformers/contact-transformer.d.ts.map +1 -0
  176. package/dist/transformers/contact-transformer.js +18 -0
  177. package/dist/transformers/contact-transformer.js.map +1 -0
  178. package/dist/transformers/expense-transformer.d.ts +5 -0
  179. package/dist/transformers/expense-transformer.d.ts.map +1 -0
  180. package/dist/transformers/expense-transformer.js +19 -0
  181. package/dist/transformers/expense-transformer.js.map +1 -0
  182. package/dist/transformers/index.d.ts +11 -0
  183. package/dist/transformers/index.d.ts.map +1 -0
  184. package/dist/transformers/index.js +11 -0
  185. package/dist/transformers/index.js.map +1 -0
  186. package/dist/transformers/invoice-transformer.d.ts +6 -0
  187. package/dist/transformers/invoice-transformer.d.ts.map +1 -0
  188. package/dist/transformers/invoice-transformer.js +39 -0
  189. package/dist/transformers/invoice-transformer.js.map +1 -0
  190. package/dist/transformers/project-transformer.d.ts +9 -0
  191. package/dist/transformers/project-transformer.d.ts.map +1 -0
  192. package/dist/transformers/project-transformer.js +53 -0
  193. package/dist/transformers/project-transformer.js.map +1 -0
  194. package/dist/transformers/user-transformer.d.ts +5 -0
  195. package/dist/transformers/user-transformer.d.ts.map +1 -0
  196. package/dist/transformers/user-transformer.js +14 -0
  197. package/dist/transformers/user-transformer.js.map +1 -0
  198. package/dist/types/freeagent/index.d.ts +256 -0
  199. package/dist/types/freeagent/index.d.ts.map +1 -0
  200. package/dist/types/freeagent/index.js +3 -0
  201. package/dist/types/freeagent/index.js.map +1 -0
  202. package/dist/types/llm/index.d.ts +159 -0
  203. package/dist/types/llm/index.d.ts.map +1 -0
  204. package/dist/types/llm/index.js +3 -0
  205. package/dist/types/llm/index.js.map +1 -0
  206. package/dist/utils/error-handler.d.ts +11 -0
  207. package/dist/utils/error-handler.d.ts.map +1 -0
  208. package/dist/utils/error-handler.js +57 -0
  209. package/dist/utils/error-handler.js.map +1 -0
  210. package/dist/utils/index.d.ts +5 -0
  211. package/dist/utils/index.d.ts.map +1 -0
  212. package/dist/utils/index.js +5 -0
  213. package/dist/utils/index.js.map +1 -0
  214. package/dist/utils/sanitizer.d.ts +4 -0
  215. package/dist/utils/sanitizer.d.ts.map +1 -0
  216. package/dist/utils/sanitizer.js +42 -0
  217. package/dist/utils/sanitizer.js.map +1 -0
  218. package/dist/utils/validators.d.ts +19 -0
  219. package/dist/utils/validators.d.ts.map +1 -0
  220. package/dist/utils/validators.js +83 -0
  221. package/dist/utils/validators.js.map +1 -0
  222. package/dist/utils/zod-to-json-schema.d.ts +24 -0
  223. package/dist/utils/zod-to-json-schema.d.ts.map +1 -0
  224. package/dist/utils/zod-to-json-schema.js +141 -0
  225. package/dist/utils/zod-to-json-schema.js.map +1 -0
  226. package/package.json +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,QAAQ,aAAoD,CAAC;AAE1E,eAAO,MAAM,UAAU,aAGtB,CAAC;AAEF,eAAO,MAAM,YAAY,aAEe,CAAC;AAEzC,eAAO,MAAM,cAAc,2CAEa,CAAC;AAEzC,eAAO,MAAM,WAAW,aAA4C,CAAC;AAErE,eAAO,MAAM,SAAS,aAAgC,CAAC;AAGvD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGrD;AAGD,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhF;AAGD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAM3E;AAGD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKzE;AAGD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKzE;AAGD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKzE;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKtE;AAGD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAK7E;AAGD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKjF;AAGD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAK3E"}
@@ -0,0 +1,83 @@
1
+ import { z } from 'zod';
2
+ // Common validation schemas
3
+ export const idSchema = z.string().regex(/^\d+$/, 'Must be a numeric ID');
4
+ export const dateSchema = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be in YYYY-MM-DD format');
5
+ export const amountSchema = z.number()
6
+ .min(-999999999.99, 'Amount too small')
7
+ .max(999999999.99, 'Amount too large');
8
+ export const currencySchema = z.string()
9
+ .regex(/^[A-Z]{3}$/, 'Currency must be a 3-letter ISO code')
10
+ .transform((val) => val.toUpperCase());
11
+ export const emailSchema = z.string().email('Invalid email address');
12
+ export const urlSchema = z.string().url('Invalid URL');
13
+ // FreeAgent-specific URL to ID extraction
14
+ export function extractId(url) {
15
+ const match = url.match(/\/(\d+)$/);
16
+ return match?.[1] ?? url;
17
+ }
18
+ export function extractEntityType(url) {
19
+ const match = url.match(/\/v2\/(\w+)\/\d+$/);
20
+ return match?.[1] ?? 'unknown';
21
+ }
22
+ // Build FreeAgent URL from ID
23
+ export function buildUrl(entityType, id, baseUrl) {
24
+ return `${baseUrl}/${entityType}/${id}`;
25
+ }
26
+ // Parse numeric string to number (FreeAgent returns numbers as strings)
27
+ export function parseNumericString(value) {
28
+ if (value === undefined || value === null || value === '') {
29
+ return 0;
30
+ }
31
+ const parsed = parseFloat(value);
32
+ return isNaN(parsed) ? 0 : parsed;
33
+ }
34
+ // Validate and transform contact ID (accepts both URL and numeric ID)
35
+ export function normalizeContactId(input, baseUrl) {
36
+ if (input.startsWith('http')) {
37
+ return input;
38
+ }
39
+ return buildUrl('contacts', input, baseUrl);
40
+ }
41
+ // Validate and transform project ID
42
+ export function normalizeProjectId(input, baseUrl) {
43
+ if (input.startsWith('http')) {
44
+ return input;
45
+ }
46
+ return buildUrl('projects', input, baseUrl);
47
+ }
48
+ // Validate and transform invoice ID
49
+ export function normalizeInvoiceId(input, baseUrl) {
50
+ if (input.startsWith('http')) {
51
+ return input;
52
+ }
53
+ return buildUrl('invoices', input, baseUrl);
54
+ }
55
+ // Validate and transform bill ID
56
+ export function normalizeBillId(input, baseUrl) {
57
+ if (input.startsWith('http')) {
58
+ return input;
59
+ }
60
+ return buildUrl('bills', input, baseUrl);
61
+ }
62
+ // Validate and transform bank account ID
63
+ export function normalizeBankAccountId(input, baseUrl) {
64
+ if (input.startsWith('http')) {
65
+ return input;
66
+ }
67
+ return buildUrl('bank_accounts', input, baseUrl);
68
+ }
69
+ // Validate and transform bank transaction ID
70
+ export function normalizeBankTransactionId(input, baseUrl) {
71
+ if (input.startsWith('http')) {
72
+ return input;
73
+ }
74
+ return buildUrl('bank_transactions', input, baseUrl);
75
+ }
76
+ // Validate and transform category URL
77
+ export function normalizeCategoryUrl(input, baseUrl) {
78
+ if (input.startsWith('http')) {
79
+ return input;
80
+ }
81
+ return buildUrl('categories', input, baseUrl);
82
+ }
83
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ type JsonSchema = {
3
+ type?: string;
4
+ properties?: Record<string, JsonSchema>;
5
+ items?: JsonSchema;
6
+ required?: string[];
7
+ enum?: unknown[];
8
+ default?: unknown;
9
+ description?: string;
10
+ minimum?: number;
11
+ maximum?: number;
12
+ minLength?: number;
13
+ maxLength?: number;
14
+ pattern?: string;
15
+ minItems?: number;
16
+ maxItems?: number;
17
+ format?: string;
18
+ anyOf?: JsonSchema[];
19
+ allOf?: JsonSchema[];
20
+ oneOf?: JsonSchema[];
21
+ };
22
+ export declare function zodToJsonSchema(schema: z.ZodType): JsonSchema;
23
+ export {};
24
+ //# sourceMappingURL=zod-to-json-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-to-json-schema.d.ts","sourceRoot":"","sources":["../../src/utils/zod-to-json-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,KAAK,UAAU,GAAG;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB,CAAC;AAOF,wBAAgB,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,GAAG,UAAU,CAE7D"}
@@ -0,0 +1,141 @@
1
+ // Type guard helpers
2
+ function getTypeName(def) {
3
+ return def.typeName;
4
+ }
5
+ export function zodToJsonSchema(schema) {
6
+ return processZodType(schema);
7
+ }
8
+ function processZodType(schema) {
9
+ const def = schema._def;
10
+ const typeName = getTypeName(schema._def);
11
+ // Handle ZodEffects (refine, transform, etc.)
12
+ if (typeName === 'ZodEffects') {
13
+ return processZodType(def['schema']);
14
+ }
15
+ // Handle ZodDefault
16
+ if (typeName === 'ZodDefault') {
17
+ const inner = processZodType(def['innerType']);
18
+ inner.default = def['defaultValue']();
19
+ return inner;
20
+ }
21
+ // Handle ZodOptional
22
+ if (typeName === 'ZodOptional') {
23
+ return processZodType(def['innerType']);
24
+ }
25
+ // Handle ZodNullable
26
+ if (typeName === 'ZodNullable') {
27
+ const inner = processZodType(def['innerType']);
28
+ return { anyOf: [inner, { type: 'null' }] };
29
+ }
30
+ // Handle ZodString
31
+ if (typeName === 'ZodString') {
32
+ const result = { type: 'string' };
33
+ const checks = def['checks'];
34
+ for (const check of checks ?? []) {
35
+ if (check.kind === 'min')
36
+ result.minLength = check.value;
37
+ if (check.kind === 'max')
38
+ result.maxLength = check.value;
39
+ if (check.kind === 'regex' && check.regex)
40
+ result.pattern = check.regex.source;
41
+ if (check.kind === 'email')
42
+ result.format = 'email';
43
+ if (check.kind === 'url')
44
+ result.format = 'uri';
45
+ if (check.kind === 'length' && check.value !== undefined) {
46
+ result.minLength = check.value;
47
+ result.maxLength = check.value;
48
+ }
49
+ }
50
+ return result;
51
+ }
52
+ // Handle ZodNumber
53
+ if (typeName === 'ZodNumber') {
54
+ const result = { type: 'number' };
55
+ const checks = def['checks'];
56
+ for (const check of checks ?? []) {
57
+ if (check.kind === 'min')
58
+ result.minimum = check.value;
59
+ if (check.kind === 'max')
60
+ result.maximum = check.value;
61
+ if (check.kind === 'int')
62
+ result.type = 'integer';
63
+ }
64
+ return result;
65
+ }
66
+ // Handle ZodBoolean
67
+ if (typeName === 'ZodBoolean') {
68
+ return { type: 'boolean' };
69
+ }
70
+ // Handle ZodArray
71
+ if (typeName === 'ZodArray') {
72
+ const result = {
73
+ type: 'array',
74
+ items: processZodType(def['type']),
75
+ };
76
+ const minLength = def['minLength'];
77
+ const maxLength = def['maxLength'];
78
+ if (minLength?.value !== undefined)
79
+ result.minItems = minLength.value;
80
+ if (maxLength?.value !== undefined)
81
+ result.maxItems = maxLength.value;
82
+ return result;
83
+ }
84
+ // Handle ZodObject
85
+ if (typeName === 'ZodObject') {
86
+ const properties = {};
87
+ const required = [];
88
+ const shape = def['shape']();
89
+ for (const [key, value] of Object.entries(shape)) {
90
+ properties[key] = processZodType(value);
91
+ // Check if field is required
92
+ const fieldTypeName = getTypeName(value._def);
93
+ if (fieldTypeName !== 'ZodOptional' && fieldTypeName !== 'ZodDefault') {
94
+ required.push(key);
95
+ }
96
+ }
97
+ const result = {
98
+ type: 'object',
99
+ properties,
100
+ };
101
+ if (required.length > 0) {
102
+ result.required = required;
103
+ }
104
+ return result;
105
+ }
106
+ // Handle ZodEnum
107
+ if (typeName === 'ZodEnum') {
108
+ return {
109
+ type: 'string',
110
+ enum: def['values'],
111
+ };
112
+ }
113
+ // Handle ZodLiteral
114
+ if (typeName === 'ZodLiteral') {
115
+ const value = def['value'];
116
+ return {
117
+ type: typeof value,
118
+ enum: [value],
119
+ };
120
+ }
121
+ // Handle ZodUnion
122
+ if (typeName === 'ZodUnion') {
123
+ const options = def['options'];
124
+ return {
125
+ anyOf: options.map((opt) => processZodType(opt)),
126
+ };
127
+ }
128
+ // Handle ZodRecord
129
+ if (typeName === 'ZodRecord') {
130
+ return {
131
+ type: 'object',
132
+ };
133
+ }
134
+ // Handle ZodAny
135
+ if (typeName === 'ZodAny') {
136
+ return {};
137
+ }
138
+ // Fallback
139
+ return { type: 'string' };
140
+ }
141
+ //# sourceMappingURL=zod-to-json-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-to-json-schema.js","sourceRoot":"","sources":["../../src/utils/zod-to-json-schema.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@stupidcodefactory/freeagent-mcp-server",
3
+ "version": "1.0.0",
4
+ "description": "MCP Server for FreeAgent accounting API integration",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "freeagent-mcp-server": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsx watch src/index.ts",
18
+ "start": "node dist/index.js",
19
+ "test": "vitest",
20
+ "test:unit": "vitest run tests/unit",
21
+ "test:integration": "vitest run tests/integration",
22
+ "test:e2e": "vitest run tests/e2e",
23
+ "lint": "eslint src --ext .ts",
24
+ "typecheck": "tsc --noEmit"
25
+ },
26
+ "keywords": [
27
+ "mcp",
28
+ "freeagent",
29
+ "accounting",
30
+ "llm",
31
+ "model-context-protocol"
32
+ ],
33
+ "author": "",
34
+ "license": "MIT",
35
+ "engines": {
36
+ "node": ">=24.0.0"
37
+ },
38
+ "dependencies": {
39
+ "@modelcontextprotocol/sdk": "^1.0.0",
40
+ "zod": "^3.23.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^20.11.0",
44
+ "tsx": "^4.7.0",
45
+ "typescript": "^5.3.0",
46
+ "vitest": "^1.2.0"
47
+ }
48
+ }