@goodsamsoftware/freshbooks-mcp 1.0.8 → 1.0.10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"timeentry-list.d.ts","sourceRoot":"","sources":["../../../src/tools/time-entry/timeentry-list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAMhE;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4D5B;;OAEG;mBAEM,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,UACvC,uBAAuB,GAC9B,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;CAkGtD,CAAC"}
1
+ {"version":3,"file":"timeentry-list.d.ts","sourceRoot":"","sources":["../../../src/tools/time-entry/timeentry-list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAkChE;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4D5B;;OAEG;mBAEM,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,UACvC,uBAAuB,GAC9B,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;CAsGtD,CAAC"}
@@ -7,6 +7,30 @@ import { TimeEntryListInputSchema, TimeEntryListOutputSchema } from './schemas.j
7
7
  import { ErrorHandler } from '../../errors/error-handler.js';
8
8
  import { logger } from '../../utils/logger.js';
9
9
  import { buildQueryBuilders } from '../base-tool.js';
10
+ /**
11
+ * Custom query builder for time entry date filters.
12
+ *
13
+ * The FreshBooks Time Entries API expects date filters as top-level query parameters:
14
+ * - started_from: Filter entries started on or after this datetime
15
+ * - started_to: Filter entries started on or before this datetime
16
+ *
17
+ * This is different from the standard SearchQueryBuilder.between() which generates
18
+ * search[field_min] and search[field_max] parameters.
19
+ */
20
+ class TimeEntryDateFilterBuilder {
21
+ params = [];
22
+ startedFrom(date) {
23
+ this.params.push(`started_from=${encodeURIComponent(date)}`);
24
+ return this;
25
+ }
26
+ startedTo(date) {
27
+ this.params.push(`started_to=${encodeURIComponent(date)}`);
28
+ return this;
29
+ }
30
+ build() {
31
+ return this.params.join('&');
32
+ }
33
+ }
10
34
  /**
11
35
  * Tool definition for timeentry_list
12
36
  */
@@ -111,20 +135,22 @@ EXAMPLES:
111
135
  if (input.billed !== undefined) {
112
136
  search.boolean('billed', input.billed);
113
137
  }
114
- if (input.startedAfter) {
115
- search.between('started_at', {
116
- min: input.startedAfter,
117
- max: input.startedBefore || new Date().toISOString(),
118
- });
119
- }
120
- else if (input.startedBefore) {
121
- search.between('started_at', {
122
- min: '1970-01-01T00:00:00Z',
123
- max: input.startedBefore,
124
- });
125
- }
138
+ // Note: Date filters (startedAfter/startedBefore) are handled separately
139
+ // using TimeEntryDateFilterBuilder because the FreshBooks API expects
140
+ // started_from and started_to as top-level query parameters, not search params.
126
141
  },
127
142
  });
143
+ // Add date filters using custom builder (top-level query params)
144
+ if (input.startedAfter || input.startedBefore) {
145
+ const dateFilter = new TimeEntryDateFilterBuilder();
146
+ if (input.startedAfter) {
147
+ dateFilter.startedFrom(input.startedAfter);
148
+ }
149
+ if (input.startedBefore) {
150
+ dateFilter.startedTo(input.startedBefore);
151
+ }
152
+ queryBuilders.push(dateFilter);
153
+ }
128
154
  // Call FreshBooks API
129
155
  const response = await fbClient.timeEntries.list(input.businessId, queryBuilders);
130
156
  if (!response.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"timeentry-list.js","sourceRoot":"","sources":["../../../src/tools/time-entry/timeentry-list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"timeentry-list.js","sourceRoot":"","sources":["../../../src/tools/time-entry/timeentry-list.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodsamsoftware/freshbooks-mcp",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "description": "FreshBooks MCP server providing 1:1 parity with the FreshBooks Node.js SDK",
5
5
  "type": "module",
6
6
  "main": "dist/server.js",
@@ -77,10 +77,10 @@
77
77
  "zod": "^3.22.0"
78
78
  },
79
79
  "devDependencies": {
80
- "@faker-js/faker": "^8.3.1",
80
+ "@faker-js/faker": "^10.2.0",
81
81
  "@types/node": "^20.0.0",
82
82
  "@vitest/coverage-v8": "^4.0.16",
83
- "eslint": "^8.0.0",
83
+ "eslint": "^9.39.2",
84
84
  "tsx": "^4.0.0",
85
85
  "typescript": "^5.3.0",
86
86
  "vitest": "^4.0.16"