@goodsamsoftware/freshbooks-mcp 1.0.6 → 1.0.8

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 (30) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +357 -357
  3. package/dist/tools/client/client-create.js +38 -38
  4. package/dist/tools/client/client-list.js +47 -47
  5. package/dist/tools/client/client-update.js +34 -34
  6. package/dist/tools/credit-note/creditnote-single.js +18 -18
  7. package/dist/tools/expense/expense-update.d.ts.map +1 -1
  8. package/dist/tools/expense/expense-update.js +4 -4
  9. package/dist/tools/expense/expense-update.js.map +1 -1
  10. package/dist/tools/invoice/invoice-list.js +40 -40
  11. package/dist/tools/project/project-create.js +34 -34
  12. package/dist/tools/project/project-delete.js +38 -38
  13. package/dist/tools/project/project-list.js +38 -38
  14. package/dist/tools/project/project-single.js +23 -23
  15. package/dist/tools/project/project-update.js +37 -37
  16. package/dist/tools/task/task-create.js +36 -36
  17. package/dist/tools/task/task-delete.js +35 -35
  18. package/dist/tools/task/task-list.js +28 -28
  19. package/dist/tools/task/task-single.js +25 -25
  20. package/dist/tools/task/task-update.js +39 -39
  21. package/dist/tools/time-entry/timeentry-create.js +49 -49
  22. package/dist/tools/time-entry/timeentry-delete.js +48 -48
  23. package/dist/tools/time-entry/timeentry-list.js +53 -53
  24. package/dist/tools/time-entry/timeentry-single.js +28 -28
  25. package/dist/tools/time-entry/timeentry-update.js +61 -61
  26. package/dist/tools/timer/timer-current.js +54 -54
  27. package/dist/tools/timer/timer-discard.js +41 -41
  28. package/dist/tools/timer/timer-start.js +43 -43
  29. package/dist/tools/timer/timer-stop.js +33 -33
  30. package/package.json +88 -88
@@ -11,44 +11,44 @@ import { logger } from '../../utils/logger.js';
11
11
  */
12
12
  export const clientCreateTool = {
13
13
  name: 'client_create',
14
- description: `Create a new client/customer in FreshBooks.
15
-
16
- WHEN TO USE:
17
- - User wants to add a new client
18
- - User says "create client", "add customer", "new client"
19
- - Setting up a customer for invoicing or project tracking
20
- - Before creating invoices or projects for a new customer
21
-
22
- REQUIRED:
23
- - accountId: FreshBooks account ID (get from auth_status if not specified)
24
- - At least one of: fName, lName, organization, or email
25
-
26
- OPTIONAL:
27
- Contact:
28
- - fName, lName: Client's name
29
- - organization: Company name
30
- - email: Email address (recommended for invoices)
31
-
32
- Phone:
33
- - busPhone, homePhone, mobPhone, fax
34
-
35
- Address:
36
- - pStreet, pStreet2, pCity, pProvince, pCode, pCountry (primary)
37
- - sStreet, sStreet2, sCity, sProvince, sCode, sCountry (secondary)
38
-
39
- Settings:
40
- - currencyCode: e.g., USD, CAD, EUR
41
- - language: Preferred language for invoices
42
- - vatNumber, vatName: Tax identification
43
- - allowLateFees, allowLateNotifications: Billing preferences
44
- - note: Internal notes
45
-
46
- RETURNS:
47
- Created client with assigned ID and all configured settings.
48
-
49
- EXAMPLES:
50
- - "Create a new client: John Smith, john@example.com"
51
- - "Add client Acme Corp with email billing@acme.com"
14
+ description: `Create a new client/customer in FreshBooks.
15
+
16
+ WHEN TO USE:
17
+ - User wants to add a new client
18
+ - User says "create client", "add customer", "new client"
19
+ - Setting up a customer for invoicing or project tracking
20
+ - Before creating invoices or projects for a new customer
21
+
22
+ REQUIRED:
23
+ - accountId: FreshBooks account ID (get from auth_status if not specified)
24
+ - At least one of: fName, lName, organization, or email
25
+
26
+ OPTIONAL:
27
+ Contact:
28
+ - fName, lName: Client's name
29
+ - organization: Company name
30
+ - email: Email address (recommended for invoices)
31
+
32
+ Phone:
33
+ - busPhone, homePhone, mobPhone, fax
34
+
35
+ Address:
36
+ - pStreet, pStreet2, pCity, pProvince, pCode, pCountry (primary)
37
+ - sStreet, sStreet2, sCity, sProvince, sCode, sCountry (secondary)
38
+
39
+ Settings:
40
+ - currencyCode: e.g., USD, CAD, EUR
41
+ - language: Preferred language for invoices
42
+ - vatNumber, vatName: Tax identification
43
+ - allowLateFees, allowLateNotifications: Billing preferences
44
+ - note: Internal notes
45
+
46
+ RETURNS:
47
+ Created client with assigned ID and all configured settings.
48
+
49
+ EXAMPLES:
50
+ - "Create a new client: John Smith, john@example.com"
51
+ - "Add client Acme Corp with email billing@acme.com"
52
52
  - "New client: Jane Doe, 123 Main St, New York, NY 10001"`,
53
53
  inputSchema: ClientCreateInputSchema,
54
54
  outputSchema: ClientSingleOutputSchema,
@@ -12,53 +12,53 @@ import { buildQueryBuilders } from '../base-tool.js';
12
12
  */
13
13
  export const clientListTool = {
14
14
  name: 'client_list',
15
- description: `List clients from FreshBooks with optional filtering and pagination.
16
-
17
- WHEN TO USE:
18
- - User asks to "see clients", "list clients", "show all customers"
19
- - User wants to find a client by name, email, or organization
20
- - User needs to select a client for invoicing or project setup
21
- - Getting client information for time tracking context
22
-
23
- REQUIRED:
24
- - accountId: FreshBooks account ID (get from auth_status if not specified)
25
-
26
- OPTIONAL FILTERS:
27
- - email: Find client by exact email address
28
- - organization: Search by company name (partial match)
29
- - fName: Search by first name (partial match)
30
- - lName: Search by last name (partial match)
31
- - visState: Filter by status (0=active, 1=deleted, 2=archived)
32
-
33
- SORTING:
34
- - sortBy: Field to sort by (organization, fname, lname, email, updated)
35
- - sortOrder: Sort direction (asc or desc, default: desc)
36
-
37
- INCLUDES:
38
- - include: Related data to fetch (outstanding_balance, credit_balance)
39
- - outstanding_balance: Total unpaid amount across all invoices
40
- - credit_balance: Available credit for the client
41
-
42
- PAGINATION:
43
- - page: Page number (default: 1)
44
- - perPage: Results per page (default: 30, max: 100)
45
-
46
- RETURNS:
47
- Array of clients with:
48
- - id: Client ID
49
- - fName, lName: Contact name
50
- - organization: Company name
51
- - email: Email address
52
- - Phone numbers, addresses
53
- - currencyCode: Billing currency
54
- - visState: Status
55
- Plus pagination metadata (page, pages, total)
56
-
57
- EXAMPLES:
58
- - "Show me all active clients"
59
- - "List clients with 'Acme' in their organization name"
60
- - "Find the client with email john@example.com"
61
- - "Show all archived clients sorted by organization"
15
+ description: `List clients from FreshBooks with optional filtering and pagination.
16
+
17
+ WHEN TO USE:
18
+ - User asks to "see clients", "list clients", "show all customers"
19
+ - User wants to find a client by name, email, or organization
20
+ - User needs to select a client for invoicing or project setup
21
+ - Getting client information for time tracking context
22
+
23
+ REQUIRED:
24
+ - accountId: FreshBooks account ID (get from auth_status if not specified)
25
+
26
+ OPTIONAL FILTERS:
27
+ - email: Find client by exact email address
28
+ - organization: Search by company name (partial match)
29
+ - fName: Search by first name (partial match)
30
+ - lName: Search by last name (partial match)
31
+ - visState: Filter by status (0=active, 1=deleted, 2=archived)
32
+
33
+ SORTING:
34
+ - sortBy: Field to sort by (organization, fname, lname, email, updated)
35
+ - sortOrder: Sort direction (asc or desc, default: desc)
36
+
37
+ INCLUDES:
38
+ - include: Related data to fetch (outstanding_balance, credit_balance)
39
+ - outstanding_balance: Total unpaid amount across all invoices
40
+ - credit_balance: Available credit for the client
41
+
42
+ PAGINATION:
43
+ - page: Page number (default: 1)
44
+ - perPage: Results per page (default: 30, max: 100)
45
+
46
+ RETURNS:
47
+ Array of clients with:
48
+ - id: Client ID
49
+ - fName, lName: Contact name
50
+ - organization: Company name
51
+ - email: Email address
52
+ - Phone numbers, addresses
53
+ - currencyCode: Billing currency
54
+ - visState: Status
55
+ Plus pagination metadata (page, pages, total)
56
+
57
+ EXAMPLES:
58
+ - "Show me all active clients"
59
+ - "List clients with 'Acme' in their organization name"
60
+ - "Find the client with email john@example.com"
61
+ - "Show all archived clients sorted by organization"
62
62
  - "Get clients with their outstanding balances"`,
63
63
  inputSchema: ClientListInputSchema,
64
64
  outputSchema: ClientListOutputSchema,
@@ -11,40 +11,40 @@ import { logger } from '../../utils/logger.js';
11
11
  */
12
12
  export const clientUpdateTool = {
13
13
  name: 'client_update',
14
- description: `Update an existing client's information in FreshBooks.
15
-
16
- WHEN TO USE:
17
- - User wants to modify client details
18
- - User says "update client", "change client info", "edit customer"
19
- - Correcting client contact information
20
- - Updating billing address or preferences
21
- - Changing client status (archive/activate)
22
-
23
- REQUIRED:
24
- - accountId: FreshBooks account ID (get from auth_status if not specified)
25
- - clientId: The client ID to update (numeric)
26
- - At least one field to update
27
-
28
- UPDATABLE FIELDS:
29
- Contact: fName, lName, organization, email
30
- Phones: busPhone, homePhone, mobPhone, fax
31
- Primary address: pStreet, pStreet2, pCity, pProvince, pCode, pCountry
32
- Secondary address: sStreet, sStreet2, sCity, sProvince, sCode, sCountry
33
- Financial: currencyCode, language, vatNumber, vatName
34
- Preferences: allowLateFees, allowLateNotifications
35
- Status: visState (0=active, 1=deleted, 2=archived)
36
- Notes: note
37
-
38
- PARTIAL UPDATES:
39
- Only include fields you want to change. Omitted fields remain unchanged.
40
-
41
- RETURNS:
42
- Updated client record with all current information.
43
-
44
- EXAMPLES:
45
- - "Update client 123's email to newemail@example.com"
46
- - "Change client 456's address to 789 Oak Street, Boston, MA"
47
- - "Archive client 789 (set visState to 2)"
14
+ description: `Update an existing client's information in FreshBooks.
15
+
16
+ WHEN TO USE:
17
+ - User wants to modify client details
18
+ - User says "update client", "change client info", "edit customer"
19
+ - Correcting client contact information
20
+ - Updating billing address or preferences
21
+ - Changing client status (archive/activate)
22
+
23
+ REQUIRED:
24
+ - accountId: FreshBooks account ID (get from auth_status if not specified)
25
+ - clientId: The client ID to update (numeric)
26
+ - At least one field to update
27
+
28
+ UPDATABLE FIELDS:
29
+ Contact: fName, lName, organization, email
30
+ Phones: busPhone, homePhone, mobPhone, fax
31
+ Primary address: pStreet, pStreet2, pCity, pProvince, pCode, pCountry
32
+ Secondary address: sStreet, sStreet2, sCity, sProvince, sCode, sCountry
33
+ Financial: currencyCode, language, vatNumber, vatName
34
+ Preferences: allowLateFees, allowLateNotifications
35
+ Status: visState (0=active, 1=deleted, 2=archived)
36
+ Notes: note
37
+
38
+ PARTIAL UPDATES:
39
+ Only include fields you want to change. Omitted fields remain unchanged.
40
+
41
+ RETURNS:
42
+ Updated client record with all current information.
43
+
44
+ EXAMPLES:
45
+ - "Update client 123's email to newemail@example.com"
46
+ - "Change client 456's address to 789 Oak Street, Boston, MA"
47
+ - "Archive client 789 (set visState to 2)"
48
48
  - "Enable late fees for client 234"`,
49
49
  inputSchema: ClientUpdateInputSchema,
50
50
  outputSchema: ClientSingleOutputSchema,
@@ -10,24 +10,24 @@ import { ErrorHandler } from "../../errors/error-handler.js";
10
10
  */
11
11
  export const creditnoteSingleTool = {
12
12
  name: "creditnote_single",
13
- description: `Retrieve a single credit note by ID from FreshBooks.
14
-
15
- WHEN TO USE:
16
- - User asks for details about a specific credit note
17
- - User provides a credit note ID or number
18
- - User needs to review credit note details before applying or updating
19
-
20
- REQUIRED INFO:
21
- - creditNoteId: The credit note identifier
22
- - accountId: FreshBooks account (get from context)
23
-
24
- EXAMPLE PROMPTS:
25
- - "Show me credit note #12345"
26
- - "Get details for credit note 67890"
27
- - "What's in credit note ID 555?"
28
-
29
- RETURNS:
30
- Complete credit note record including credit amount, client info, status,
13
+ description: `Retrieve a single credit note by ID from FreshBooks.
14
+
15
+ WHEN TO USE:
16
+ - User asks for details about a specific credit note
17
+ - User provides a credit note ID or number
18
+ - User needs to review credit note details before applying or updating
19
+
20
+ REQUIRED INFO:
21
+ - creditNoteId: The credit note identifier
22
+ - accountId: FreshBooks account (get from context)
23
+
24
+ EXAMPLE PROMPTS:
25
+ - "Show me credit note #12345"
26
+ - "Get details for credit note 67890"
27
+ - "What's in credit note ID 555?"
28
+
29
+ RETURNS:
30
+ Complete credit note record including credit amount, client info, status,
31
31
  line items, and all other credit note properties.`,
32
32
  inputSchema: CreditNoteSingleInputSchema,
33
33
  outputSchema: CreditNoteSingleOutputSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"expense-update.d.ts","sourceRoot":"","sources":["../../../src/tools/expense/expense-update.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;AAKhE;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAwC5B;;OAEG;mBAEM,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,UACvC,uBAAuB,GAC9B,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;CAqHtD,CAAC"}
1
+ {"version":3,"file":"expense-update.d.ts","sourceRoot":"","sources":["../../../src/tools/expense/expense-update.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;AAKhE;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAwC5B;;OAEG;mBAEM,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,UACvC,uBAAuB,GAC9B,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;CAsHtD,CAAC"}
@@ -76,8 +76,9 @@ Updated expense with all current details.`,
76
76
  const existing = existingExpense;
77
77
  // Build expense update object with ONLY updatable fields
78
78
  // Do NOT spread the entire object - API returns extra read-only fields
79
- // (accountId, isDuplicate, profileId, bankName, status, updated, hasReceipt, etc.)
80
79
  // that cause the SDK to hang if included in update requests
80
+ // NOTE: visState is intentionally NOT copied from existing - including it causes
81
+ // the SDK to hang. Only include visState if user explicitly provides it.
81
82
  const expense = {
82
83
  categoryId: existing.categoryId,
83
84
  staffId: existing.staffId,
@@ -92,7 +93,7 @@ Updated expense with all current details.`,
92
93
  taxPercent1: existing.taxPercent1,
93
94
  taxName2: existing.taxName2,
94
95
  taxPercent2: existing.taxPercent2,
95
- visState: existing.visState,
96
+ // visState intentionally omitted - causes SDK hang when copied
96
97
  };
97
98
  // Overlay only the fields user provided
98
99
  if (updateData.categoryId !== undefined)
@@ -119,8 +120,7 @@ Updated expense with all current details.`,
119
120
  expense.taxName2 = updateData.taxName2;
120
121
  if (updateData.taxPercent2 !== undefined)
121
122
  expense.taxPercent2 = updateData.taxPercent2;
122
- if (updateData.visState !== undefined)
123
- expense.visState = updateData.visState;
123
+ //if (updateData.visState !== undefined) expense.visState = updateData.visState;
124
124
  // Validate that at least one field is being updated
125
125
  const updatedFields = Object.keys(updateData).filter((k) => updateData[k] !== undefined);
126
126
  if (updatedFields.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"expense-update.js","sourceRoot":"","sources":["../../../src/tools/expense/expense-update.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEnF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CAiC2B;IAExC,WAAW,EAAE,wBAAwB;IACrC,YAAY,EAAE,yBAAyB;IAEvC;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,KAA+C,EAC/C,MAA+B;QAE/B,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,CACtC,gBAAgB,EAChB,KAAK,EACH,KAA+C,EAC/C,QAAqB,EACrB,EAAE;YACF,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,GAAG,KAAK,CAAC;YAEtD,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE;gBAC/B,SAAS;gBACT,SAAS;gBACT,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;aAChC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAC1C,gBAAgB,EAChB,KAAK,EAAE,QAAQ,EAAE,EAAE;gBACjB,+DAA+D;gBAC/D,qEAAqE;gBACrE,0CAA0C;gBAC1C,MAAM,gBAAgB,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;gBAEtF,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;oBACzB,MAAM,gBAAgB,CAAC,KAAK,CAAC;gBAC/B,CAAC;gBAED,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;oBAC3B,MAAM,YAAY,CAAC,mBAAmB,CACpC,SAAS,EACT,SAAS,EACT;wBACE,SAAS;qBACV,CACF,CAAC;gBACJ,CAAC;gBAED,0EAA0E;gBAC1E,MAAM,eAAe,GAAI,gBAAgB,CAAC,IAA8B,CAAC,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC;gBAC1G,MAAM,QAAQ,GAAG,eAA0C,CAAC;gBAE5D,yDAAyD;gBACzD,uEAAuE;gBACvE,mFAAmF;gBACnF,4DAA4D;gBAC5D,MAAM,OAAO,GAA4B;oBACvC,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,aAAa,EAAE,QAAQ,CAAC,aAAa;oBACrC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;oBACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;oBACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;iBAC5B,CAAC;gBAEF,wCAAwC;gBACxC,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS;oBAAE,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;gBACpF,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS;oBAAE,OAAO,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;gBAClE,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS;oBAAE,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;gBACxE,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS;oBAAE,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;gBACxE,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS;oBAAE,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;gBACrE,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS;oBAAE,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;gBAC9E,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS;oBAAE,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;gBACjF,IAAI,UAAU,CAAC,aAAa,KAAK,SAAS;oBAAE,OAAO,CAAC,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;gBAC7F,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS;oBAAE,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;gBAC9E,IAAI,UAAU,CAAC,WAAW,KAAK,SAAS;oBAAE,OAAO,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;gBACvF,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS;oBAAE,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;gBAC9E,IAAI,UAAU,CAAC,WAAW,KAAK,SAAS;oBAAE,OAAO,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;gBACvF,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS;oBAAE,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;gBAE9E,oDAAoD;gBACpD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAClD,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAA4B,CAAC,KAAK,SAAS,CAC9D,CAAC;gBACF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/B,MAAM,YAAY,CAAC,qBAAqB,CACtC,4EAA4E,CAC7E,CAAC;gBACJ,CAAC;gBAED,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE;oBACvD,UAAU,EAAE,OAAO;oBACnB,SAAS;oBACT,SAAS;oBACT,aAAa;iBACd,CAAC,CAAC;gBAEH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAc,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;gBAE9F,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,QAAQ,CAAC,KAAK,CAAC;gBACvB,CAAC;gBAED,OAAO,QAAQ,CAAC,IAAI,CAAC;YACvB,CAAC,CACF,CAAC;YAEF,2CAA2C;YAC3C,MAAM,cAAc,GAAI,MAAgC,CAAC,OAAO,IAAI,MAAM,CAAC;YAE3E,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;gBAC1C,SAAS;aACV,CAAC,CAAC;YAEH,OAAO,cAA2D,CAAC;QACrE,CAAC,CACF,CAAC;QAEF,OAAO,OAAO,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"expense-update.js","sourceRoot":"","sources":["../../../src/tools/expense/expense-update.ts"],"names":[],"mappings":"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"}
@@ -12,46 +12,46 @@ import { buildQueryBuilders } from '../base-tool.js';
12
12
  */
13
13
  export const invoiceListTool = {
14
14
  name: 'invoice_list',
15
- description: `List invoices from FreshBooks.
16
-
17
- WHEN TO USE:
18
- - User asks to see invoices, bills sent to clients, or outstanding payments
19
- - User wants to review invoices for a specific client
20
- - User needs to find invoices by status (draft, sent, paid, overdue)
21
- - User asks "show my invoices", "what invoices are unpaid", "list client invoices"
22
-
23
- REQUIRED:
24
- - accountId: FreshBooks account ID (get from auth_status if not specified)
25
-
26
- OPTIONAL FILTERS:
27
- - customerId: Filter by specific customer/client
28
- - status: Filter by invoice status (draft, sent, viewed, partial, paid, overdue, etc.)
29
- - paymentStatus: Filter by payment status (unpaid, partial, paid)
30
- - dateMin: Show invoices created after this date (YYYY-MM-DD)
31
- - dateMax: Show invoices created before this date (YYYY-MM-DD)
32
- - updatedSince: Show invoices updated since this time (ISO 8601)
33
-
34
- SORTING:
35
- - sortBy: Field to sort by (create_date, due_date, updated, amount, outstanding)
36
- - sortOrder: Sort direction (asc or desc, default: desc for newest first)
37
-
38
- INCLUDES:
39
- - include: Related data to fetch (lines, presentation)
40
- - lines: Invoice line items with quantities and amounts
41
- - presentation: Invoice styling/presentation settings
42
-
43
- PAGINATION:
44
- - page: Page number (default: 1)
45
- - perPage: Results per page (default: 30, max: 100)
46
-
47
- RETURNS:
48
- Array of invoices with amount, status, payment status, and line items.
49
- Plus pagination metadata (page, pages, total)
50
-
51
- EXAMPLES:
52
- - "Show all unpaid invoices"
53
- - "List invoices for customer 12345"
54
- - "Show me overdue invoices sorted by amount"
15
+ description: `List invoices from FreshBooks.
16
+
17
+ WHEN TO USE:
18
+ - User asks to see invoices, bills sent to clients, or outstanding payments
19
+ - User wants to review invoices for a specific client
20
+ - User needs to find invoices by status (draft, sent, paid, overdue)
21
+ - User asks "show my invoices", "what invoices are unpaid", "list client invoices"
22
+
23
+ REQUIRED:
24
+ - accountId: FreshBooks account ID (get from auth_status if not specified)
25
+
26
+ OPTIONAL FILTERS:
27
+ - customerId: Filter by specific customer/client
28
+ - status: Filter by invoice status (draft, sent, viewed, partial, paid, overdue, etc.)
29
+ - paymentStatus: Filter by payment status (unpaid, partial, paid)
30
+ - dateMin: Show invoices created after this date (YYYY-MM-DD)
31
+ - dateMax: Show invoices created before this date (YYYY-MM-DD)
32
+ - updatedSince: Show invoices updated since this time (ISO 8601)
33
+
34
+ SORTING:
35
+ - sortBy: Field to sort by (create_date, due_date, updated, amount, outstanding)
36
+ - sortOrder: Sort direction (asc or desc, default: desc for newest first)
37
+
38
+ INCLUDES:
39
+ - include: Related data to fetch (lines, presentation)
40
+ - lines: Invoice line items with quantities and amounts
41
+ - presentation: Invoice styling/presentation settings
42
+
43
+ PAGINATION:
44
+ - page: Page number (default: 1)
45
+ - perPage: Results per page (default: 30, max: 100)
46
+
47
+ RETURNS:
48
+ Array of invoices with amount, status, payment status, and line items.
49
+ Plus pagination metadata (page, pages, total)
50
+
51
+ EXAMPLES:
52
+ - "Show all unpaid invoices"
53
+ - "List invoices for customer 12345"
54
+ - "Show me overdue invoices sorted by amount"
55
55
  - "Get invoices with line items included"`,
56
56
  inputSchema: InvoiceListInputSchema,
57
57
  outputSchema: InvoiceListOutputSchema,
@@ -10,40 +10,40 @@ import { ErrorHandler } from "../../errors/error-handler.js";
10
10
  */
11
11
  export const projectCreateTool = {
12
12
  name: "project_create",
13
- description: `Create a new project in FreshBooks.
14
-
15
- WHEN TO USE:
16
- - User wants to create a new project
17
- - User says "start a project", "create project", "new project"
18
- - Setting up work tracking for a new client or initiative
19
-
20
- REQUIRED INFO:
21
- - title: Project name (user must provide)
22
- - accountId: FreshBooks account (get from context)
23
-
24
- OPTIONAL BUT HELPFUL:
25
- - clientId: Associate with a client for billing
26
- - description: What the project is about
27
- - dueDate: When project should be completed (ISO 8601)
28
- - billingMethod: How to bill (project_rate, service_rate, flat_rate, team_member_rate)
29
- - projectType: fixed_price or hourly_rate
30
- - rate: Hourly rate if hourly_rate type
31
- - fixedPrice: Total price if fixed_price type
32
- - budget: Project budget amount
33
- - internal: Set to true for non-billable internal work
34
-
35
- BILLING METHODS:
36
- - project_rate: Bill at project-level hourly rate
37
- - service_rate: Bill based on service assigned to time entries
38
- - flat_rate: Fixed price project
39
- - team_member_rate: Bill at individual team member rates
40
-
41
- EXAMPLE PROMPTS:
42
- - "Create a new project called Website Redesign"
43
- - "Start a project for client ABC123: Mobile App Development"
44
- - "New internal project for training, not billable"
45
-
46
- RETURNS:
13
+ description: `Create a new project in FreshBooks.
14
+
15
+ WHEN TO USE:
16
+ - User wants to create a new project
17
+ - User says "start a project", "create project", "new project"
18
+ - Setting up work tracking for a new client or initiative
19
+
20
+ REQUIRED INFO:
21
+ - title: Project name (user must provide)
22
+ - accountId: FreshBooks account (get from context)
23
+
24
+ OPTIONAL BUT HELPFUL:
25
+ - clientId: Associate with a client for billing
26
+ - description: What the project is about
27
+ - dueDate: When project should be completed (ISO 8601)
28
+ - billingMethod: How to bill (project_rate, service_rate, flat_rate, team_member_rate)
29
+ - projectType: fixed_price or hourly_rate
30
+ - rate: Hourly rate if hourly_rate type
31
+ - fixedPrice: Total price if fixed_price type
32
+ - budget: Project budget amount
33
+ - internal: Set to true for non-billable internal work
34
+
35
+ BILLING METHODS:
36
+ - project_rate: Bill at project-level hourly rate
37
+ - service_rate: Bill based on service assigned to time entries
38
+ - flat_rate: Fixed price project
39
+ - team_member_rate: Bill at individual team member rates
40
+
41
+ EXAMPLE PROMPTS:
42
+ - "Create a new project called Website Redesign"
43
+ - "Start a project for client ABC123: Mobile App Development"
44
+ - "New internal project for training, not billable"
45
+
46
+ RETURNS:
47
47
  Created project with ID and all configured settings. Use this ID for time tracking.`,
48
48
  inputSchema: ProjectCreateInputSchema,
49
49
  outputSchema: ProjectSingleOutputSchema,
@@ -11,44 +11,44 @@ import { ErrorHandler } from "../../errors/error-handler.js";
11
11
  */
12
12
  export const projectDeleteTool = {
13
13
  name: "project_delete",
14
- description: `Delete a project from FreshBooks.
15
-
16
- WARNING: This permanently deletes the project and cannot be undone.
17
-
18
- WHEN TO USE:
19
- - User wants to permanently remove a project
20
- - User says "delete project", "remove project"
21
- - Cleaning up test or duplicate projects
22
-
23
- REQUIRED INFO:
24
- - projectId: Which project to delete (numeric)
25
- - accountId: FreshBooks account (get from context)
26
-
27
- IMPORTANT WARNINGS:
28
- - Deletion is permanent and cannot be undone
29
- - Consider marking project inactive (active=false) instead for soft-delete
30
- - Time entries associated with project may be affected
31
- - Historical billing data will lose project reference
32
-
33
- SAFER ALTERNATIVES:
34
- - Use project_update with active=false to deactivate
35
- - Use project_update with complete=true to mark done
36
- - These preserve data and can be reversed
37
-
38
- WHEN TO ACTUALLY DELETE:
39
- - Test projects that were created by mistake
40
- - Duplicate projects
41
- - Projects with no time entries or billing history
42
-
43
- EXAMPLE PROMPTS:
44
- - "Delete project 12345" (use cautiously)
45
- - "Remove the test project I just created"
46
-
47
- BEFORE DELETING:
48
- Recommend asking user "Are you sure?" and suggesting deactivation as alternative.
49
- You might want to check if project has logged time first using project_single.
50
-
51
- RETURNS:
14
+ description: `Delete a project from FreshBooks.
15
+
16
+ WARNING: This permanently deletes the project and cannot be undone.
17
+
18
+ WHEN TO USE:
19
+ - User wants to permanently remove a project
20
+ - User says "delete project", "remove project"
21
+ - Cleaning up test or duplicate projects
22
+
23
+ REQUIRED INFO:
24
+ - projectId: Which project to delete (numeric)
25
+ - accountId: FreshBooks account (get from context)
26
+
27
+ IMPORTANT WARNINGS:
28
+ - Deletion is permanent and cannot be undone
29
+ - Consider marking project inactive (active=false) instead for soft-delete
30
+ - Time entries associated with project may be affected
31
+ - Historical billing data will lose project reference
32
+
33
+ SAFER ALTERNATIVES:
34
+ - Use project_update with active=false to deactivate
35
+ - Use project_update with complete=true to mark done
36
+ - These preserve data and can be reversed
37
+
38
+ WHEN TO ACTUALLY DELETE:
39
+ - Test projects that were created by mistake
40
+ - Duplicate projects
41
+ - Projects with no time entries or billing history
42
+
43
+ EXAMPLE PROMPTS:
44
+ - "Delete project 12345" (use cautiously)
45
+ - "Remove the test project I just created"
46
+
47
+ BEFORE DELETING:
48
+ Recommend asking user "Are you sure?" and suggesting deactivation as alternative.
49
+ You might want to check if project has logged time first using project_single.
50
+
51
+ RETURNS:
52
52
  Success confirmation with the deleted project ID.`,
53
53
  inputSchema: ProjectDeleteInputSchema,
54
54
  outputSchema: ProjectDeleteOutputSchema,