@goodsamsoftware/freshbooks-mcp 1.0.5 → 1.0.7
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.
- package/LICENSE +21 -21
- package/README.md +357 -357
- package/dist/tools/client/client-create.js +38 -38
- package/dist/tools/client/client-list.js +47 -47
- package/dist/tools/client/client-update.js +34 -34
- package/dist/tools/credit-note/creditnote-single.js +18 -18
- package/dist/tools/expense/expense-update.d.ts.map +1 -1
- package/dist/tools/expense/expense-update.js +4 -4
- package/dist/tools/expense/expense-update.js.map +1 -1
- package/dist/tools/invoice/invoice-list.js +40 -40
- package/dist/tools/project/project-create.js +34 -34
- package/dist/tools/project/project-delete.js +38 -38
- package/dist/tools/project/project-list.js +38 -38
- package/dist/tools/project/project-single.js +23 -23
- package/dist/tools/project/project-update.js +37 -37
- package/dist/tools/task/task-create.js +36 -36
- package/dist/tools/task/task-delete.js +35 -35
- package/dist/tools/task/task-list.js +28 -28
- package/dist/tools/task/task-single.js +25 -25
- package/dist/tools/task/task-update.js +39 -39
- package/dist/tools/time-entry/timeentry-create.js +49 -49
- package/dist/tools/time-entry/timeentry-delete.js +48 -48
- package/dist/tools/time-entry/timeentry-list.js +53 -53
- package/dist/tools/time-entry/timeentry-single.js +28 -28
- package/dist/tools/time-entry/timeentry-update.js +61 -61
- package/dist/tools/timer/timer-current.js +54 -54
- package/dist/tools/timer/timer-discard.js +41 -41
- package/dist/tools/timer/timer-start.js +43 -43
- package/dist/tools/timer/timer-stop.js +33 -33
- 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;
|
|
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
|
|
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,
|
|
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,
|