@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,262 @@
|
|
|
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
|
+
export async function fetchTransactions(client, params) {
|
|
6
|
+
const query = { page: params.page, limit: params.limit };
|
|
7
|
+
if (params.type)
|
|
8
|
+
query.type = params.type;
|
|
9
|
+
if (params.accountId)
|
|
10
|
+
query.account_id = params.accountId;
|
|
11
|
+
if (params.start)
|
|
12
|
+
query.start = params.start;
|
|
13
|
+
if (params.end)
|
|
14
|
+
query.end = params.end;
|
|
15
|
+
const response = await client.get('/transactions', query);
|
|
16
|
+
return unwrapList(response);
|
|
17
|
+
}
|
|
18
|
+
export async function fetchTransaction(client, id) {
|
|
19
|
+
const response = await client.get(`/transactions/${id}`);
|
|
20
|
+
return unwrapSingle(response);
|
|
21
|
+
}
|
|
22
|
+
export async function createTransaction(client, params) {
|
|
23
|
+
const split = {
|
|
24
|
+
type: params.type,
|
|
25
|
+
date: params.date,
|
|
26
|
+
amount: params.amount,
|
|
27
|
+
description: params.description,
|
|
28
|
+
};
|
|
29
|
+
if (params.source_id !== undefined)
|
|
30
|
+
split.source_id = params.source_id;
|
|
31
|
+
if (params.destination_id !== undefined)
|
|
32
|
+
split.destination_id = params.destination_id;
|
|
33
|
+
if (params.category_name !== undefined)
|
|
34
|
+
split.category_name = params.category_name;
|
|
35
|
+
if (params.budget_id !== undefined)
|
|
36
|
+
split.budget_id = params.budget_id;
|
|
37
|
+
if (params.currency_code !== undefined)
|
|
38
|
+
split.currency_code = params.currency_code;
|
|
39
|
+
if (params.notes !== undefined)
|
|
40
|
+
split.notes = params.notes;
|
|
41
|
+
if (params.tags !== undefined)
|
|
42
|
+
split.tags = params.tags;
|
|
43
|
+
const response = await client.post('/transactions', {
|
|
44
|
+
apply_rules: true,
|
|
45
|
+
fire_webhooks: true,
|
|
46
|
+
transactions: [split],
|
|
47
|
+
});
|
|
48
|
+
return unwrapSingle(response);
|
|
49
|
+
}
|
|
50
|
+
export async function updateTransaction(client, id, params) {
|
|
51
|
+
const split = {};
|
|
52
|
+
if (params.type !== undefined)
|
|
53
|
+
split.type = params.type;
|
|
54
|
+
if (params.date !== undefined)
|
|
55
|
+
split.date = params.date;
|
|
56
|
+
if (params.amount !== undefined)
|
|
57
|
+
split.amount = params.amount;
|
|
58
|
+
if (params.description !== undefined)
|
|
59
|
+
split.description = params.description;
|
|
60
|
+
if (params.source_id !== undefined)
|
|
61
|
+
split.source_id = params.source_id;
|
|
62
|
+
if (params.destination_id !== undefined)
|
|
63
|
+
split.destination_id = params.destination_id;
|
|
64
|
+
if (params.category_name !== undefined)
|
|
65
|
+
split.category_name = params.category_name;
|
|
66
|
+
if (params.budget_id !== undefined)
|
|
67
|
+
split.budget_id = params.budget_id;
|
|
68
|
+
if (params.currency_code !== undefined)
|
|
69
|
+
split.currency_code = params.currency_code;
|
|
70
|
+
if (params.notes !== undefined)
|
|
71
|
+
split.notes = params.notes;
|
|
72
|
+
if (params.tags !== undefined)
|
|
73
|
+
split.tags = params.tags;
|
|
74
|
+
const response = await client.put(`/transactions/${id}`, {
|
|
75
|
+
apply_rules: true,
|
|
76
|
+
fire_webhooks: true,
|
|
77
|
+
transactions: [split],
|
|
78
|
+
});
|
|
79
|
+
return unwrapSingle(response);
|
|
80
|
+
}
|
|
81
|
+
export async function deleteTransaction(client, id) {
|
|
82
|
+
await client.delete(`/transactions/${id}`);
|
|
83
|
+
return { deleted: true, id };
|
|
84
|
+
}
|
|
85
|
+
export async function searchTransactions(client, params) {
|
|
86
|
+
const query = { query: params.query, page: params.page, limit: params.limit };
|
|
87
|
+
const response = await client.get('/search/transactions', query);
|
|
88
|
+
return unwrapList(response);
|
|
89
|
+
}
|
|
90
|
+
export async function bulkUpdateTransactions(client, params) {
|
|
91
|
+
const update = {};
|
|
92
|
+
if (params.category_name !== undefined)
|
|
93
|
+
update.category_name = params.category_name;
|
|
94
|
+
if (params.budget_id !== undefined)
|
|
95
|
+
update.budget_id = params.budget_id;
|
|
96
|
+
if (params.tags !== undefined)
|
|
97
|
+
update.tags = params.tags;
|
|
98
|
+
if (params.notes !== undefined)
|
|
99
|
+
update.notes = params.notes;
|
|
100
|
+
return client.post('/data/bulk/transactions', undefined, {
|
|
101
|
+
query: JSON.stringify({ where: params.query, update }),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
export async function createSplitTransaction(client, params) {
|
|
105
|
+
const transactions = params.splits.map((split) => {
|
|
106
|
+
const item = {
|
|
107
|
+
type: params.type,
|
|
108
|
+
date: params.date,
|
|
109
|
+
amount: split.amount,
|
|
110
|
+
description: split.description,
|
|
111
|
+
};
|
|
112
|
+
if (params.source_id !== undefined)
|
|
113
|
+
item.source_id = params.source_id;
|
|
114
|
+
if (params.destination_id !== undefined)
|
|
115
|
+
item.destination_id = params.destination_id;
|
|
116
|
+
if (params.currency_code !== undefined)
|
|
117
|
+
item.currency_code = params.currency_code;
|
|
118
|
+
if (split.category_name !== undefined)
|
|
119
|
+
item.category_name = split.category_name;
|
|
120
|
+
if (split.budget_id !== undefined)
|
|
121
|
+
item.budget_id = split.budget_id;
|
|
122
|
+
if (split.tags !== undefined)
|
|
123
|
+
item.tags = split.tags;
|
|
124
|
+
if (split.notes !== undefined)
|
|
125
|
+
item.notes = split.notes;
|
|
126
|
+
return item;
|
|
127
|
+
});
|
|
128
|
+
const body = { apply_rules: true, fire_webhooks: true, transactions };
|
|
129
|
+
if (params.group_title !== undefined)
|
|
130
|
+
body.group_title = params.group_title;
|
|
131
|
+
const response = await client.post('/transactions', body);
|
|
132
|
+
return unwrapSingle(response);
|
|
133
|
+
}
|
|
134
|
+
export function registerTransactionTools(server, client) {
|
|
135
|
+
defineTool(server, 'get_transactions', {
|
|
136
|
+
title: 'Get Transactions',
|
|
137
|
+
description: 'Get transactions from Firefly III. Filter by type (withdrawal/deposit/transfer/reconciliation), account ID, or date range. Dates must be YYYY-MM-DD. Use get_transaction to fetch a single transaction by ID.',
|
|
138
|
+
inputSchema: {
|
|
139
|
+
type: z
|
|
140
|
+
.enum(['withdrawal', 'deposit', 'transfer', 'reconciliation'])
|
|
141
|
+
.optional()
|
|
142
|
+
.describe('Transaction type filter'),
|
|
143
|
+
accountId: z.string().optional().describe('Filter by account ID — use get_accounts to find valid IDs'),
|
|
144
|
+
start: dateSchema.optional().describe('Start date (YYYY-MM-DD)'),
|
|
145
|
+
end: dateSchema.optional().describe('End date (YYYY-MM-DD)'),
|
|
146
|
+
page: z.number().int().positive().optional().default(1).describe('Page number'),
|
|
147
|
+
limit: z.number().int().positive().max(100).optional().default(50).describe('Results per page (max 100)'),
|
|
148
|
+
},
|
|
149
|
+
annotations: READ_ANNOTATIONS,
|
|
150
|
+
}, ({ type, accountId, start, end, page, limit }) => fetchTransactions(client, {
|
|
151
|
+
type: type,
|
|
152
|
+
accountId: accountId,
|
|
153
|
+
start: start,
|
|
154
|
+
end: end,
|
|
155
|
+
page: page,
|
|
156
|
+
limit: limit,
|
|
157
|
+
}));
|
|
158
|
+
defineTool(server, 'get_transaction', {
|
|
159
|
+
title: 'Get Transaction',
|
|
160
|
+
description: 'Get a single Firefly III transaction by its numeric ID, including all splits. Use get_transactions to find valid transaction IDs.',
|
|
161
|
+
inputSchema: {
|
|
162
|
+
id: z.string().describe('Transaction ID'),
|
|
163
|
+
},
|
|
164
|
+
annotations: READ_ANNOTATIONS,
|
|
165
|
+
}, ({ id }) => fetchTransaction(client, id));
|
|
166
|
+
defineTool(server, 'create_transaction', {
|
|
167
|
+
title: 'Create Transaction',
|
|
168
|
+
description: 'Create a new transaction in Firefly III. Use get_accounts to find source and destination account IDs.',
|
|
169
|
+
inputSchema: {
|
|
170
|
+
type: z.enum(['withdrawal', 'deposit', 'transfer']).describe('Transaction type'),
|
|
171
|
+
date: dateSchema.describe('Transaction date (YYYY-MM-DD)'),
|
|
172
|
+
amount: z.string().describe('Amount as a positive number string, e.g. "42.50"'),
|
|
173
|
+
description: z.string().describe('Short description of the transaction'),
|
|
174
|
+
source_id: z.string().optional().describe('Source account ID (required for withdrawals and transfers)'),
|
|
175
|
+
destination_id: z.string().optional().describe('Destination account ID (required for deposits and transfers)'),
|
|
176
|
+
category_name: z.string().optional().describe('Category name to assign'),
|
|
177
|
+
budget_id: z.string().optional().describe('Budget ID — use get_budgets to find valid IDs'),
|
|
178
|
+
currency_code: z.string().optional().describe('Currency code (e.g. EUR, USD). Defaults to account currency.'),
|
|
179
|
+
notes: z.string().optional().describe('Additional notes'),
|
|
180
|
+
tags: z.array(z.string()).optional().describe('Tags to attach'),
|
|
181
|
+
},
|
|
182
|
+
annotations: WRITE_ANNOTATIONS,
|
|
183
|
+
}, (params) => createTransaction(client, params));
|
|
184
|
+
defineTool(server, 'update_transaction', {
|
|
185
|
+
title: 'Update Transaction',
|
|
186
|
+
description: 'Update an existing transaction in Firefly III. Only fields provided will be changed. Use get_transaction to confirm the ID before updating.',
|
|
187
|
+
inputSchema: {
|
|
188
|
+
id: z.string().describe('Transaction ID — use get_transactions to find valid IDs'),
|
|
189
|
+
type: z.enum(['withdrawal', 'deposit', 'transfer']).optional().describe('Transaction type'),
|
|
190
|
+
date: dateSchema.optional().describe('Transaction date (YYYY-MM-DD)'),
|
|
191
|
+
amount: z.string().optional().describe('Amount as a positive number string'),
|
|
192
|
+
description: z.string().optional().describe('Short description'),
|
|
193
|
+
source_id: z.string().optional().describe('Source account ID'),
|
|
194
|
+
destination_id: z.string().optional().describe('Destination account ID'),
|
|
195
|
+
category_name: z.string().optional().describe('Category name'),
|
|
196
|
+
budget_id: z.string().optional().describe('Budget ID'),
|
|
197
|
+
currency_code: z.string().optional().describe('Currency code (e.g. EUR, USD)'),
|
|
198
|
+
notes: z.string().optional().describe('Additional notes'),
|
|
199
|
+
tags: z.array(z.string()).optional().describe('Tags (replaces existing tags)'),
|
|
200
|
+
},
|
|
201
|
+
annotations: UPDATE_ANNOTATIONS,
|
|
202
|
+
}, ({ id, ...params }) => updateTransaction(client, id, params));
|
|
203
|
+
defineTool(server, 'delete_transaction', {
|
|
204
|
+
title: 'Delete Transaction',
|
|
205
|
+
description: 'Permanently delete a transaction from Firefly III. **This action cannot be undone.** Use get_transaction to confirm the transaction before deleting.',
|
|
206
|
+
inputSchema: {
|
|
207
|
+
id: z.string().describe('Transaction ID — use get_transactions to find valid IDs'),
|
|
208
|
+
},
|
|
209
|
+
annotations: DELETE_ANNOTATIONS,
|
|
210
|
+
}, ({ id }) => deleteTransaction(client, id));
|
|
211
|
+
defineTool(server, 'search_transactions', {
|
|
212
|
+
title: 'Search Transactions',
|
|
213
|
+
description: 'Search for transactions in Firefly III by keyword. Searches across descriptions, notes, and other fields.',
|
|
214
|
+
inputSchema: {
|
|
215
|
+
query: z.string().describe('Search query'),
|
|
216
|
+
page: z.number().int().positive().optional().default(1).describe('Page number'),
|
|
217
|
+
limit: z.number().int().positive().max(100).optional().default(50).describe('Results per page (max 100)'),
|
|
218
|
+
},
|
|
219
|
+
annotations: READ_ANNOTATIONS,
|
|
220
|
+
}, ({ query, page, limit }) => searchTransactions(client, {
|
|
221
|
+
query: query,
|
|
222
|
+
page: page,
|
|
223
|
+
limit: limit,
|
|
224
|
+
}));
|
|
225
|
+
defineTool(server, 'create_split_transaction', {
|
|
226
|
+
title: 'Create Split Transaction',
|
|
227
|
+
description: 'Create a split transaction in Firefly III — one receipt divided across multiple categories, budgets, or descriptions. All splits share the same type, date, and accounts. Use get_accounts to find source and destination account IDs.',
|
|
228
|
+
inputSchema: {
|
|
229
|
+
type: z.enum(['withdrawal', 'deposit', 'transfer']).describe('Transaction type (shared across all splits)'),
|
|
230
|
+
date: dateSchema.describe('Transaction date (YYYY-MM-DD, shared across all splits)'),
|
|
231
|
+
source_id: z.string().optional().describe('Source account ID (required for withdrawals and transfers)'),
|
|
232
|
+
destination_id: z.string().optional().describe('Destination account ID (required for deposits and transfers)'),
|
|
233
|
+
currency_code: z.string().optional().describe('Currency code (e.g. EUR, USD). Defaults to account currency.'),
|
|
234
|
+
group_title: z.string().optional().describe('Optional label for the transaction group'),
|
|
235
|
+
splits: z
|
|
236
|
+
.array(z.object({
|
|
237
|
+
amount: z.string().describe('Amount as a positive number string, e.g. "42.50"'),
|
|
238
|
+
description: z.string().describe('Description for this split'),
|
|
239
|
+
category_name: z.string().optional().describe('Category name'),
|
|
240
|
+
budget_id: z.string().optional().describe('Budget ID — use get_budgets to find valid IDs'),
|
|
241
|
+
tags: z.array(z.string()).optional().describe('Tags'),
|
|
242
|
+
notes: z.string().optional().describe('Notes'),
|
|
243
|
+
}))
|
|
244
|
+
.min(2)
|
|
245
|
+
.describe('At least 2 splits required'),
|
|
246
|
+
},
|
|
247
|
+
annotations: WRITE_ANNOTATIONS,
|
|
248
|
+
}, (params) => createSplitTransaction(client, params));
|
|
249
|
+
defineTool(server, 'bulk_update_transactions', {
|
|
250
|
+
title: 'Bulk Update Transactions',
|
|
251
|
+
description: 'Update multiple transactions at once using a search query (same syntax as search_transactions). All matching transactions will have the specified fields updated.',
|
|
252
|
+
inputSchema: {
|
|
253
|
+
query: z.string().describe('Search query to select transactions (same syntax as search_transactions)'),
|
|
254
|
+
category_name: z.string().optional().describe('Set category for all matched transactions'),
|
|
255
|
+
budget_id: z.string().optional().describe('Set budget for all matched transactions'),
|
|
256
|
+
tags: z.array(z.string()).optional().describe('Replace tags on all matched transactions'),
|
|
257
|
+
notes: z.string().optional().describe('Set notes on all matched transactions'),
|
|
258
|
+
},
|
|
259
|
+
annotations: WRITE_ANNOTATIONS,
|
|
260
|
+
}, (params) => bulkUpdateTransactions(client, params));
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=transactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.js","sourceRoot":"","sources":["../../src/tools/transactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface JsonApiItem {
|
|
2
|
+
id: string;
|
|
3
|
+
type: string;
|
|
4
|
+
attributes: Record<string, unknown>;
|
|
5
|
+
links?: unknown;
|
|
6
|
+
}
|
|
7
|
+
export interface JsonApiListResponse {
|
|
8
|
+
data: JsonApiItem[];
|
|
9
|
+
meta?: {
|
|
10
|
+
pagination?: {
|
|
11
|
+
current_page: number;
|
|
12
|
+
total_pages: number;
|
|
13
|
+
total: number;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface JsonApiSingleResponse {
|
|
18
|
+
data: JsonApiItem;
|
|
19
|
+
}
|
|
20
|
+
export type RawSummaryResponse = Record<string, Record<string, unknown>>;
|
|
21
|
+
export interface CleanSummaryItem {
|
|
22
|
+
key: string;
|
|
23
|
+
value: {
|
|
24
|
+
key: string;
|
|
25
|
+
title: string;
|
|
26
|
+
monetary_value: string;
|
|
27
|
+
currency_id: string;
|
|
28
|
+
currency_code: string;
|
|
29
|
+
value_parsed: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface UnwrappedList {
|
|
33
|
+
data: Array<{
|
|
34
|
+
id: string;
|
|
35
|
+
} & Record<string, unknown>>;
|
|
36
|
+
pagination?: {
|
|
37
|
+
page: number;
|
|
38
|
+
totalPages: number;
|
|
39
|
+
total: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export type UnwrappedSingle = {
|
|
43
|
+
id: string;
|
|
44
|
+
} & Record<string, unknown>;
|
|
45
|
+
export declare function unwrapList(response: JsonApiListResponse): UnwrappedList;
|
|
46
|
+
export declare function unwrapSingle(response: JsonApiSingleResponse): UnwrappedSingle;
|
|
47
|
+
export declare function cleanSummary(response: RawSummaryResponse): CleanSummaryItem[];
|
|
48
|
+
//# sourceMappingURL=transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE;YACX,YAAY,EAAE,MAAM,CAAC;YACrB,WAAW,EAAE,MAAM,CAAC;YACpB,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEvE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,mBAAmB,GAAG,aAAa,CAWvE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,qBAAqB,GAAG,eAAe,CAE7E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,kBAAkB,GAAG,gBAAgB,EAAE,CAY7E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export function unwrapList(response) {
|
|
2
|
+
return {
|
|
3
|
+
data: response.data.map((item) => ({ ...item.attributes, id: item.id })),
|
|
4
|
+
pagination: response.meta?.pagination
|
|
5
|
+
? {
|
|
6
|
+
page: response.meta.pagination.current_page,
|
|
7
|
+
totalPages: response.meta.pagination.total_pages,
|
|
8
|
+
total: response.meta.pagination.total,
|
|
9
|
+
}
|
|
10
|
+
: undefined,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function unwrapSingle(response) {
|
|
14
|
+
return { ...response.data.attributes, id: response.data.id };
|
|
15
|
+
}
|
|
16
|
+
export function cleanSummary(response) {
|
|
17
|
+
return Object.entries(response).map(([key, value]) => ({
|
|
18
|
+
key,
|
|
19
|
+
value: {
|
|
20
|
+
key: value.key,
|
|
21
|
+
title: value.title,
|
|
22
|
+
monetary_value: value.monetary_value,
|
|
23
|
+
currency_id: value.currency_id,
|
|
24
|
+
currency_code: value.currency_code,
|
|
25
|
+
value_parsed: value.value_parsed,
|
|
26
|
+
},
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AA2CA,MAAM,UAAU,UAAU,CAAC,QAA6B;IACtD,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACxE,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU;YACnC,CAAC,CAAC;gBACE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY;gBAC3C,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW;gBAChD,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK;aACtC;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAA+B;IAC1D,OAAO,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAA4B;IACvD,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,GAAG;QACH,KAAK,EAAE;YACL,GAAG,EAAE,KAAK,CAAC,GAAa;YACxB,KAAK,EAAE,KAAK,CAAC,KAAe;YAC5B,cAAc,EAAE,KAAK,CAAC,cAAwB;YAC9C,WAAW,EAAE,KAAK,CAAC,WAAqB;YACxC,aAAa,EAAE,KAAK,CAAC,aAAuB;YAC5C,YAAY,EAAE,KAAK,CAAC,YAAsB;SAC3C;KACF,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@daften/fireflyiii-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for Firefly III personal finance manager",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"fireflyiii-mcp": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md",
|
|
12
|
+
"CHANGELOG.md",
|
|
13
|
+
"LICENSE",
|
|
14
|
+
".env.example"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc && chmod +x dist/index.js",
|
|
18
|
+
"prepublishOnly": "npm run build",
|
|
19
|
+
"dev": "dotenv -e .env -- tsx src/index.ts",
|
|
20
|
+
"format": "biome format --write src/",
|
|
21
|
+
"lint": "biome check src/",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest",
|
|
24
|
+
"test:integration": "dotenv -e .env.test -- vitest run src/tests/integration.test.ts"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/daften/fireflyiii-mcp.git"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"firefly-iii",
|
|
35
|
+
"mcp",
|
|
36
|
+
"finance",
|
|
37
|
+
"model-context-protocol",
|
|
38
|
+
"claude"
|
|
39
|
+
],
|
|
40
|
+
"homepage": "https://github.com/daften/fireflyiii-mcp",
|
|
41
|
+
"author": "Dieter Blomme <dieterblomme@gmail.com>",
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/daften/fireflyiii-mcp/issues"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
47
|
+
"zod": "^4.4.3"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@biomejs/biome": "2.4.15",
|
|
51
|
+
"@types/node": "^25.9.1",
|
|
52
|
+
"dotenv-cli": "^11.0.0",
|
|
53
|
+
"tsx": "^4.22.3",
|
|
54
|
+
"typescript": "^6.0.3",
|
|
55
|
+
"vitest": "^4.1.7"
|
|
56
|
+
},
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=20"
|
|
59
|
+
},
|
|
60
|
+
"license": "MIT"
|
|
61
|
+
}
|