@goodsamsoftware/freshbooks-mcp 1.0.1 → 1.0.3

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 (198) hide show
  1. package/dist/auth/confirmation-store.d.ts +94 -0
  2. package/dist/auth/confirmation-store.d.ts.map +1 -0
  3. package/dist/auth/confirmation-store.js +126 -0
  4. package/dist/auth/confirmation-store.js.map +1 -0
  5. package/dist/auth/state-store.d.ts +96 -0
  6. package/dist/auth/state-store.d.ts.map +1 -0
  7. package/dist/auth/state-store.js +122 -0
  8. package/dist/auth/state-store.js.map +1 -0
  9. package/dist/auth/types.d.ts +1 -1
  10. package/dist/auth/types.d.ts.map +1 -1
  11. package/dist/auth/types.js.map +1 -1
  12. package/dist/config/environment.d.ts +25 -0
  13. package/dist/config/environment.d.ts.map +1 -0
  14. package/dist/config/environment.js +39 -0
  15. package/dist/config/environment.js.map +1 -0
  16. package/dist/errors/error-handler.d.ts.map +1 -1
  17. package/dist/errors/error-handler.js +18 -5
  18. package/dist/errors/error-handler.js.map +1 -1
  19. package/dist/errors/response-formatter.d.ts +3 -2
  20. package/dist/errors/response-formatter.d.ts.map +1 -1
  21. package/dist/errors/response-formatter.js +19 -2
  22. package/dist/errors/response-formatter.js.map +1 -1
  23. package/dist/server.js +85 -11
  24. package/dist/server.js.map +1 -1
  25. package/dist/tools/base-tool.d.ts +2 -2
  26. package/dist/tools/bill/bill-create.d.ts +4 -4
  27. package/dist/tools/bill/bill-delete.d.ts +6 -0
  28. package/dist/tools/bill/bill-delete.d.ts.map +1 -1
  29. package/dist/tools/bill/bill-list.d.ts +12 -12
  30. package/dist/tools/bill/bill-single.d.ts +4 -4
  31. package/dist/tools/bill/schemas.d.ts +28 -22
  32. package/dist/tools/bill/schemas.d.ts.map +1 -1
  33. package/dist/tools/bill/schemas.js +2 -0
  34. package/dist/tools/bill/schemas.js.map +1 -1
  35. package/dist/tools/bill-payment/billpayment-create.d.ts +4 -4
  36. package/dist/tools/bill-payment/billpayment-delete.d.ts +6 -0
  37. package/dist/tools/bill-payment/billpayment-delete.d.ts.map +1 -1
  38. package/dist/tools/bill-payment/billpayment-list.d.ts +12 -12
  39. package/dist/tools/bill-payment/billpayment-single.d.ts +4 -4
  40. package/dist/tools/bill-payment/billpayment-update.d.ts +4 -4
  41. package/dist/tools/bill-payment/schemas.d.ts +28 -22
  42. package/dist/tools/bill-payment/schemas.d.ts.map +1 -1
  43. package/dist/tools/bill-payment/schemas.js +2 -0
  44. package/dist/tools/bill-payment/schemas.js.map +1 -1
  45. package/dist/tools/bill-vendor/billvendor-create.d.ts +6 -6
  46. package/dist/tools/bill-vendor/billvendor-delete.d.ts +6 -0
  47. package/dist/tools/bill-vendor/billvendor-delete.d.ts.map +1 -1
  48. package/dist/tools/bill-vendor/billvendor-list.d.ts +14 -14
  49. package/dist/tools/bill-vendor/billvendor-single.d.ts +4 -4
  50. package/dist/tools/bill-vendor/billvendor-update.d.ts +6 -6
  51. package/dist/tools/bill-vendor/schemas.d.ts +34 -28
  52. package/dist/tools/bill-vendor/schemas.d.ts.map +1 -1
  53. package/dist/tools/bill-vendor/schemas.js +2 -0
  54. package/dist/tools/bill-vendor/schemas.js.map +1 -1
  55. package/dist/tools/callback/callback-create.d.ts +6 -6
  56. package/dist/tools/callback/callback-delete.d.ts +6 -0
  57. package/dist/tools/callback/callback-delete.d.ts.map +1 -1
  58. package/dist/tools/callback/callback-list.d.ts +12 -12
  59. package/dist/tools/callback/callback-resend-verification.d.ts +4 -4
  60. package/dist/tools/callback/callback-single.d.ts +4 -4
  61. package/dist/tools/callback/callback-update.d.ts +6 -6
  62. package/dist/tools/callback/schemas.d.ts +32 -26
  63. package/dist/tools/callback/schemas.d.ts.map +1 -1
  64. package/dist/tools/callback/schemas.js +2 -0
  65. package/dist/tools/callback/schemas.js.map +1 -1
  66. package/dist/tools/client/client-create.d.ts +2 -2
  67. package/dist/tools/client/client-delete.d.ts +8 -2
  68. package/dist/tools/client/client-delete.d.ts.map +1 -1
  69. package/dist/tools/client/client-list.d.ts +9 -9
  70. package/dist/tools/client/client-update.d.ts +2 -2
  71. package/dist/tools/client/schemas.d.ts +26 -20
  72. package/dist/tools/client/schemas.d.ts.map +1 -1
  73. package/dist/tools/client/schemas.js +2 -0
  74. package/dist/tools/client/schemas.js.map +1 -1
  75. package/dist/tools/credit-note/creditnote-create.d.ts +10 -10
  76. package/dist/tools/credit-note/creditnote-delete.d.ts +6 -0
  77. package/dist/tools/credit-note/creditnote-delete.d.ts.map +1 -1
  78. package/dist/tools/credit-note/creditnote-list.d.ts +14 -14
  79. package/dist/tools/credit-note/creditnote-single.d.ts +6 -6
  80. package/dist/tools/credit-note/creditnote-update.d.ts +10 -10
  81. package/dist/tools/credit-note/schemas.d.ts +42 -36
  82. package/dist/tools/credit-note/schemas.d.ts.map +1 -1
  83. package/dist/tools/credit-note/schemas.js +2 -0
  84. package/dist/tools/credit-note/schemas.js.map +1 -1
  85. package/dist/tools/expense/expense-create.d.ts +2 -2
  86. package/dist/tools/expense/expense-delete.d.ts +6 -0
  87. package/dist/tools/expense/expense-delete.d.ts.map +1 -1
  88. package/dist/tools/expense/expense-list.d.ts +8 -8
  89. package/dist/tools/expense/expense-single.d.ts +2 -2
  90. package/dist/tools/expense/expense-update.d.ts +2 -2
  91. package/dist/tools/expense/expense-update.d.ts.map +1 -1
  92. package/dist/tools/expense/expense-update.js +73 -30
  93. package/dist/tools/expense/expense-update.js.map +1 -1
  94. package/dist/tools/expense/schemas.d.ts +18 -12
  95. package/dist/tools/expense/schemas.d.ts.map +1 -1
  96. package/dist/tools/expense/schemas.js +2 -0
  97. package/dist/tools/expense/schemas.js.map +1 -1
  98. package/dist/tools/expense-category/expensecategory-list.d.ts +4 -4
  99. package/dist/tools/expense-category/schemas.d.ts +4 -4
  100. package/dist/tools/invoice/invoice-create.d.ts +10 -10
  101. package/dist/tools/invoice/invoice-delete.d.ts +6 -0
  102. package/dist/tools/invoice/invoice-delete.d.ts.map +1 -1
  103. package/dist/tools/invoice/invoice-list.d.ts +24 -24
  104. package/dist/tools/invoice/invoice-single.d.ts +10 -10
  105. package/dist/tools/invoice/invoice-update.d.ts +12 -12
  106. package/dist/tools/invoice/schemas.d.ts +56 -50
  107. package/dist/tools/invoice/schemas.d.ts.map +1 -1
  108. package/dist/tools/invoice/schemas.js +2 -0
  109. package/dist/tools/invoice/schemas.js.map +1 -1
  110. package/dist/tools/item/item-create.d.ts +8 -8
  111. package/dist/tools/item/item-list.d.ts +18 -18
  112. package/dist/tools/item/item-single.d.ts +6 -6
  113. package/dist/tools/item/item-update.d.ts +10 -10
  114. package/dist/tools/item/schemas.d.ts +38 -38
  115. package/dist/tools/journal-entry/journalentry-create.d.ts +4 -4
  116. package/dist/tools/journal-entry/schemas.d.ts +8 -8
  117. package/dist/tools/journal-entry-account/journalentryaccount-list.d.ts +14 -14
  118. package/dist/tools/journal-entry-account/schemas.d.ts +24 -24
  119. package/dist/tools/metadata.d.ts +13 -1
  120. package/dist/tools/metadata.d.ts.map +1 -1
  121. package/dist/tools/metadata.js +68 -1
  122. package/dist/tools/metadata.js.map +1 -1
  123. package/dist/tools/other-income/otherincome-create.d.ts +10 -10
  124. package/dist/tools/other-income/otherincome-delete.d.ts +6 -0
  125. package/dist/tools/other-income/otherincome-delete.d.ts.map +1 -1
  126. package/dist/tools/other-income/otherincome-list.d.ts +14 -14
  127. package/dist/tools/other-income/otherincome-single.d.ts +6 -6
  128. package/dist/tools/other-income/otherincome-update.d.ts +10 -10
  129. package/dist/tools/other-income/schemas.d.ts +40 -34
  130. package/dist/tools/other-income/schemas.d.ts.map +1 -1
  131. package/dist/tools/other-income/schemas.js +2 -0
  132. package/dist/tools/other-income/schemas.js.map +1 -1
  133. package/dist/tools/payment/payment-create.d.ts +2 -2
  134. package/dist/tools/payment/payment-delete.d.ts +6 -0
  135. package/dist/tools/payment/payment-delete.d.ts.map +1 -1
  136. package/dist/tools/payment/payment-list.d.ts +8 -8
  137. package/dist/tools/payment/payment-single.d.ts +2 -2
  138. package/dist/tools/payment/payment-update.d.ts +2 -2
  139. package/dist/tools/payment/schemas.d.ts +18 -12
  140. package/dist/tools/payment/schemas.d.ts.map +1 -1
  141. package/dist/tools/payment/schemas.js +3 -1
  142. package/dist/tools/payment/schemas.js.map +1 -1
  143. package/dist/tools/project/project-create.d.ts +8 -8
  144. package/dist/tools/project/project-delete.d.ts +8 -2
  145. package/dist/tools/project/project-delete.d.ts.map +1 -1
  146. package/dist/tools/project/project-list.d.ts +21 -21
  147. package/dist/tools/project/project-single.d.ts +6 -6
  148. package/dist/tools/project/project-update.d.ts +10 -10
  149. package/dist/tools/project/schemas.d.ts +52 -46
  150. package/dist/tools/project/schemas.d.ts.map +1 -1
  151. package/dist/tools/project/schemas.js +2 -0
  152. package/dist/tools/project/schemas.js.map +1 -1
  153. package/dist/tools/service/schemas.d.ts +11 -11
  154. package/dist/tools/service/service-create.d.ts +2 -2
  155. package/dist/tools/service/service-list.d.ts +8 -8
  156. package/dist/tools/task/schemas.d.ts +34 -28
  157. package/dist/tools/task/schemas.d.ts.map +1 -1
  158. package/dist/tools/task/schemas.js +2 -0
  159. package/dist/tools/task/schemas.js.map +1 -1
  160. package/dist/tools/task/task-create.d.ts +6 -6
  161. package/dist/tools/task/task-delete.d.ts +6 -0
  162. package/dist/tools/task/task-delete.d.ts.map +1 -1
  163. package/dist/tools/task/task-list.d.ts +18 -18
  164. package/dist/tools/task/task-single.d.ts +4 -4
  165. package/dist/tools/task/task-update.d.ts +8 -8
  166. package/dist/tools/time-entry/schemas.d.ts +42 -36
  167. package/dist/tools/time-entry/schemas.d.ts.map +1 -1
  168. package/dist/tools/time-entry/schemas.js +2 -0
  169. package/dist/tools/time-entry/schemas.js.map +1 -1
  170. package/dist/tools/time-entry/timeentry-create.d.ts +6 -6
  171. package/dist/tools/time-entry/timeentry-delete.d.ts +8 -2
  172. package/dist/tools/time-entry/timeentry-delete.d.ts.map +1 -1
  173. package/dist/tools/time-entry/timeentry-list.d.ts +17 -17
  174. package/dist/tools/time-entry/timeentry-single.d.ts +4 -4
  175. package/dist/tools/time-entry/timeentry-update.d.ts +6 -6
  176. package/dist/tools/timer/schemas.d.ts +30 -24
  177. package/dist/tools/timer/schemas.d.ts.map +1 -1
  178. package/dist/tools/timer/schemas.js +2 -0
  179. package/dist/tools/timer/schemas.js.map +1 -1
  180. package/dist/tools/timer/timer-current.d.ts +8 -8
  181. package/dist/tools/timer/timer-discard.d.ts +8 -2
  182. package/dist/tools/timer/timer-discard.d.ts.map +1 -1
  183. package/dist/tools/timer/timer-start.d.ts +6 -6
  184. package/dist/tools/timer/timer-stop.d.ts +4 -4
  185. package/dist/tools/types.d.ts +16 -0
  186. package/dist/tools/types.d.ts.map +1 -1
  187. package/dist/tools/types.js.map +1 -1
  188. package/dist/tools/user/schemas.d.ts +14 -14
  189. package/dist/tools/user/user-me.d.ts +6 -6
  190. package/dist/utils/logger.d.ts +9 -0
  191. package/dist/utils/logger.d.ts.map +1 -1
  192. package/dist/utils/logger.js +114 -20
  193. package/dist/utils/logger.js.map +1 -1
  194. package/dist/utils/sanitizer.d.ts +49 -0
  195. package/dist/utils/sanitizer.d.ts.map +1 -0
  196. package/dist/utils/sanitizer.js +163 -0
  197. package/dist/utils/sanitizer.js.map +1 -0
  198. package/package.json +1 -1
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Confirmation Store
3
+ *
4
+ * Manages confirmation tokens for destructive operations.
5
+ * Implements a two-phase confirmation flow to prevent bypass attacks:
6
+ *
7
+ * 1. First call (no confirmation): Generate unique token, return to client
8
+ * 2. Second call (with token): Validate token, execute if valid
9
+ *
10
+ * Security features:
11
+ * - Cryptographically secure random tokens
12
+ * - One-time use (tokens are consumed on validation)
13
+ * - TTL expiration (default 5 minutes)
14
+ * - Request binding (token tied to specific tool + args hash)
15
+ */
16
+ /**
17
+ * Confirmation data structure
18
+ */
19
+ export interface ConfirmationData {
20
+ /** Unique confirmation token */
21
+ token: string;
22
+ /** Tool name that requires confirmation */
23
+ toolName: string;
24
+ /** Hash of the original request arguments (for binding) */
25
+ argsHash: string;
26
+ /** Timestamp when confirmation was created */
27
+ createdAt: number;
28
+ /** Timestamp when confirmation expires */
29
+ expiresAt: number;
30
+ }
31
+ /**
32
+ * Confirmation store interface
33
+ */
34
+ export interface ConfirmationStore {
35
+ /**
36
+ * Create a new confirmation token for a destructive operation
37
+ * @param toolName - Tool requiring confirmation
38
+ * @param args - Original request arguments (will be hashed)
39
+ * @param ttlSeconds - Time-to-live in seconds (default 300 = 5 min)
40
+ * @returns Confirmation data with token
41
+ */
42
+ create(toolName: string, args: unknown, ttlSeconds?: number): Promise<ConfirmationData>;
43
+ /**
44
+ * Validate and consume a confirmation token (one-time use)
45
+ * @param token - Confirmation token to validate
46
+ * @param toolName - Tool name (must match original)
47
+ * @param args - Request arguments (hash must match original)
48
+ * @returns true if valid and consumed, false otherwise
49
+ */
50
+ consume(token: string, toolName: string, args: unknown): Promise<boolean>;
51
+ /**
52
+ * Clear all expired confirmations (called periodically)
53
+ */
54
+ clearExpired(): Promise<void>;
55
+ /**
56
+ * Clear all confirmations (for testing)
57
+ */
58
+ clear(): Promise<void>;
59
+ }
60
+ /**
61
+ * In-memory confirmation store implementation
62
+ */
63
+ export declare class InMemoryConfirmationStore implements ConfirmationStore {
64
+ private confirmations;
65
+ private cleanupInterval;
66
+ /** Default TTL: 5 minutes */
67
+ private static readonly DEFAULT_TTL_SECONDS;
68
+ /** Token size: 32 bytes = 256 bits of entropy */
69
+ private static readonly TOKEN_BYTES;
70
+ /** Cleanup interval: every 60 seconds */
71
+ private static readonly CLEANUP_INTERVAL_MS;
72
+ constructor();
73
+ /**
74
+ * Generate a secure random confirmation token
75
+ */
76
+ private generateToken;
77
+ /**
78
+ * Hash the request arguments for binding
79
+ */
80
+ private hashArgs;
81
+ /**
82
+ * Remove confirmation fields from args before hashing
83
+ */
84
+ private removeConfirmationFields;
85
+ create(toolName: string, args: unknown, ttlSeconds?: number): Promise<ConfirmationData>;
86
+ consume(token: string, toolName: string, args: unknown): Promise<boolean>;
87
+ clearExpired(): Promise<void>;
88
+ clear(): Promise<void>;
89
+ /**
90
+ * Stop the cleanup interval (for graceful shutdown)
91
+ */
92
+ destroy(): void;
93
+ }
94
+ //# sourceMappingURL=confirmation-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation-store.d.ts","sourceRoot":"","sources":["../../src/auth/confirmation-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAExF;;;;;;OAMG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1E;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9B;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,yBAA0B,YAAW,iBAAiB;IACjE,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,eAAe,CAA+C;IAEtE,6BAA6B;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAElD,iDAAiD;IACjD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAM;IAEzC,yCAAyC;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAU;;IAgBrD;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAU1B,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,EACb,UAAU,GAAE,MAAsD,GACjE,OAAO,CAAC,gBAAgB,CAAC;IAkBtB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IA6BzE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAS7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Confirmation Store
3
+ *
4
+ * Manages confirmation tokens for destructive operations.
5
+ * Implements a two-phase confirmation flow to prevent bypass attacks:
6
+ *
7
+ * 1. First call (no confirmation): Generate unique token, return to client
8
+ * 2. Second call (with token): Validate token, execute if valid
9
+ *
10
+ * Security features:
11
+ * - Cryptographically secure random tokens
12
+ * - One-time use (tokens are consumed on validation)
13
+ * - TTL expiration (default 5 minutes)
14
+ * - Request binding (token tied to specific tool + args hash)
15
+ */
16
+ import { randomBytes, createHash } from 'crypto';
17
+ /**
18
+ * In-memory confirmation store implementation
19
+ */
20
+ export class InMemoryConfirmationStore {
21
+ confirmations = new Map();
22
+ cleanupInterval = null;
23
+ /** Default TTL: 5 minutes */
24
+ static DEFAULT_TTL_SECONDS = 300;
25
+ /** Token size: 32 bytes = 256 bits of entropy */
26
+ static TOKEN_BYTES = 32;
27
+ /** Cleanup interval: every 60 seconds */
28
+ static CLEANUP_INTERVAL_MS = 60_000;
29
+ constructor() {
30
+ // Start periodic cleanup
31
+ this.cleanupInterval = setInterval(() => {
32
+ this.clearExpired().catch(() => {
33
+ // Ignore cleanup errors
34
+ });
35
+ }, InMemoryConfirmationStore.CLEANUP_INTERVAL_MS);
36
+ // Don't keep process alive for cleanup
37
+ if (this.cleanupInterval.unref) {
38
+ this.cleanupInterval.unref();
39
+ }
40
+ }
41
+ /**
42
+ * Generate a secure random confirmation token
43
+ */
44
+ generateToken() {
45
+ return randomBytes(InMemoryConfirmationStore.TOKEN_BYTES).toString('hex');
46
+ }
47
+ /**
48
+ * Hash the request arguments for binding
49
+ */
50
+ hashArgs(args) {
51
+ // Remove the confirmation-related fields before hashing
52
+ const cleanArgs = this.removeConfirmationFields(args);
53
+ const json = JSON.stringify(cleanArgs, Object.keys(cleanArgs || {}).sort());
54
+ return createHash('sha256').update(json).digest('hex');
55
+ }
56
+ /**
57
+ * Remove confirmation fields from args before hashing
58
+ */
59
+ removeConfirmationFields(args) {
60
+ if (!args || typeof args !== 'object') {
61
+ return args;
62
+ }
63
+ const cleaned = { ...args };
64
+ delete cleaned['confirmed'];
65
+ delete cleaned['confirmationId'];
66
+ return cleaned;
67
+ }
68
+ async create(toolName, args, ttlSeconds = InMemoryConfirmationStore.DEFAULT_TTL_SECONDS) {
69
+ const token = this.generateToken();
70
+ const now = Date.now();
71
+ const argsHash = this.hashArgs(args);
72
+ const confirmation = {
73
+ token,
74
+ toolName,
75
+ argsHash,
76
+ createdAt: now,
77
+ expiresAt: now + ttlSeconds * 1000,
78
+ };
79
+ this.confirmations.set(token, confirmation);
80
+ return confirmation;
81
+ }
82
+ async consume(token, toolName, args) {
83
+ const confirmation = this.confirmations.get(token);
84
+ if (!confirmation) {
85
+ return false;
86
+ }
87
+ // Check expiration
88
+ if (Date.now() > confirmation.expiresAt) {
89
+ this.confirmations.delete(token);
90
+ return false;
91
+ }
92
+ // Verify tool name matches
93
+ if (confirmation.toolName !== toolName) {
94
+ return false;
95
+ }
96
+ // Verify args hash matches (prevents parameter tampering)
97
+ const argsHash = this.hashArgs(args);
98
+ if (confirmation.argsHash !== argsHash) {
99
+ return false;
100
+ }
101
+ // Consume (one-time use)
102
+ this.confirmations.delete(token);
103
+ return true;
104
+ }
105
+ async clearExpired() {
106
+ const now = Date.now();
107
+ for (const [token, confirmation] of this.confirmations) {
108
+ if (now > confirmation.expiresAt) {
109
+ this.confirmations.delete(token);
110
+ }
111
+ }
112
+ }
113
+ async clear() {
114
+ this.confirmations.clear();
115
+ }
116
+ /**
117
+ * Stop the cleanup interval (for graceful shutdown)
118
+ */
119
+ destroy() {
120
+ if (this.cleanupInterval) {
121
+ clearInterval(this.cleanupInterval);
122
+ this.cleanupInterval = null;
123
+ }
124
+ }
125
+ }
126
+ //# sourceMappingURL=confirmation-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation-store.js","sourceRoot":"","sources":["../../src/auth/confirmation-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * OAuth State Store
3
+ *
4
+ * Manages OAuth2 state parameters for CSRF protection.
5
+ * States are one-time use and expire after a configurable TTL.
6
+ */
7
+ /**
8
+ * OAuth state data
9
+ */
10
+ export interface OAuthStateData {
11
+ /** Cryptographically random state value */
12
+ state: string;
13
+ /** Unix timestamp when state was created */
14
+ createdAt: number;
15
+ /** Unix timestamp when state expires */
16
+ expiresAt: number;
17
+ }
18
+ /**
19
+ * State store interface for OAuth CSRF protection
20
+ */
21
+ export interface StateStore {
22
+ /**
23
+ * Create a new state with optional TTL
24
+ * @param ttlSeconds Time-to-live in seconds (default: 600 = 10 minutes)
25
+ */
26
+ create(ttlSeconds?: number): Promise<OAuthStateData>;
27
+ /**
28
+ * Validate that a state exists and is not expired
29
+ * Does NOT consume the state (use for pre-validation)
30
+ */
31
+ validate(state: string): Promise<boolean>;
32
+ /**
33
+ * Consume a state (one-time use)
34
+ * Returns true if valid and consumed, false otherwise
35
+ */
36
+ consume(state: string): Promise<boolean>;
37
+ /**
38
+ * Clear all stored states
39
+ */
40
+ clear(): Promise<void>;
41
+ }
42
+ /**
43
+ * In-memory state store implementation
44
+ *
45
+ * Suitable for single-instance deployments.
46
+ * States are automatically cleaned up when expired.
47
+ */
48
+ export declare class InMemoryStateStore implements StateStore {
49
+ private states;
50
+ private cleanupInterval;
51
+ /** Default TTL: 10 minutes */
52
+ private static readonly DEFAULT_TTL_SECONDS;
53
+ /** Cleanup interval: 1 minute */
54
+ private static readonly CLEANUP_INTERVAL_MS;
55
+ /** State entropy: 32 bytes = 256 bits */
56
+ private static readonly STATE_BYTES;
57
+ constructor();
58
+ /**
59
+ * Create a new cryptographically random state
60
+ */
61
+ create(ttlSeconds?: number): Promise<OAuthStateData>;
62
+ /**
63
+ * Validate a state without consuming it
64
+ */
65
+ validate(state: string): Promise<boolean>;
66
+ /**
67
+ * Consume a state (one-time use)
68
+ * This is the primary validation method - states can only be used once
69
+ */
70
+ consume(state: string): Promise<boolean>;
71
+ /**
72
+ * Clear all stored states
73
+ */
74
+ clear(): Promise<void>;
75
+ /**
76
+ * Stop the cleanup interval (for testing/cleanup)
77
+ */
78
+ destroy(): void;
79
+ /**
80
+ * Get the number of stored states (for testing)
81
+ */
82
+ size(): number;
83
+ /**
84
+ * Start periodic cleanup of expired states
85
+ */
86
+ private startCleanup;
87
+ /**
88
+ * Remove expired states
89
+ */
90
+ private cleanup;
91
+ }
92
+ /**
93
+ * Create a default state store instance
94
+ */
95
+ export declare function createStateStore(): StateStore;
96
+ //# sourceMappingURL=state-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/auth/state-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAErD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1C;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEzC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,eAAe,CAA+C;IAEtE,8BAA8B;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAElD,iCAAiC;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAEpD,yCAAyC;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAM;;IAOzC;;OAEG;IACG,MAAM,CAAC,UAAU,SAAyC,GAAG,OAAO,CAAC,cAAc,CAAC;IAgB1F;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB/C;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY9C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACH,OAAO,CAAC,OAAO;CAShB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * OAuth State Store
3
+ *
4
+ * Manages OAuth2 state parameters for CSRF protection.
5
+ * States are one-time use and expire after a configurable TTL.
6
+ */
7
+ import { randomBytes } from 'crypto';
8
+ /**
9
+ * In-memory state store implementation
10
+ *
11
+ * Suitable for single-instance deployments.
12
+ * States are automatically cleaned up when expired.
13
+ */
14
+ export class InMemoryStateStore {
15
+ states = new Map();
16
+ cleanupInterval = null;
17
+ /** Default TTL: 10 minutes */
18
+ static DEFAULT_TTL_SECONDS = 600;
19
+ /** Cleanup interval: 1 minute */
20
+ static CLEANUP_INTERVAL_MS = 60000;
21
+ /** State entropy: 32 bytes = 256 bits */
22
+ static STATE_BYTES = 32;
23
+ constructor() {
24
+ // Start periodic cleanup
25
+ this.startCleanup();
26
+ }
27
+ /**
28
+ * Create a new cryptographically random state
29
+ */
30
+ async create(ttlSeconds = InMemoryStateStore.DEFAULT_TTL_SECONDS) {
31
+ // Generate cryptographically secure random state
32
+ const state = randomBytes(InMemoryStateStore.STATE_BYTES).toString('hex');
33
+ const now = Math.floor(Date.now() / 1000);
34
+ const stateData = {
35
+ state,
36
+ createdAt: now,
37
+ expiresAt: now + ttlSeconds,
38
+ };
39
+ this.states.set(state, stateData);
40
+ return stateData;
41
+ }
42
+ /**
43
+ * Validate a state without consuming it
44
+ */
45
+ async validate(state) {
46
+ const stateData = this.states.get(state);
47
+ if (!stateData) {
48
+ return false;
49
+ }
50
+ const now = Math.floor(Date.now() / 1000);
51
+ if (now > stateData.expiresAt) {
52
+ // Expired - remove and return false
53
+ this.states.delete(state);
54
+ return false;
55
+ }
56
+ return true;
57
+ }
58
+ /**
59
+ * Consume a state (one-time use)
60
+ * This is the primary validation method - states can only be used once
61
+ */
62
+ async consume(state) {
63
+ const isValid = await this.validate(state);
64
+ if (isValid) {
65
+ // Remove state after successful validation (one-time use)
66
+ this.states.delete(state);
67
+ return true;
68
+ }
69
+ return false;
70
+ }
71
+ /**
72
+ * Clear all stored states
73
+ */
74
+ async clear() {
75
+ this.states.clear();
76
+ }
77
+ /**
78
+ * Stop the cleanup interval (for testing/cleanup)
79
+ */
80
+ destroy() {
81
+ if (this.cleanupInterval) {
82
+ clearInterval(this.cleanupInterval);
83
+ this.cleanupInterval = null;
84
+ }
85
+ }
86
+ /**
87
+ * Get the number of stored states (for testing)
88
+ */
89
+ size() {
90
+ return this.states.size;
91
+ }
92
+ /**
93
+ * Start periodic cleanup of expired states
94
+ */
95
+ startCleanup() {
96
+ this.cleanupInterval = setInterval(() => {
97
+ this.cleanup();
98
+ }, InMemoryStateStore.CLEANUP_INTERVAL_MS);
99
+ // Don't prevent process exit
100
+ if (this.cleanupInterval.unref) {
101
+ this.cleanupInterval.unref();
102
+ }
103
+ }
104
+ /**
105
+ * Remove expired states
106
+ */
107
+ cleanup() {
108
+ const now = Math.floor(Date.now() / 1000);
109
+ for (const [state, data] of this.states.entries()) {
110
+ if (now > data.expiresAt) {
111
+ this.states.delete(state);
112
+ }
113
+ }
114
+ }
115
+ }
116
+ /**
117
+ * Create a default state store instance
118
+ */
119
+ export function createStateStore() {
120
+ return new InMemoryStateStore();
121
+ }
122
+ //# sourceMappingURL=state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/auth/state-store.ts"],"names":[],"mappings":"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"}
@@ -53,7 +53,7 @@ export interface AuthStatus {
53
53
  /**
54
54
  * OAuth error codes
55
55
  */
56
- export type OAuthErrorCode = 'not_authenticated' | 'token_exchange_failed' | 'refresh_failed' | 'invalid_grant' | 'invalid_client' | 'invalid_request' | 'unauthorized_client' | 'unsupported_grant_type' | 'no_refresh_token' | 'session_expired';
56
+ export type OAuthErrorCode = 'not_authenticated' | 'token_exchange_failed' | 'refresh_failed' | 'invalid_grant' | 'invalid_client' | 'invalid_request' | 'unauthorized_client' | 'unsupported_grant_type' | 'no_refresh_token' | 'session_expired' | 'invalid_state' | 'state_required';
57
57
  /**
58
58
  * OAuth-specific error class
59
59
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IAEjB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IAErB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IAEpB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IAEpB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IAErB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAElB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAElB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,aAAa,EAAE,OAAO,CAAC;IAEvB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,gEAAgE;IAChE,MAAM,CAAC,EAAE,UAAU,GAAG,eAAe,GAAG,eAAe,CAAC;IAExD,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,mBAAmB,GACnB,uBAAuB,GACvB,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,qBAAqB,GACrB,wBAAwB,GACxB,kBAAkB,GAClB,iBAAiB,CAAC;AAEtB;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;aAEjB,IAAI,EAAE,cAAc;aAEpB,OAAO,CAAC,EAAE,GAAG;gBAFb,IAAI,EAAE,cAAc,EACpC,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,GAAG,YAAA;CAMhC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,GAAG,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAEjC,sBAAsB;IACtB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC,8BAA8B;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IAEjB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IAErB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IAEpB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IAEpB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IAErB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAElB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAElB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,aAAa,EAAE,OAAO,CAAC;IAEvB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,gEAAgE;IAChE,MAAM,CAAC,EAAE,UAAU,GAAG,eAAe,GAAG,eAAe,CAAC;IAExD,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,mBAAmB,GACnB,uBAAuB,GACvB,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,qBAAqB,GACrB,wBAAwB,GACxB,kBAAkB,GAClB,iBAAiB,GACjB,eAAe,GACf,gBAAgB,CAAC;AAErB;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;aAEjB,IAAI,EAAE,cAAc;aAEpB,OAAO,CAAC,EAAE,GAAG;gBAFb,IAAI,EAAE,cAAc,EACpC,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,GAAG,YAAA;CAMhC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,GAAG,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAEjC,sBAAsB;IACtB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC,8BAA8B;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgFH;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IAEjB;IAEA;IAHlB,YACkB,IAAoB,EACpC,OAAe,EACC,OAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAgB;QAEpB,YAAO,GAAP,OAAO,CAAM;QAG7B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkFH;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IAEjB;IAEA;IAHlB,YACkB,IAAoB,EACpC,OAAe,EACC,OAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAgB;QAEpB,YAAO,GAAP,OAAO,CAAM;QAG7B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Environment detection utilities for FreshBooks MCP Server
3
+ *
4
+ * Provides consistent environment detection across the codebase
5
+ * for security-sensitive decisions like stack trace exposure.
6
+ */
7
+ export type Environment = 'development' | 'test' | 'production';
8
+ /**
9
+ * Get the current environment from NODE_ENV
10
+ * Defaults to 'development' if not set
11
+ */
12
+ export declare function getEnvironment(): Environment;
13
+ /**
14
+ * Check if running in production environment
15
+ */
16
+ export declare function isProduction(): boolean;
17
+ /**
18
+ * Check if running in development environment
19
+ */
20
+ export declare function isDevelopment(): boolean;
21
+ /**
22
+ * Check if running in test environment
23
+ */
24
+ export declare function isTest(): boolean;
25
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAY5C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,OAAO,CAEhC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Environment detection utilities for FreshBooks MCP Server
3
+ *
4
+ * Provides consistent environment detection across the codebase
5
+ * for security-sensitive decisions like stack trace exposure.
6
+ */
7
+ /**
8
+ * Get the current environment from NODE_ENV
9
+ * Defaults to 'development' if not set
10
+ */
11
+ export function getEnvironment() {
12
+ const env = process.env.NODE_ENV?.toLowerCase();
13
+ if (env === 'production' || env === 'prod') {
14
+ return 'production';
15
+ }
16
+ if (env === 'test' || env === 'testing') {
17
+ return 'test';
18
+ }
19
+ return 'development';
20
+ }
21
+ /**
22
+ * Check if running in production environment
23
+ */
24
+ export function isProduction() {
25
+ return getEnvironment() === 'production';
26
+ }
27
+ /**
28
+ * Check if running in development environment
29
+ */
30
+ export function isDevelopment() {
31
+ return getEnvironment() === 'development';
32
+ }
33
+ /**
34
+ * Check if running in test environment
35
+ */
36
+ export function isTest() {
37
+ return getEnvironment() === 'test';
38
+ }
39
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;IAEhD,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC3C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,cAAc,EAAE,KAAK,YAAY,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,cAAc,EAAE,KAAK,aAAa,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM;IACpB,OAAO,cAAc,EAAE,KAAK,MAAM,CAAC;AACrC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/errors/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,QAAQ,EAIR,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AAGpB;;;;GAIG;AACH,qBAAa,YAAY;IACvB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,GACjE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC;IA2B5D;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,QAAQ;IAwEvE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAahC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAoB7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B;;;;;;;;OAQG;IACH,MAAM,CAAC,qBAAqB,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY,GACrB,QAAQ;IAiBX;;;;;;;;OAQG;IACH,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,QAAQ;IAiBzE;;;;;;;;;OASG;IACH,MAAM,CAAC,mBAAmB,CACxB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,MAAM,EAC3B,OAAO,CAAC,EAAE,YAAY,GACrB,QAAQ;CAkBZ;AAED;;;;;;GAMG;AACH,iBAAS,iBAAiB,IAAI,MAAM,CAInC;AAED;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B;;;GAGG;AACH,eAAO,MAAM,WAAW,oCAAiD,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,eAAe,qCAAkD,CAAC"}
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/errors/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,QAAQ,EAIR,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AAKpB;;;;GAIG;AACH,qBAAa,YAAY;IACvB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,GACjE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC;IA6B5D;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,QAAQ;IAiFvE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAahC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAoB7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B;;;;;;;;OAQG;IACH,MAAM,CAAC,qBAAqB,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY,GACrB,QAAQ;IAiBX;;;;;;;;OAQG;IACH,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,QAAQ;IAiBzE;;;;;;;;;OASG;IACH,MAAM,CAAC,mBAAmB,CACxB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,MAAM,EAC3B,OAAO,CAAC,EAAE,YAAY,GACrB,QAAQ;CAkBZ;AAED;;;;;;GAMG;AACH,iBAAS,iBAAiB,IAAI,MAAM,CAInC;AAED;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B;;;GAGG;AACH,eAAO,MAAM,WAAW,oCAAiD,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,eAAe,qCAAkD,CAAC"}
@@ -9,6 +9,8 @@
9
9
  import { z } from "zod";
10
10
  import { MCPErrorCode, OAuthError, } from "./types.js";
11
11
  import { ErrorMapper } from "./error-mapper.js";
12
+ import { isProduction } from "../config/environment.js";
13
+ import { sanitizeForMcpResponse } from "../utils/sanitizer.js";
12
14
  /**
13
15
  * Error Handler Class
14
16
  *
@@ -46,7 +48,8 @@ export class ErrorHandler {
46
48
  // Note: In production, this would use a proper logger
47
49
  // For now, we avoid logging to keep stdio clean for MCP
48
50
  const result = await handler(input, context);
49
- return result;
51
+ // Sanitize output to prevent prompt injection from API responses
52
+ return sanitizeForMcpResponse(result);
50
53
  }
51
54
  catch (error) {
52
55
  const errorContext = {
@@ -108,7 +111,6 @@ export class ErrorHandler {
108
111
  }
109
112
  // Unknown error - create generic internal error
110
113
  const message = error instanceof Error ? error.message : String(error);
111
- const stack = error instanceof Error ? error.stack : undefined;
112
114
  const errorData = {
113
115
  recoverable: true,
114
116
  suggestion: "An unexpected error occurred. Please try again.",
@@ -116,11 +118,22 @@ export class ErrorHandler {
116
118
  if (context) {
117
119
  errorData.context = context;
118
120
  }
119
- if (stack) {
121
+ // Only include stack traces and detailed messages in non-production environments
122
+ if (!isProduction()) {
123
+ const stack = error instanceof Error ? error.stack : undefined;
124
+ if (stack) {
125
+ errorData.freshbooksError = {
126
+ code: "UNKNOWN_ERROR",
127
+ message,
128
+ details: { stack },
129
+ };
130
+ }
131
+ }
132
+ else {
133
+ // In production, include error code but sanitize the message
120
134
  errorData.freshbooksError = {
121
135
  code: "UNKNOWN_ERROR",
122
- message,
123
- details: { stack },
136
+ message: "An internal error occurred",
124
137
  };
125
138
  }
126
139
  const mcpError = Object.assign(new Error(`Unexpected error: ${message}`), {
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/errors/error-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/errors/error-handler.ts"],"names":[],"mappings":"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"}