@daften/fireflyiii-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +15 -0
- package/CHANGELOG.md +28 -0
- package/LICENSE +21 -0
- package/README.md +605 -0
- package/dist/args.d.ts +10 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +65 -0
- package/dist/args.js.map +1 -0
- package/dist/client.d.ts +25 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +146 -0
- package/dist/client.js.map +1 -0
- package/dist/http.d.ts +13 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +271 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +13 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/_annotations.d.ts +17 -0
- package/dist/tools/_annotations.d.ts.map +1 -0
- package/dist/tools/_annotations.js +9 -0
- package/dist/tools/_annotations.js.map +1 -0
- package/dist/tools/_helpers.d.ts +17 -0
- package/dist/tools/_helpers.d.ts.map +1 -0
- package/dist/tools/_helpers.js +24 -0
- package/dist/tools/_helpers.js.map +1 -0
- package/dist/tools/accounts.d.ts +48 -0
- package/dist/tools/accounts.d.ts.map +1 -0
- package/dist/tools/accounts.js +151 -0
- package/dist/tools/accounts.js.map +1 -0
- package/dist/tools/attachments.d.ts +31 -0
- package/dist/tools/attachments.d.ts.map +1 -0
- package/dist/tools/attachments.js +112 -0
- package/dist/tools/attachments.js.map +1 -0
- package/dist/tools/bills.d.ts +43 -0
- package/dist/tools/bills.d.ts.map +1 -0
- package/dist/tools/bills.js +112 -0
- package/dist/tools/bills.js.map +1 -0
- package/dist/tools/budgets.d.ts +65 -0
- package/dist/tools/budgets.d.ts.map +1 -0
- package/dist/tools/budgets.js +209 -0
- package/dist/tools/budgets.js.map +1 -0
- package/dist/tools/categories.d.ts +27 -0
- package/dist/tools/categories.d.ts.map +1 -0
- package/dist/tools/categories.js +83 -0
- package/dist/tools/categories.js.map +1 -0
- package/dist/tools/currencies.d.ts +32 -0
- package/dist/tools/currencies.d.ts.map +1 -0
- package/dist/tools/currencies.js +104 -0
- package/dist/tools/currencies.js.map +1 -0
- package/dist/tools/exports.d.ts +10 -0
- package/dist/tools/exports.d.ts.map +1 -0
- package/dist/tools/exports.js +37 -0
- package/dist/tools/exports.js.map +1 -0
- package/dist/tools/index.d.ts +14 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +94 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/object-groups.d.ts +30 -0
- package/dist/tools/object-groups.d.ts.map +1 -0
- package/dist/tools/object-groups.js +107 -0
- package/dist/tools/object-groups.js.map +1 -0
- package/dist/tools/piggy-banks.d.ts +41 -0
- package/dist/tools/piggy-banks.d.ts.map +1 -0
- package/dist/tools/piggy-banks.js +110 -0
- package/dist/tools/piggy-banks.js.map +1 -0
- package/dist/tools/recurring.d.ts +70 -0
- package/dist/tools/recurring.d.ts.map +1 -0
- package/dist/tools/recurring.js +279 -0
- package/dist/tools/recurring.js.map +1 -0
- package/dist/tools/reports.d.ts +40 -0
- package/dist/tools/reports.d.ts.map +1 -0
- package/dist/tools/reports.js +413 -0
- package/dist/tools/reports.js.map +1 -0
- package/dist/tools/rules.d.ts +105 -0
- package/dist/tools/rules.d.ts.map +1 -0
- package/dist/tools/rules.js +361 -0
- package/dist/tools/rules.js.map +1 -0
- package/dist/tools/transaction-links.d.ts +30 -0
- package/dist/tools/transaction-links.d.ts.map +1 -0
- package/dist/tools/transaction-links.js +91 -0
- package/dist/tools/transaction-links.js.map +1 -0
- package/dist/tools/transactions.d.ts +72 -0
- package/dist/tools/transactions.d.ts.map +1 -0
- package/dist/tools/transactions.js +262 -0
- package/dist/tools/transactions.js.map +1 -0
- package/dist/transform.d.ts +48 -0
- package/dist/transform.d.ts.map +1 -0
- package/dist/transform.js +29 -0
- package/dist/transform.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { unwrapList, unwrapSingle, } from '../transform.js';
|
|
3
|
+
import { DELETE_ANNOTATIONS, READ_ANNOTATIONS, UPDATE_ANNOTATIONS, WRITE_ANNOTATIONS } from './_annotations.js';
|
|
4
|
+
import { dateSchema, defineTool } from './_helpers.js';
|
|
5
|
+
// ---- Rule group fetch + CRUD ----
|
|
6
|
+
export async function fetchRuleGroups(client, params) {
|
|
7
|
+
const query = { page: params.page, limit: params.limit };
|
|
8
|
+
const response = await client.get('/rule-groups', query);
|
|
9
|
+
return unwrapList(response);
|
|
10
|
+
}
|
|
11
|
+
export async function fetchRuleGroup(client, id) {
|
|
12
|
+
const response = await client.get(`/rule-groups/${id}`);
|
|
13
|
+
return unwrapSingle(response);
|
|
14
|
+
}
|
|
15
|
+
export async function createRuleGroup(client, params) {
|
|
16
|
+
const response = await client.post('/rule-groups', params);
|
|
17
|
+
return unwrapSingle(response);
|
|
18
|
+
}
|
|
19
|
+
export async function updateRuleGroup(client, id, params) {
|
|
20
|
+
const response = await client.put(`/rule-groups/${id}`, params);
|
|
21
|
+
return unwrapSingle(response);
|
|
22
|
+
}
|
|
23
|
+
export async function deleteRuleGroup(client, id) {
|
|
24
|
+
await client.delete(`/rule-groups/${id}`);
|
|
25
|
+
return { deleted: true, id };
|
|
26
|
+
}
|
|
27
|
+
export async function fetchRules(client, params) {
|
|
28
|
+
const query = { page: params.page, limit: params.limit };
|
|
29
|
+
const response = await client.get('/rules', query);
|
|
30
|
+
return unwrapList(response);
|
|
31
|
+
}
|
|
32
|
+
export async function fetchRule(client, id) {
|
|
33
|
+
const response = await client.get(`/rules/${id}`);
|
|
34
|
+
return unwrapSingle(response);
|
|
35
|
+
}
|
|
36
|
+
export async function createRule(client, params) {
|
|
37
|
+
const response = await client.post('/rules', params);
|
|
38
|
+
return unwrapSingle(response);
|
|
39
|
+
}
|
|
40
|
+
export async function updateRule(client, id, params) {
|
|
41
|
+
const response = await client.put(`/rules/${id}`, params);
|
|
42
|
+
return unwrapSingle(response);
|
|
43
|
+
}
|
|
44
|
+
export async function deleteRule(client, id) {
|
|
45
|
+
await client.delete(`/rules/${id}`);
|
|
46
|
+
return { deleted: true, id };
|
|
47
|
+
}
|
|
48
|
+
// ---- Trigger and test operations ----
|
|
49
|
+
export async function triggerRuleGroup(client, id, params) {
|
|
50
|
+
const query = {};
|
|
51
|
+
if (params.start)
|
|
52
|
+
query.start = params.start;
|
|
53
|
+
if (params.end)
|
|
54
|
+
query.end = params.end;
|
|
55
|
+
if (params.accounts?.length)
|
|
56
|
+
query['accounts[]'] = params.accounts;
|
|
57
|
+
await client.post(`/rule-groups/${id}/trigger`, undefined, query);
|
|
58
|
+
return { triggered: true, id };
|
|
59
|
+
}
|
|
60
|
+
export async function triggerRule(client, id, params) {
|
|
61
|
+
const query = {};
|
|
62
|
+
if (params.start)
|
|
63
|
+
query.start = params.start;
|
|
64
|
+
if (params.end)
|
|
65
|
+
query.end = params.end;
|
|
66
|
+
if (params.accounts?.length)
|
|
67
|
+
query['accounts[]'] = params.accounts;
|
|
68
|
+
await client.post(`/rules/${id}/trigger`, undefined, query);
|
|
69
|
+
return { triggered: true, id };
|
|
70
|
+
}
|
|
71
|
+
export async function testRuleGroup(client, id, params) {
|
|
72
|
+
const query = {};
|
|
73
|
+
if (params.start)
|
|
74
|
+
query.start = params.start;
|
|
75
|
+
if (params.end)
|
|
76
|
+
query.end = params.end;
|
|
77
|
+
if (params.accounts?.length)
|
|
78
|
+
query['accounts[]'] = params.accounts;
|
|
79
|
+
if (params.search_limit !== undefined)
|
|
80
|
+
query.search_limit = params.search_limit;
|
|
81
|
+
if (params.triggered_limit !== undefined)
|
|
82
|
+
query.triggered_limit = params.triggered_limit;
|
|
83
|
+
const response = await client.get(`/rule-groups/${id}/test`, query);
|
|
84
|
+
return unwrapList(response);
|
|
85
|
+
}
|
|
86
|
+
export async function fetchRuleGroupRules(client, id, params) {
|
|
87
|
+
const query = { page: params.page, limit: params.limit };
|
|
88
|
+
const response = await client.get(`/rule-groups/${id}/rules`, query);
|
|
89
|
+
return unwrapList(response);
|
|
90
|
+
}
|
|
91
|
+
export async function testRule(client, id, params) {
|
|
92
|
+
const query = {};
|
|
93
|
+
if (params.start)
|
|
94
|
+
query.start = params.start;
|
|
95
|
+
if (params.end)
|
|
96
|
+
query.end = params.end;
|
|
97
|
+
if (params.accounts?.length)
|
|
98
|
+
query['accounts[]'] = params.accounts;
|
|
99
|
+
if (params.search_limit !== undefined)
|
|
100
|
+
query.search_limit = params.search_limit;
|
|
101
|
+
if (params.triggered_limit !== undefined)
|
|
102
|
+
query.triggered_limit = params.triggered_limit;
|
|
103
|
+
const response = await client.get(`/rules/${id}/test`, query);
|
|
104
|
+
return unwrapList(response);
|
|
105
|
+
}
|
|
106
|
+
const triggerTypeSchema = z
|
|
107
|
+
.string()
|
|
108
|
+
.describe('Trigger type. Common values: from_account_starts, from_account_ends, from_account_is, from_account_contains, to_account_starts, to_account_ends, to_account_is, to_account_contains, amount_less, amount_exactly, amount_more, description_starts, description_ends, description_contains, description_is, transaction_type, category_is, budget_is, tag_is, currency_is, has_attachments, has_no_category, has_any_category, has_no_budget, has_any_budget, has_no_tag, has_any_tag, notes_contains, notes_starts, notes_end, notes_are, no_notes, any_notes, source_account_is, destination_account_is, source_account_starts');
|
|
109
|
+
const actionTypeSchema = z
|
|
110
|
+
.string()
|
|
111
|
+
.describe('Action type. Common values: user_action, set_category, clear_category, set_budget, clear_budget, add_tag, remove_tag, remove_all_tags, set_description, append_description, prepend_description, set_source_account, set_destination_account, set_notes, append_notes, prepend_notes, clear_notes, link_to_bill, convert_withdrawal, convert_deposit, convert_transfer, delete_transaction');
|
|
112
|
+
const triggerObjectSchema = z.object({
|
|
113
|
+
type: triggerTypeSchema.describe('Trigger type'),
|
|
114
|
+
value: z.string().describe('Value the trigger matches against'),
|
|
115
|
+
prohibited: z.boolean().optional().describe('Negate this trigger (IS becomes IS NOT)'),
|
|
116
|
+
active: z.boolean().optional().default(true),
|
|
117
|
+
stop_processing: z.boolean().optional().default(false),
|
|
118
|
+
order: z.number().int().optional(),
|
|
119
|
+
});
|
|
120
|
+
const actionObjectSchema = z.object({
|
|
121
|
+
type: actionTypeSchema.describe('Action type'),
|
|
122
|
+
value: z.string().nullable().describe('Value for the action (empty string for clear/boolean actions)'),
|
|
123
|
+
active: z.boolean().optional().default(true),
|
|
124
|
+
stop_processing: z.boolean().optional().default(false),
|
|
125
|
+
order: z.number().int().optional(),
|
|
126
|
+
});
|
|
127
|
+
export function registerRuleTools(server, client) {
|
|
128
|
+
// ---- Rule Group tools ----
|
|
129
|
+
defineTool(server, 'get_rule_groups', {
|
|
130
|
+
title: 'Get Rule Groups',
|
|
131
|
+
description: 'Get all rule groups from Firefly III.',
|
|
132
|
+
inputSchema: {
|
|
133
|
+
page: z.number().int().positive().optional().default(1).describe('Page number'),
|
|
134
|
+
limit: z.number().int().positive().max(100).optional().default(50).describe('Results per page (max 100)'),
|
|
135
|
+
},
|
|
136
|
+
annotations: READ_ANNOTATIONS,
|
|
137
|
+
}, ({ page, limit }) => fetchRuleGroups(client, { page: page, limit: limit }));
|
|
138
|
+
defineTool(server, 'get_rule_group', {
|
|
139
|
+
title: 'Get Rule Group',
|
|
140
|
+
description: 'Get a single rule group by its numeric ID. Use get_rule_groups to find valid IDs.',
|
|
141
|
+
inputSchema: {
|
|
142
|
+
id: z.string().describe('Rule group ID'),
|
|
143
|
+
},
|
|
144
|
+
annotations: READ_ANNOTATIONS,
|
|
145
|
+
}, ({ id }) => fetchRuleGroup(client, id));
|
|
146
|
+
defineTool(server, 'create_rule_group', {
|
|
147
|
+
title: 'Create Rule Group',
|
|
148
|
+
description: 'Create a new rule group in Firefly III.',
|
|
149
|
+
inputSchema: {
|
|
150
|
+
title: z.string().describe('Rule group name'),
|
|
151
|
+
description: z.string().optional().describe('Description'),
|
|
152
|
+
active: z.boolean().optional().default(true).describe('Whether the group is active'),
|
|
153
|
+
},
|
|
154
|
+
annotations: WRITE_ANNOTATIONS,
|
|
155
|
+
}, ({ title, description, active }) => createRuleGroup(client, {
|
|
156
|
+
title: title,
|
|
157
|
+
description: description,
|
|
158
|
+
active: active,
|
|
159
|
+
}));
|
|
160
|
+
defineTool(server, 'update_rule_group', {
|
|
161
|
+
title: 'Update Rule Group',
|
|
162
|
+
description: 'Update an existing rule group. Only fields provided will be changed. Use get_rule_group to confirm the ID before updating.',
|
|
163
|
+
inputSchema: {
|
|
164
|
+
id: z.string().describe('Rule group ID — use get_rule_groups to find valid IDs'),
|
|
165
|
+
title: z.string().optional().describe('Rule group name'),
|
|
166
|
+
description: z.string().optional().describe('Description'),
|
|
167
|
+
active: z.boolean().optional().describe('Whether the group is active'),
|
|
168
|
+
},
|
|
169
|
+
annotations: UPDATE_ANNOTATIONS,
|
|
170
|
+
}, ({ id, title, description, active }) => updateRuleGroup(client, id, {
|
|
171
|
+
title: title,
|
|
172
|
+
description: description,
|
|
173
|
+
active: active,
|
|
174
|
+
}));
|
|
175
|
+
defineTool(server, 'delete_rule_group', {
|
|
176
|
+
title: 'Delete Rule Group',
|
|
177
|
+
description: 'Permanently delete a rule group and all its rules from Firefly III. **This action cannot be undone.** Use get_rule_group to confirm before deleting.',
|
|
178
|
+
inputSchema: {
|
|
179
|
+
id: z.string().describe('Rule group ID — use get_rule_groups to find valid IDs'),
|
|
180
|
+
},
|
|
181
|
+
annotations: DELETE_ANNOTATIONS,
|
|
182
|
+
}, ({ id }) => deleteRuleGroup(client, id));
|
|
183
|
+
// ---- Rule tools ----
|
|
184
|
+
defineTool(server, 'get_rules', {
|
|
185
|
+
title: 'Get Rules',
|
|
186
|
+
description: 'Get all automation rules from Firefly III.',
|
|
187
|
+
inputSchema: {
|
|
188
|
+
page: z.number().int().positive().optional().default(1).describe('Page number'),
|
|
189
|
+
limit: z.number().int().positive().max(100).optional().default(50).describe('Results per page (max 100)'),
|
|
190
|
+
},
|
|
191
|
+
annotations: READ_ANNOTATIONS,
|
|
192
|
+
}, ({ page, limit }) => fetchRules(client, { page: page, limit: limit }));
|
|
193
|
+
defineTool(server, 'get_rule', {
|
|
194
|
+
title: 'Get Rule',
|
|
195
|
+
description: 'Get a single automation rule by its numeric ID. Use get_rules to find valid IDs.',
|
|
196
|
+
inputSchema: {
|
|
197
|
+
id: z.string().describe('Rule ID'),
|
|
198
|
+
},
|
|
199
|
+
annotations: READ_ANNOTATIONS,
|
|
200
|
+
}, ({ id }) => fetchRule(client, id));
|
|
201
|
+
defineTool(server, 'create_rule', {
|
|
202
|
+
title: 'Create Rule',
|
|
203
|
+
description: 'Create a new automation rule in Firefly III. Use get_rule_groups to find a valid rule_group_id.',
|
|
204
|
+
inputSchema: {
|
|
205
|
+
title: z.string().describe('Rule name'),
|
|
206
|
+
rule_group_id: z.string().describe('Rule group ID — use get_rule_groups to find valid IDs'),
|
|
207
|
+
trigger: z
|
|
208
|
+
.enum(['store-journal', 'update-journal'])
|
|
209
|
+
.describe('When this rule fires: store-journal (on transaction creation) or update-journal (on transaction update)'),
|
|
210
|
+
triggers: z.array(triggerObjectSchema).min(1).describe('List of trigger conditions'),
|
|
211
|
+
actions: z.array(actionObjectSchema).min(1).describe('List of actions to perform when triggers match'),
|
|
212
|
+
description: z.string().optional().describe('Description'),
|
|
213
|
+
active: z.boolean().optional().default(true).describe('Whether the rule is active'),
|
|
214
|
+
strict: z.boolean().optional().default(true).describe('ALL triggers must match (true) or ANY trigger (false)'),
|
|
215
|
+
stop_processing: z
|
|
216
|
+
.boolean()
|
|
217
|
+
.optional()
|
|
218
|
+
.default(false)
|
|
219
|
+
.describe('Stop processing further rules after this one matches'),
|
|
220
|
+
},
|
|
221
|
+
annotations: WRITE_ANNOTATIONS,
|
|
222
|
+
}, ({ title, rule_group_id, trigger, triggers, actions, description, active, strict, stop_processing }) => createRule(client, {
|
|
223
|
+
title: title,
|
|
224
|
+
rule_group_id: rule_group_id,
|
|
225
|
+
trigger: trigger,
|
|
226
|
+
triggers: triggers,
|
|
227
|
+
actions: actions,
|
|
228
|
+
description: description,
|
|
229
|
+
active: active,
|
|
230
|
+
strict: strict,
|
|
231
|
+
stop_processing: stop_processing,
|
|
232
|
+
}));
|
|
233
|
+
defineTool(server, 'update_rule', {
|
|
234
|
+
title: 'Update Rule',
|
|
235
|
+
description: 'Update an existing automation rule. Only fields provided will be changed. Use get_rule to confirm the ID before updating.',
|
|
236
|
+
inputSchema: {
|
|
237
|
+
id: z.string().describe('Rule ID — use get_rules to find valid IDs'),
|
|
238
|
+
title: z.string().optional().describe('Rule name'),
|
|
239
|
+
rule_group_id: z.string().optional().describe('Rule group ID'),
|
|
240
|
+
trigger: z.enum(['store-journal', 'update-journal']).optional().describe('When this rule fires'),
|
|
241
|
+
triggers: z.array(triggerObjectSchema).min(1).optional().describe('List of trigger conditions'),
|
|
242
|
+
actions: z.array(actionObjectSchema).min(1).optional().describe('List of actions'),
|
|
243
|
+
description: z.string().optional().describe('Description'),
|
|
244
|
+
active: z.boolean().optional().describe('Whether the rule is active'),
|
|
245
|
+
strict: z.boolean().optional().describe('ALL triggers must match (true) or ANY trigger (false)'),
|
|
246
|
+
stop_processing: z.boolean().optional().describe('Stop processing further rules after this one'),
|
|
247
|
+
},
|
|
248
|
+
annotations: UPDATE_ANNOTATIONS,
|
|
249
|
+
}, ({ id, title, rule_group_id, trigger, triggers, actions, description, active, strict, stop_processing }) => updateRule(client, id, {
|
|
250
|
+
title: title,
|
|
251
|
+
rule_group_id: rule_group_id,
|
|
252
|
+
trigger: trigger,
|
|
253
|
+
triggers: triggers,
|
|
254
|
+
actions: actions,
|
|
255
|
+
description: description,
|
|
256
|
+
active: active,
|
|
257
|
+
strict: strict,
|
|
258
|
+
stop_processing: stop_processing,
|
|
259
|
+
}));
|
|
260
|
+
defineTool(server, 'delete_rule', {
|
|
261
|
+
title: 'Delete Rule',
|
|
262
|
+
description: 'Permanently delete an automation rule from Firefly III. **This action cannot be undone.** Use get_rule to confirm before deleting.',
|
|
263
|
+
inputSchema: {
|
|
264
|
+
id: z.string().describe('Rule ID — use get_rules to find valid IDs'),
|
|
265
|
+
},
|
|
266
|
+
annotations: DELETE_ANNOTATIONS,
|
|
267
|
+
}, ({ id }) => deleteRule(client, id));
|
|
268
|
+
// ---- Trigger and test tools ----
|
|
269
|
+
defineTool(server, 'get_rule_group_rules', {
|
|
270
|
+
title: 'Get Rule Group Rules',
|
|
271
|
+
description: 'Get all rules belonging to a specific rule group. Use get_rule_groups to find valid rule group IDs.',
|
|
272
|
+
inputSchema: {
|
|
273
|
+
id: z.string().describe('Rule group ID'),
|
|
274
|
+
page: z.number().int().positive().optional().default(1).describe('Page number'),
|
|
275
|
+
limit: z.number().int().positive().max(100).optional().default(50).describe('Results per page (max 100)'),
|
|
276
|
+
},
|
|
277
|
+
annotations: READ_ANNOTATIONS,
|
|
278
|
+
}, ({ id, page, limit }) => fetchRuleGroupRules(client, id, {
|
|
279
|
+
page: page,
|
|
280
|
+
limit: limit,
|
|
281
|
+
}));
|
|
282
|
+
defineTool(server, 'trigger_rule_group', {
|
|
283
|
+
title: 'Trigger Rule Group',
|
|
284
|
+
description: 'Manually run all rules in a rule group against existing transactions. Use get_rule_groups to find valid IDs.',
|
|
285
|
+
inputSchema: {
|
|
286
|
+
id: z.string().describe('Rule group ID — use get_rule_groups to find valid IDs'),
|
|
287
|
+
start: dateSchema.optional().describe('Filter transactions from this date (YYYY-MM-DD)'),
|
|
288
|
+
end: dateSchema.optional().describe('Filter transactions to this date (YYYY-MM-DD)'),
|
|
289
|
+
accounts: z.array(z.number().int().positive()).optional().describe('Limit to these account IDs'),
|
|
290
|
+
},
|
|
291
|
+
annotations: { openWorldHint: true },
|
|
292
|
+
}, ({ id, start, end, accounts }) => triggerRuleGroup(client, id, {
|
|
293
|
+
start: start,
|
|
294
|
+
end: end,
|
|
295
|
+
accounts: accounts,
|
|
296
|
+
}));
|
|
297
|
+
defineTool(server, 'trigger_rule', {
|
|
298
|
+
title: 'Trigger Rule',
|
|
299
|
+
description: 'Manually run a single rule against existing transactions. Use get_rules to find valid IDs.',
|
|
300
|
+
inputSchema: {
|
|
301
|
+
id: z.string().describe('Rule ID — use get_rules to find valid IDs'),
|
|
302
|
+
start: dateSchema.optional().describe('Filter transactions from this date (YYYY-MM-DD)'),
|
|
303
|
+
end: dateSchema.optional().describe('Filter transactions to this date (YYYY-MM-DD)'),
|
|
304
|
+
accounts: z.array(z.number().int().positive()).optional().describe('Limit to these account IDs'),
|
|
305
|
+
},
|
|
306
|
+
annotations: { openWorldHint: true },
|
|
307
|
+
}, ({ id, start, end, accounts }) => triggerRule(client, id, {
|
|
308
|
+
start: start,
|
|
309
|
+
end: end,
|
|
310
|
+
accounts: accounts,
|
|
311
|
+
}));
|
|
312
|
+
defineTool(server, 'test_rule_group', {
|
|
313
|
+
title: 'Test Rule Group',
|
|
314
|
+
description: 'Dry-run a rule group against existing transactions and return matching transactions without applying any changes. Use get_rule_groups to find valid IDs.',
|
|
315
|
+
inputSchema: {
|
|
316
|
+
id: z.string().describe('Rule group ID — use get_rule_groups to find valid IDs'),
|
|
317
|
+
start: dateSchema.optional().describe('Filter transactions from this date (YYYY-MM-DD)'),
|
|
318
|
+
end: dateSchema.optional().describe('Filter transactions to this date (YYYY-MM-DD)'),
|
|
319
|
+
accounts: z.array(z.number().int().positive()).optional().describe('Limit to these account IDs'),
|
|
320
|
+
search_limit: z.number().int().positive().optional().describe('Maximum number of transactions to search'),
|
|
321
|
+
triggered_limit: z
|
|
322
|
+
.number()
|
|
323
|
+
.int()
|
|
324
|
+
.positive()
|
|
325
|
+
.optional()
|
|
326
|
+
.describe('Maximum number of triggered transactions to return'),
|
|
327
|
+
},
|
|
328
|
+
annotations: READ_ANNOTATIONS,
|
|
329
|
+
}, ({ id, start, end, accounts, search_limit, triggered_limit }) => testRuleGroup(client, id, {
|
|
330
|
+
start: start,
|
|
331
|
+
end: end,
|
|
332
|
+
accounts: accounts,
|
|
333
|
+
search_limit: search_limit,
|
|
334
|
+
triggered_limit: triggered_limit,
|
|
335
|
+
}));
|
|
336
|
+
defineTool(server, 'test_rule', {
|
|
337
|
+
title: 'Test Rule',
|
|
338
|
+
description: 'Dry-run a single rule against existing transactions and return matching transactions without applying any changes. Use get_rules to find valid IDs.',
|
|
339
|
+
inputSchema: {
|
|
340
|
+
id: z.string().describe('Rule ID — use get_rules to find valid IDs'),
|
|
341
|
+
start: dateSchema.optional().describe('Filter transactions from this date (YYYY-MM-DD)'),
|
|
342
|
+
end: dateSchema.optional().describe('Filter transactions to this date (YYYY-MM-DD)'),
|
|
343
|
+
accounts: z.array(z.number().int().positive()).optional().describe('Limit to these account IDs'),
|
|
344
|
+
search_limit: z.number().int().positive().optional().describe('Maximum number of transactions to search'),
|
|
345
|
+
triggered_limit: z
|
|
346
|
+
.number()
|
|
347
|
+
.int()
|
|
348
|
+
.positive()
|
|
349
|
+
.optional()
|
|
350
|
+
.describe('Maximum number of triggered transactions to return'),
|
|
351
|
+
},
|
|
352
|
+
annotations: READ_ANNOTATIONS,
|
|
353
|
+
}, ({ id, start, end, accounts, search_limit, triggered_limit }) => testRule(client, id, {
|
|
354
|
+
start: start,
|
|
355
|
+
end: end,
|
|
356
|
+
accounts: accounts,
|
|
357
|
+
search_limit: search_limit,
|
|
358
|
+
triggered_limit: triggered_limit,
|
|
359
|
+
}));
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/tools/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { FireflyClient } from '../client.js';
|
|
3
|
+
import { type UnwrappedList, type UnwrappedSingle } from '../transform.js';
|
|
4
|
+
export declare function fetchLinkTypes(client: FireflyClient, params: {
|
|
5
|
+
page?: number;
|
|
6
|
+
limit?: number;
|
|
7
|
+
}): Promise<UnwrappedList>;
|
|
8
|
+
export declare function fetchTransactionLinks(client: FireflyClient, journalId: string, params: {
|
|
9
|
+
page?: number;
|
|
10
|
+
limit?: number;
|
|
11
|
+
}): Promise<UnwrappedList>;
|
|
12
|
+
export declare function fetchTransactionLink(client: FireflyClient, id: string): Promise<UnwrappedSingle>;
|
|
13
|
+
export declare function createTransactionLink(client: FireflyClient, params: {
|
|
14
|
+
link_type_id: string;
|
|
15
|
+
in_id: string;
|
|
16
|
+
out_id: string;
|
|
17
|
+
notes?: string;
|
|
18
|
+
}): Promise<UnwrappedSingle>;
|
|
19
|
+
export declare function updateTransactionLink(client: FireflyClient, id: string, params: {
|
|
20
|
+
link_type_id?: string;
|
|
21
|
+
in_id?: string;
|
|
22
|
+
out_id?: string;
|
|
23
|
+
notes?: string;
|
|
24
|
+
}): Promise<UnwrappedSingle>;
|
|
25
|
+
export declare function deleteTransactionLink(client: FireflyClient, id: string): Promise<{
|
|
26
|
+
deleted: true;
|
|
27
|
+
id: string;
|
|
28
|
+
}>;
|
|
29
|
+
export declare function registerTransactionLinkTools(server: McpServer, client: FireflyClient): void;
|
|
30
|
+
//# sourceMappingURL=transaction-links.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-links.d.ts","sourceRoot":"","sources":["../../src/tools/transaction-links.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,eAAe,EAGrB,MAAM,iBAAiB,CAAC;AAIzB,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC,aAAa,CAAC,CAGxB;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC,aAAa,CAAC,CAMxB;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAGtG;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9E,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACjF,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAGrH;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAmG3F"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { unwrapList, unwrapSingle, } from '../transform.js';
|
|
3
|
+
import { DELETE_ANNOTATIONS, READ_ANNOTATIONS, UPDATE_ANNOTATIONS, WRITE_ANNOTATIONS } from './_annotations.js';
|
|
4
|
+
import { defineTool } from './_helpers.js';
|
|
5
|
+
export async function fetchLinkTypes(client, params) {
|
|
6
|
+
const response = await client.get('/link-types', { page: params.page, limit: params.limit });
|
|
7
|
+
return unwrapList(response);
|
|
8
|
+
}
|
|
9
|
+
export async function fetchTransactionLinks(client, journalId, params) {
|
|
10
|
+
const response = await client.get(`/transaction-journals/${journalId}/links`, {
|
|
11
|
+
page: params.page,
|
|
12
|
+
limit: params.limit,
|
|
13
|
+
});
|
|
14
|
+
return unwrapList(response);
|
|
15
|
+
}
|
|
16
|
+
export async function fetchTransactionLink(client, id) {
|
|
17
|
+
const response = await client.get(`/transaction-links/${id}`);
|
|
18
|
+
return unwrapSingle(response);
|
|
19
|
+
}
|
|
20
|
+
export async function createTransactionLink(client, params) {
|
|
21
|
+
const response = await client.post('/transaction-links', params);
|
|
22
|
+
return unwrapSingle(response);
|
|
23
|
+
}
|
|
24
|
+
export async function updateTransactionLink(client, id, params) {
|
|
25
|
+
const response = await client.put(`/transaction-links/${id}`, params);
|
|
26
|
+
return unwrapSingle(response);
|
|
27
|
+
}
|
|
28
|
+
export async function deleteTransactionLink(client, id) {
|
|
29
|
+
await client.delete(`/transaction-links/${id}`);
|
|
30
|
+
return { deleted: true, id };
|
|
31
|
+
}
|
|
32
|
+
export function registerTransactionLinkTools(server, client) {
|
|
33
|
+
defineTool(server, 'get_link_types', {
|
|
34
|
+
title: 'Get Link Types',
|
|
35
|
+
description: 'Get all available transaction link types (e.g. "Related", "Refund", "Paid"). Use these IDs when creating transaction links.',
|
|
36
|
+
inputSchema: {
|
|
37
|
+
page: z.number().int().positive().optional().default(1).describe('Page number'),
|
|
38
|
+
limit: z.number().int().positive().max(100).optional().default(50).describe('Results per page (max 100)'),
|
|
39
|
+
},
|
|
40
|
+
annotations: READ_ANNOTATIONS,
|
|
41
|
+
}, ({ page, limit }) => fetchLinkTypes(client, { page: page, limit: limit }));
|
|
42
|
+
defineTool(server, 'get_transaction_links', {
|
|
43
|
+
title: 'Get Transaction Links',
|
|
44
|
+
description: 'Get all links attached to a specific transaction journal entry. Use get_transactions to find valid journal IDs.',
|
|
45
|
+
inputSchema: {
|
|
46
|
+
journal_id: z.string().describe('Transaction journal ID'),
|
|
47
|
+
page: z.number().int().positive().optional().default(1).describe('Page number'),
|
|
48
|
+
limit: z.number().int().positive().max(100).optional().default(50).describe('Results per page (max 100)'),
|
|
49
|
+
},
|
|
50
|
+
annotations: READ_ANNOTATIONS,
|
|
51
|
+
}, ({ journal_id, page, limit }) => fetchTransactionLinks(client, journal_id, {
|
|
52
|
+
page: page,
|
|
53
|
+
limit: limit,
|
|
54
|
+
}));
|
|
55
|
+
defineTool(server, 'get_transaction_link', {
|
|
56
|
+
title: 'Get Transaction Link',
|
|
57
|
+
description: 'Get a single transaction link by ID.',
|
|
58
|
+
inputSchema: { id: z.string().describe('Transaction link ID') },
|
|
59
|
+
annotations: READ_ANNOTATIONS,
|
|
60
|
+
}, ({ id }) => fetchTransactionLink(client, id));
|
|
61
|
+
defineTool(server, 'create_transaction_link', {
|
|
62
|
+
title: 'Create Transaction Link',
|
|
63
|
+
description: 'Create a link between two transactions (e.g. mark one as a refund of another). Use get_link_types to find valid link_type_id values.',
|
|
64
|
+
inputSchema: {
|
|
65
|
+
link_type_id: z.string().describe('Link type ID — use get_link_types to find valid IDs'),
|
|
66
|
+
in_id: z.string().describe('Inward transaction journal ID'),
|
|
67
|
+
out_id: z.string().describe('Outward transaction journal ID'),
|
|
68
|
+
notes: z.string().optional().describe('Notes about this link'),
|
|
69
|
+
},
|
|
70
|
+
annotations: WRITE_ANNOTATIONS,
|
|
71
|
+
}, (params) => createTransactionLink(client, params));
|
|
72
|
+
defineTool(server, 'update_transaction_link', {
|
|
73
|
+
title: 'Update Transaction Link',
|
|
74
|
+
description: 'Update an existing transaction link. Only fields provided will be changed.',
|
|
75
|
+
inputSchema: {
|
|
76
|
+
id: z.string().describe('Transaction link ID'),
|
|
77
|
+
link_type_id: z.string().optional().describe('Link type ID'),
|
|
78
|
+
in_id: z.string().optional().describe('Inward transaction journal ID'),
|
|
79
|
+
out_id: z.string().optional().describe('Outward transaction journal ID'),
|
|
80
|
+
notes: z.string().optional().describe('Notes about this link'),
|
|
81
|
+
},
|
|
82
|
+
annotations: UPDATE_ANNOTATIONS,
|
|
83
|
+
}, ({ id, ...params }) => updateTransactionLink(client, id, params));
|
|
84
|
+
defineTool(server, 'delete_transaction_link', {
|
|
85
|
+
title: 'Delete Transaction Link',
|
|
86
|
+
description: 'Permanently delete a link between two transactions. **This action cannot be undone.**',
|
|
87
|
+
inputSchema: { id: z.string().describe('Transaction link ID') },
|
|
88
|
+
annotations: DELETE_ANNOTATIONS,
|
|
89
|
+
}, ({ id }) => deleteTransactionLink(client, id));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=transaction-links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-links.js","sourceRoot":"","sources":["../../src/tools/transaction-links.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAKL,UAAU,EACV,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAChH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAqB,EACrB,MAAyC;IAEzC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAsB,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAClH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAqB,EACrB,SAAiB,EACjB,MAAyC;IAEzC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAsB,yBAAyB,SAAS,QAAQ,EAAE;QACjG,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAqB,EAAE,EAAU;IAC1E,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAwB,sBAAsB,EAAE,EAAE,CAAC,CAAC;IACrF,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAqB,EACrB,MAA+E;IAE/E,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAwB,oBAAoB,EAAE,MAAM,CAAC,CAAC;IACxF,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAqB,EACrB,EAAU,EACV,MAAkF;IAElF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAwB,sBAAsB,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7F,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAqB,EAAE,EAAU;IAC3E,MAAM,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,MAAiB,EAAE,MAAqB;IACnF,UAAU,CACR,MAAM,EACN,gBAAgB,EAChB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACT,6HAA6H;QAC/H,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC/E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;SAC1G;QACD,WAAW,EAAE,gBAAgB;KAC9B,EACD,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAClB,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAA0B,EAAE,KAAK,EAAE,KAA2B,EAAE,CAAC,CACnG,CAAC;IAEF,UAAU,CACR,MAAM,EACN,uBAAuB,EACvB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,iHAAiH;QACnH,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACzD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC/E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;SAC1G;QACD,WAAW,EAAE,gBAAgB;KAC9B,EACD,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAC9B,qBAAqB,CAAC,MAAM,EAAE,UAAoB,EAAE;QAClD,IAAI,EAAE,IAA0B;QAChC,KAAK,EAAE,KAA2B;KACnC,CAAC,CACL,CAAC;IAEF,UAAU,CACR,MAAM,EACN,sBAAsB,EACtB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,sCAAsC;QACnD,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE;QAC/D,WAAW,EAAE,gBAAgB;KAC9B,EACD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAY,CAAC,CACvD,CAAC;IAEF,UAAU,CACR,MAAM,EACN,yBAAyB,EACzB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EACT,sIAAsI;QACxI,WAAW,EAAE;YACX,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;YACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC3D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAC7D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SAC/D;QACD,WAAW,EAAE,iBAAiB;KAC/B,EACD,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAqD,CAAC,CACjG,CAAC;IAEF,UAAU,CACR,MAAM,EACN,yBAAyB,EACzB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,4EAA4E;QACzF,WAAW,EAAE;YACX,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAC9C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YACtE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YACxE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SAC/D;QACD,WAAW,EAAE,kBAAkB;KAChC,EACD,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,CACpB,qBAAqB,CAAC,MAAM,EAAE,EAAY,EAAE,MAAqD,CAAC,CACrG,CAAC;IAEF,UAAU,CACR,MAAM,EACN,yBAAyB,EACzB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,uFAAuF;QACpG,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE;QAC/D,WAAW,EAAE,kBAAkB;KAChC,EACD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,EAAY,CAAC,CACxD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { FireflyClient } from '../client.js';
|
|
3
|
+
import { type UnwrappedList, type UnwrappedSingle } from '../transform.js';
|
|
4
|
+
export declare function fetchTransactions(client: FireflyClient, params: {
|
|
5
|
+
type?: string;
|
|
6
|
+
accountId?: string;
|
|
7
|
+
start?: string;
|
|
8
|
+
end?: string;
|
|
9
|
+
page?: number;
|
|
10
|
+
limit?: number;
|
|
11
|
+
}): Promise<UnwrappedList>;
|
|
12
|
+
export declare function fetchTransaction(client: FireflyClient, id: string): Promise<UnwrappedSingle>;
|
|
13
|
+
export declare function createTransaction(client: FireflyClient, params: {
|
|
14
|
+
type: 'withdrawal' | 'deposit' | 'transfer';
|
|
15
|
+
date: string;
|
|
16
|
+
amount: string;
|
|
17
|
+
description: string;
|
|
18
|
+
source_id?: string;
|
|
19
|
+
destination_id?: string;
|
|
20
|
+
category_name?: string;
|
|
21
|
+
budget_id?: string;
|
|
22
|
+
currency_code?: string;
|
|
23
|
+
notes?: string;
|
|
24
|
+
tags?: string[];
|
|
25
|
+
}): Promise<UnwrappedSingle>;
|
|
26
|
+
export declare function updateTransaction(client: FireflyClient, id: string, params: {
|
|
27
|
+
type?: 'withdrawal' | 'deposit' | 'transfer';
|
|
28
|
+
date?: string;
|
|
29
|
+
amount?: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
source_id?: string;
|
|
32
|
+
destination_id?: string;
|
|
33
|
+
category_name?: string;
|
|
34
|
+
budget_id?: string;
|
|
35
|
+
currency_code?: string;
|
|
36
|
+
notes?: string;
|
|
37
|
+
tags?: string[];
|
|
38
|
+
}): Promise<UnwrappedSingle>;
|
|
39
|
+
export declare function deleteTransaction(client: FireflyClient, id: string): Promise<{
|
|
40
|
+
deleted: true;
|
|
41
|
+
id: string;
|
|
42
|
+
}>;
|
|
43
|
+
export declare function searchTransactions(client: FireflyClient, params: {
|
|
44
|
+
query: string;
|
|
45
|
+
page?: number;
|
|
46
|
+
limit?: number;
|
|
47
|
+
}): Promise<UnwrappedList>;
|
|
48
|
+
export declare function bulkUpdateTransactions(client: FireflyClient, params: {
|
|
49
|
+
query: string;
|
|
50
|
+
category_name?: string;
|
|
51
|
+
budget_id?: string;
|
|
52
|
+
tags?: string[];
|
|
53
|
+
notes?: string;
|
|
54
|
+
}): Promise<unknown>;
|
|
55
|
+
export declare function createSplitTransaction(client: FireflyClient, params: {
|
|
56
|
+
type: 'withdrawal' | 'deposit' | 'transfer';
|
|
57
|
+
date: string;
|
|
58
|
+
source_id?: string;
|
|
59
|
+
destination_id?: string;
|
|
60
|
+
currency_code?: string;
|
|
61
|
+
group_title?: string;
|
|
62
|
+
splits: Array<{
|
|
63
|
+
amount: string;
|
|
64
|
+
description: string;
|
|
65
|
+
category_name?: string;
|
|
66
|
+
budget_id?: string;
|
|
67
|
+
tags?: string[];
|
|
68
|
+
notes?: string;
|
|
69
|
+
}>;
|
|
70
|
+
}): Promise<UnwrappedSingle>;
|
|
71
|
+
export declare function registerTransactionTools(server: McpServer, client: FireflyClient): void;
|
|
72
|
+
//# sourceMappingURL=transactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../src/tools/transactions.ts"],"names":[],"mappings":"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"}
|