@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.
Files changed (101) hide show
  1. package/.env.example +15 -0
  2. package/CHANGELOG.md +28 -0
  3. package/LICENSE +21 -0
  4. package/README.md +605 -0
  5. package/dist/args.d.ts +10 -0
  6. package/dist/args.d.ts.map +1 -0
  7. package/dist/args.js +65 -0
  8. package/dist/args.js.map +1 -0
  9. package/dist/client.d.ts +25 -0
  10. package/dist/client.d.ts.map +1 -0
  11. package/dist/client.js +146 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/http.d.ts +13 -0
  14. package/dist/http.d.ts.map +1 -0
  15. package/dist/http.js +271 -0
  16. package/dist/http.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +44 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/server.d.ts +5 -0
  22. package/dist/server.d.ts.map +1 -0
  23. package/dist/server.js +13 -0
  24. package/dist/server.js.map +1 -0
  25. package/dist/tools/_annotations.d.ts +17 -0
  26. package/dist/tools/_annotations.d.ts.map +1 -0
  27. package/dist/tools/_annotations.js +9 -0
  28. package/dist/tools/_annotations.js.map +1 -0
  29. package/dist/tools/_helpers.d.ts +17 -0
  30. package/dist/tools/_helpers.d.ts.map +1 -0
  31. package/dist/tools/_helpers.js +24 -0
  32. package/dist/tools/_helpers.js.map +1 -0
  33. package/dist/tools/accounts.d.ts +48 -0
  34. package/dist/tools/accounts.d.ts.map +1 -0
  35. package/dist/tools/accounts.js +151 -0
  36. package/dist/tools/accounts.js.map +1 -0
  37. package/dist/tools/attachments.d.ts +31 -0
  38. package/dist/tools/attachments.d.ts.map +1 -0
  39. package/dist/tools/attachments.js +112 -0
  40. package/dist/tools/attachments.js.map +1 -0
  41. package/dist/tools/bills.d.ts +43 -0
  42. package/dist/tools/bills.d.ts.map +1 -0
  43. package/dist/tools/bills.js +112 -0
  44. package/dist/tools/bills.js.map +1 -0
  45. package/dist/tools/budgets.d.ts +65 -0
  46. package/dist/tools/budgets.d.ts.map +1 -0
  47. package/dist/tools/budgets.js +209 -0
  48. package/dist/tools/budgets.js.map +1 -0
  49. package/dist/tools/categories.d.ts +27 -0
  50. package/dist/tools/categories.d.ts.map +1 -0
  51. package/dist/tools/categories.js +83 -0
  52. package/dist/tools/categories.js.map +1 -0
  53. package/dist/tools/currencies.d.ts +32 -0
  54. package/dist/tools/currencies.d.ts.map +1 -0
  55. package/dist/tools/currencies.js +104 -0
  56. package/dist/tools/currencies.js.map +1 -0
  57. package/dist/tools/exports.d.ts +10 -0
  58. package/dist/tools/exports.d.ts.map +1 -0
  59. package/dist/tools/exports.js +37 -0
  60. package/dist/tools/exports.js.map +1 -0
  61. package/dist/tools/index.d.ts +14 -0
  62. package/dist/tools/index.d.ts.map +1 -0
  63. package/dist/tools/index.js +94 -0
  64. package/dist/tools/index.js.map +1 -0
  65. package/dist/tools/object-groups.d.ts +30 -0
  66. package/dist/tools/object-groups.d.ts.map +1 -0
  67. package/dist/tools/object-groups.js +107 -0
  68. package/dist/tools/object-groups.js.map +1 -0
  69. package/dist/tools/piggy-banks.d.ts +41 -0
  70. package/dist/tools/piggy-banks.d.ts.map +1 -0
  71. package/dist/tools/piggy-banks.js +110 -0
  72. package/dist/tools/piggy-banks.js.map +1 -0
  73. package/dist/tools/recurring.d.ts +70 -0
  74. package/dist/tools/recurring.d.ts.map +1 -0
  75. package/dist/tools/recurring.js +279 -0
  76. package/dist/tools/recurring.js.map +1 -0
  77. package/dist/tools/reports.d.ts +40 -0
  78. package/dist/tools/reports.d.ts.map +1 -0
  79. package/dist/tools/reports.js +413 -0
  80. package/dist/tools/reports.js.map +1 -0
  81. package/dist/tools/rules.d.ts +105 -0
  82. package/dist/tools/rules.d.ts.map +1 -0
  83. package/dist/tools/rules.js +361 -0
  84. package/dist/tools/rules.js.map +1 -0
  85. package/dist/tools/transaction-links.d.ts +30 -0
  86. package/dist/tools/transaction-links.d.ts.map +1 -0
  87. package/dist/tools/transaction-links.js +91 -0
  88. package/dist/tools/transaction-links.js.map +1 -0
  89. package/dist/tools/transactions.d.ts +72 -0
  90. package/dist/tools/transactions.d.ts.map +1 -0
  91. package/dist/tools/transactions.js +262 -0
  92. package/dist/tools/transactions.js.map +1 -0
  93. package/dist/transform.d.ts +48 -0
  94. package/dist/transform.d.ts.map +1 -0
  95. package/dist/transform.js +29 -0
  96. package/dist/transform.js.map +1 -0
  97. package/dist/types.d.ts +2 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +2 -0
  100. package/dist/types.js.map +1 -0
  101. package/package.json +61 -0
package/dist/server.js ADDED
@@ -0,0 +1,13 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { registerAllTools } from './tools/index.js';
4
+ const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
5
+ export function createServer(client, filterOptions = {}) {
6
+ const server = new McpServer({
7
+ name: 'firefly-iii-mcp',
8
+ version: pkg.version,
9
+ });
10
+ registerAllTools(server, client, filterOptions);
11
+ return server;
12
+ }
13
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAA0B,MAAM,kBAAkB,CAAC;AAE5E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAwB,CAAC;AAEjH,MAAM,UAAU,YAAY,CAAC,MAAqB,EAAE,gBAAmC,EAAE;IACvF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;IAEH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAEhD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare const READ_ANNOTATIONS: {
2
+ readonly readOnlyHint: true;
3
+ readonly openWorldHint: true;
4
+ readonly idempotentHint: true;
5
+ };
6
+ export declare const WRITE_ANNOTATIONS: {
7
+ readonly openWorldHint: true;
8
+ };
9
+ export declare const UPDATE_ANNOTATIONS: {
10
+ readonly openWorldHint: true;
11
+ readonly idempotentHint: true;
12
+ };
13
+ export declare const DELETE_ANNOTATIONS: {
14
+ readonly destructiveHint: true;
15
+ readonly openWorldHint: true;
16
+ };
17
+ //# sourceMappingURL=_annotations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_annotations.d.ts","sourceRoot":"","sources":["../../src/tools/_annotations.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC;AAEX,eAAO,MAAM,iBAAiB;;CAAmC,CAAC;AAClE,eAAO,MAAM,kBAAkB;;;CAAyD,CAAC;AACzF,eAAO,MAAM,kBAAkB;;;CAA0D,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const READ_ANNOTATIONS = {
2
+ readOnlyHint: true,
3
+ openWorldHint: true,
4
+ idempotentHint: true,
5
+ };
6
+ export const WRITE_ANNOTATIONS = { openWorldHint: true };
7
+ export const UPDATE_ANNOTATIONS = { openWorldHint: true, idempotentHint: true };
8
+ export const DELETE_ANNOTATIONS = { destructiveHint: true, openWorldHint: true };
9
+ //# sourceMappingURL=_annotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_annotations.js","sourceRoot":"","sources":["../../src/tools/_annotations.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,IAAI;IACnB,cAAc,EAAE,IAAI;CACZ,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,aAAa,EAAE,IAAI,EAAW,CAAC;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAW,CAAC;AACzF,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAW,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { z } from 'zod';
3
+ type ToolConfig = {
4
+ title?: string;
5
+ description?: string;
6
+ inputSchema?: Record<string, z.ZodTypeAny>;
7
+ annotations?: {
8
+ readOnlyHint?: boolean;
9
+ destructiveHint?: boolean;
10
+ idempotentHint?: boolean;
11
+ openWorldHint?: boolean;
12
+ };
13
+ };
14
+ export declare function defineTool(server: McpServer, name: string, config: ToolConfig, fetch: (args: Record<string, unknown>) => Promise<unknown>): void;
15
+ export declare const dateSchema: z.ZodString;
16
+ export {};
17
+ //# sourceMappingURL=_helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_helpers.d.ts","sourceRoot":"","sources":["../../src/tools/_helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,KAAK,UAAU,GAAG;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE;QACZ,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;CACH,CAAC;AAEF,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GACzD,IAAI,CAkBN;AAED,eAAO,MAAM,UAAU,aAAqE,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ import { formatError } from '../client.js';
3
+ export function defineTool(server, name, config, fetch) {
4
+ // registerTool is generic in the SDK; the cast avoids fighting its complex overload resolution
5
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
+ server.registerTool(name, config, async (args) => {
7
+ try {
8
+ const result = await fetch(args);
9
+ return {
10
+ content: [
11
+ {
12
+ type: 'text',
13
+ text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
14
+ },
15
+ ],
16
+ };
17
+ }
18
+ catch (err) {
19
+ return { content: [{ type: 'text', text: formatError(err) }], isError: true };
20
+ }
21
+ });
22
+ }
23
+ export const dateSchema = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be YYYY-MM-DD');
24
+ //# sourceMappingURL=_helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_helpers.js","sourceRoot":"","sources":["../../src/tools/_helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAc3C,MAAM,UAAU,UAAU,CACxB,MAAiB,EACjB,IAAY,EACZ,MAAkB,EAClB,KAA0D;IAE1D,+FAA+F;IAC/F,8DAA8D;IAC7D,MAAc,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;QACjF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC5E;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,EAAE,yBAAyB,CAAC,CAAC"}
@@ -0,0 +1,48 @@
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 fetchAccounts(client: FireflyClient, params: {
5
+ type?: string;
6
+ page?: number;
7
+ limit?: number;
8
+ }): Promise<UnwrappedList>;
9
+ export declare function fetchAccount(client: FireflyClient, id: string): Promise<UnwrappedSingle>;
10
+ export declare function createAccount(client: FireflyClient, params: {
11
+ name: string;
12
+ type: 'asset' | 'expense' | 'revenue' | 'liability';
13
+ currency_code?: string;
14
+ iban?: string;
15
+ opening_balance?: string;
16
+ opening_balance_date?: string;
17
+ include_net_worth?: boolean;
18
+ notes?: string;
19
+ }): Promise<UnwrappedSingle>;
20
+ export declare function updateAccount(client: FireflyClient, id: string, params: {
21
+ name?: string;
22
+ currency_code?: string;
23
+ iban?: string;
24
+ opening_balance?: string;
25
+ opening_balance_date?: string;
26
+ include_net_worth?: boolean;
27
+ active?: boolean;
28
+ notes?: string;
29
+ }): Promise<UnwrappedSingle>;
30
+ export declare function deleteAccount(client: FireflyClient, id: string): Promise<{
31
+ deleted: true;
32
+ id: string;
33
+ }>;
34
+ export declare function fetchAccountTransactions(client: FireflyClient, id: string, params: {
35
+ start?: string;
36
+ end?: string;
37
+ type?: string;
38
+ page?: number;
39
+ limit?: number;
40
+ }): Promise<UnwrappedList>;
41
+ export declare function searchAccounts(client: FireflyClient, params: {
42
+ query: string;
43
+ field?: string;
44
+ page?: number;
45
+ limit?: number;
46
+ }): Promise<UnwrappedList>;
47
+ export declare function registerAccountTools(server: McpServer, client: FireflyClient): void;
48
+ //# sourceMappingURL=accounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/tools/accounts.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;AAKzB,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACvD,OAAO,CAAC,aAAa,CAAC,CAKxB;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAG9F;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE;IACN,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE;IACN,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAG7G;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACrF,OAAO,CAAC,aAAa,CAAC,CAOxB;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE,OAAO,CAAC,aAAa,CAAC,CAKxB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAwJnF"}
@@ -0,0 +1,151 @@
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 fetchAccounts(client, params) {
6
+ const query = { page: params.page, limit: params.limit };
7
+ if (params.type && params.type !== 'all')
8
+ query.type = params.type;
9
+ const response = await client.get('/accounts', query);
10
+ return unwrapList(response);
11
+ }
12
+ export async function fetchAccount(client, id) {
13
+ const response = await client.get(`/accounts/${id}`);
14
+ return unwrapSingle(response);
15
+ }
16
+ export async function createAccount(client, params) {
17
+ const response = await client.post('/accounts', params);
18
+ return unwrapSingle(response);
19
+ }
20
+ export async function updateAccount(client, id, params) {
21
+ const response = await client.put(`/accounts/${id}`, params);
22
+ return unwrapSingle(response);
23
+ }
24
+ export async function deleteAccount(client, id) {
25
+ await client.delete(`/accounts/${id}`);
26
+ return { deleted: true, id };
27
+ }
28
+ export async function fetchAccountTransactions(client, id, params) {
29
+ const query = { page: params.page, limit: params.limit };
30
+ if (params.start)
31
+ query.start = params.start;
32
+ if (params.end)
33
+ query.end = params.end;
34
+ if (params.type)
35
+ query.type = params.type;
36
+ const response = await client.get(`/accounts/${id}/transactions`, query);
37
+ return unwrapList(response);
38
+ }
39
+ export async function searchAccounts(client, params) {
40
+ const query = { query: params.query, page: params.page, limit: params.limit };
41
+ if (params.field)
42
+ query.field = params.field;
43
+ const response = await client.get('/search/accounts', query);
44
+ return unwrapList(response);
45
+ }
46
+ export function registerAccountTools(server, client) {
47
+ defineTool(server, 'get_accounts', {
48
+ title: 'Get Accounts',
49
+ description: 'Get all accounts from Firefly III. Filter by type: asset (bank/cash accounts), expense (merchants), revenue (income sources), liability (loans/debts), or all. Use get_account to fetch a single account by ID.',
50
+ inputSchema: {
51
+ type: z
52
+ .enum(['asset', 'expense', 'revenue', 'liability', 'all'])
53
+ .optional()
54
+ .default('all')
55
+ .describe('Account type filter'),
56
+ page: z.number().int().positive().optional().default(1).describe('Page number'),
57
+ limit: z.number().int().positive().max(100).optional().default(50).describe('Results per page (max 100)'),
58
+ },
59
+ annotations: READ_ANNOTATIONS,
60
+ }, ({ type, page, limit }) => fetchAccounts(client, {
61
+ type: type,
62
+ page: page,
63
+ limit: limit,
64
+ }));
65
+ defineTool(server, 'get_account', {
66
+ title: 'Get Account',
67
+ description: 'Get a single Firefly III account by its numeric ID, including the current balance. Use get_accounts to find valid account IDs.',
68
+ inputSchema: { id: z.string().describe('Account ID') },
69
+ annotations: READ_ANNOTATIONS,
70
+ }, ({ id }) => fetchAccount(client, id));
71
+ defineTool(server, 'create_account', {
72
+ title: 'Create Account',
73
+ description: 'Create a new account in Firefly III.',
74
+ inputSchema: {
75
+ name: z.string().describe('Account name'),
76
+ type: z.enum(['asset', 'expense', 'revenue', 'liability']).describe('Account type'),
77
+ currency_code: z.string().optional().describe('Currency code (e.g. EUR, USD)'),
78
+ iban: z.string().optional().describe('IBAN number'),
79
+ opening_balance: z.string().optional().describe('Opening balance as a number string'),
80
+ opening_balance_date: dateSchema.optional().describe('Opening balance date (YYYY-MM-DD)'),
81
+ include_net_worth: z.boolean().optional().describe('Include in net worth calculations'),
82
+ notes: z.string().optional().describe('Notes'),
83
+ },
84
+ annotations: WRITE_ANNOTATIONS,
85
+ }, (params) => createAccount(client, params));
86
+ defineTool(server, 'update_account', {
87
+ title: 'Update Account',
88
+ description: 'Update an existing account in Firefly III. Only fields provided will be changed. Use get_account to confirm the ID.',
89
+ inputSchema: {
90
+ id: z.string().describe('Account ID — use get_accounts to find valid IDs'),
91
+ name: z.string().optional().describe('Account name'),
92
+ currency_code: z.string().optional().describe('Currency code (e.g. EUR, USD)'),
93
+ iban: z.string().optional().describe('IBAN number'),
94
+ opening_balance: z.string().optional().describe('Opening balance as a number string'),
95
+ opening_balance_date: dateSchema.optional().describe('Opening balance date (YYYY-MM-DD)'),
96
+ include_net_worth: z.boolean().optional().describe('Include in net worth calculations'),
97
+ active: z.boolean().optional().describe('Whether the account is active'),
98
+ notes: z.string().optional().describe('Notes'),
99
+ },
100
+ annotations: UPDATE_ANNOTATIONS,
101
+ }, ({ id, ...params }) => updateAccount(client, id, params));
102
+ defineTool(server, 'delete_account', {
103
+ title: 'Delete Account',
104
+ description: 'Permanently delete an account from Firefly III. **This action cannot be undone.** Accounts with linked transactions cannot be deleted. Use get_account to confirm before deleting.',
105
+ inputSchema: { id: z.string().describe('Account ID — use get_accounts to find valid IDs') },
106
+ annotations: DELETE_ANNOTATIONS,
107
+ }, ({ id }) => deleteAccount(client, id));
108
+ defineTool(server, 'get_account_transactions', {
109
+ title: 'Get Account Transactions',
110
+ description: 'Get all transactions for a specific account. Use get_accounts to find valid account IDs.',
111
+ inputSchema: {
112
+ id: z.string().describe('Account ID'),
113
+ start: dateSchema.optional().describe('Start date (YYYY-MM-DD)'),
114
+ end: dateSchema.optional().describe('End date (YYYY-MM-DD)'),
115
+ type: z
116
+ .enum(['all', 'withdrawal', 'deposit', 'transfer', 'opening_balance', 'reconciliation', 'special', 'default'])
117
+ .optional()
118
+ .describe('Filter by transaction type'),
119
+ page: z.number().int().positive().optional().default(1).describe('Page number'),
120
+ limit: z.number().int().positive().max(100).optional().default(50).describe('Results per page (max 100)'),
121
+ },
122
+ annotations: READ_ANNOTATIONS,
123
+ }, ({ id, start, end, type, page, limit }) => fetchAccountTransactions(client, id, {
124
+ start: start,
125
+ end: end,
126
+ type: type,
127
+ page: page,
128
+ limit: limit,
129
+ }));
130
+ defineTool(server, 'search_accounts', {
131
+ title: 'Search Accounts',
132
+ description: 'Search for accounts by name, IBAN, account number, or ID.',
133
+ inputSchema: {
134
+ query: z.string().describe('Search query'),
135
+ field: z
136
+ .enum(['all', 'id', 'name', 'iban', 'number', 'account_number'])
137
+ .optional()
138
+ .default('all')
139
+ .describe('Field to search in'),
140
+ page: z.number().int().positive().optional().default(1).describe('Page number'),
141
+ limit: z.number().int().positive().max(100).optional().default(50).describe('Results per page (max 100)'),
142
+ },
143
+ annotations: READ_ANNOTATIONS,
144
+ }, ({ query, field, page, limit }) => searchAccounts(client, {
145
+ query: query,
146
+ field: field,
147
+ page: page,
148
+ limit: limit,
149
+ }));
150
+ }
151
+ //# sourceMappingURL=accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/tools/accounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
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 fetchAttachments(client: FireflyClient, params: {
5
+ page?: number;
6
+ limit?: number;
7
+ }): Promise<UnwrappedList>;
8
+ export declare function fetchAttachment(client: FireflyClient, id: string): Promise<UnwrappedSingle>;
9
+ export declare function createAttachment(client: FireflyClient, params: {
10
+ filename: string;
11
+ attachable_type: string;
12
+ attachable_id: string;
13
+ title?: string;
14
+ notes?: string;
15
+ }): Promise<UnwrappedSingle>;
16
+ export declare function updateAttachment(client: FireflyClient, id: string, params: {
17
+ filename?: string;
18
+ title?: string;
19
+ notes?: string;
20
+ }): Promise<UnwrappedSingle>;
21
+ export declare function deleteAttachment(client: FireflyClient, id: string): Promise<{
22
+ deleted: true;
23
+ id: string;
24
+ }>;
25
+ export declare function uploadAttachment(client: FireflyClient, id: string, content: Uint8Array): Promise<{
26
+ uploaded: true;
27
+ id: string;
28
+ }>;
29
+ export declare function downloadAttachment(client: FireflyClient, id: string): Promise<string>;
30
+ export declare function registerAttachmentTools(server: McpServer, client: FireflyClient): void;
31
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../src/tools/attachments.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;AAMzB,wBAAsB,gBAAgB,CACpC,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,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAGjG;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3G,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAGhH;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAGzC;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3F;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CA+HtF"}
@@ -0,0 +1,112 @@
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
+ // ---- Attachment fetch + CRUD ----
6
+ export async function fetchAttachments(client, params) {
7
+ const response = await client.get('/attachments', { page: params.page, limit: params.limit });
8
+ return unwrapList(response);
9
+ }
10
+ export async function fetchAttachment(client, id) {
11
+ const response = await client.get(`/attachments/${id}`);
12
+ return unwrapSingle(response);
13
+ }
14
+ export async function createAttachment(client, params) {
15
+ const response = await client.post('/attachments', params);
16
+ return unwrapSingle(response);
17
+ }
18
+ export async function updateAttachment(client, id, params) {
19
+ const response = await client.put(`/attachments/${id}`, params);
20
+ return unwrapSingle(response);
21
+ }
22
+ export async function deleteAttachment(client, id) {
23
+ await client.delete(`/attachments/${id}`);
24
+ return { deleted: true, id };
25
+ }
26
+ export async function uploadAttachment(client, id, content) {
27
+ await client.postBinary(`/attachments/${id}/upload`, content);
28
+ return { uploaded: true, id };
29
+ }
30
+ export async function downloadAttachment(client, id) {
31
+ return client.getText(`/attachments/${id}/download`);
32
+ }
33
+ export function registerAttachmentTools(server, client) {
34
+ defineTool(server, 'get_attachments', {
35
+ title: 'Get Attachments',
36
+ description: 'Get all file attachments from Firefly III.',
37
+ inputSchema: {
38
+ page: z.number().int().positive().optional().default(1).describe('Page number'),
39
+ limit: z.number().int().positive().max(100).optional().default(50).describe('Results per page (max 100)'),
40
+ },
41
+ annotations: READ_ANNOTATIONS,
42
+ }, ({ page, limit }) => fetchAttachments(client, { page: page, limit: limit }));
43
+ defineTool(server, 'get_attachment', {
44
+ title: 'Get Attachment',
45
+ description: 'Get a single file attachment by its numeric ID. Use get_attachments to find valid IDs.',
46
+ inputSchema: {
47
+ id: z.string().describe('Attachment ID'),
48
+ },
49
+ annotations: READ_ANNOTATIONS,
50
+ }, ({ id }) => fetchAttachment(client, id));
51
+ defineTool(server, 'create_attachment', {
52
+ title: 'Create Attachment',
53
+ description: 'Create attachment metadata in Firefly III. This creates the metadata record only — use upload_attachment to send the actual file content. The returned ID is needed for the upload step.',
54
+ inputSchema: {
55
+ filename: z.string().describe('Filename including extension, e.g. receipt.pdf'),
56
+ attachable_type: z
57
+ .enum(['Account', 'Budget', 'Bill', 'TransactionJournal', 'PiggyBank', 'Tag'])
58
+ .describe('Type of object this attachment belongs to'),
59
+ attachable_id: z.string().describe('ID of the object this attachment belongs to'),
60
+ title: z.string().optional().describe('Human-readable title'),
61
+ notes: z.string().optional().describe('Notes'),
62
+ },
63
+ annotations: WRITE_ANNOTATIONS,
64
+ }, ({ filename, attachable_type, attachable_id, title, notes }) => createAttachment(client, {
65
+ filename: filename,
66
+ attachable_type: attachable_type,
67
+ attachable_id: attachable_id,
68
+ title: title,
69
+ notes: notes,
70
+ }));
71
+ defineTool(server, 'update_attachment', {
72
+ title: 'Update Attachment',
73
+ description: 'Update attachment metadata. Only fields provided will be changed. Use get_attachment to confirm the ID before updating.',
74
+ inputSchema: {
75
+ id: z.string().describe('Attachment ID — use get_attachments to find valid IDs'),
76
+ filename: z.string().optional().describe('Filename including extension'),
77
+ title: z.string().optional().describe('Human-readable title'),
78
+ notes: z.string().optional().describe('Notes'),
79
+ },
80
+ annotations: UPDATE_ANNOTATIONS,
81
+ }, ({ id, filename, title, notes }) => updateAttachment(client, id, {
82
+ filename: filename,
83
+ title: title,
84
+ notes: notes,
85
+ }));
86
+ defineTool(server, 'delete_attachment', {
87
+ title: 'Delete Attachment',
88
+ description: 'Permanently delete an attachment and its file data from Firefly III. **This action cannot be undone.** Use get_attachment to confirm before deleting.',
89
+ inputSchema: {
90
+ id: z.string().describe('Attachment ID — use get_attachments to find valid IDs'),
91
+ },
92
+ annotations: DELETE_ANNOTATIONS,
93
+ }, ({ id }) => deleteAttachment(client, id));
94
+ defineTool(server, 'upload_attachment', {
95
+ title: 'Upload Attachment File',
96
+ description: 'Upload the binary content for an existing attachment record. Call create_attachment first to get the attachment ID, then call this tool with the base64-encoded file content. The two-step workflow: (1) create_attachment → get ID, (2) upload_attachment with that ID and content_base64.',
97
+ inputSchema: {
98
+ id: z.string().describe('Attachment ID from create_attachment'),
99
+ content_base64: z.string().describe('File content encoded as base64'),
100
+ },
101
+ annotations: WRITE_ANNOTATIONS,
102
+ }, ({ id, content_base64 }) => uploadAttachment(client, id, Buffer.from(content_base64, 'base64')));
103
+ defineTool(server, 'download_attachment', {
104
+ title: 'Download Attachment',
105
+ description: 'Download the raw content of an attachment as text. Useful for reading receipts or notes. Use get_attachments to find valid IDs.',
106
+ inputSchema: {
107
+ id: z.string().describe('Attachment ID'),
108
+ },
109
+ annotations: READ_ANNOTATIONS,
110
+ }, ({ id }) => downloadAttachment(client, id));
111
+ }
112
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/tools/attachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
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 fetchBills(client: FireflyClient, params: {
5
+ start?: string;
6
+ end?: string;
7
+ page?: number;
8
+ limit?: number;
9
+ }): Promise<UnwrappedList>;
10
+ export declare function createBill(client: FireflyClient, params: {
11
+ name: string;
12
+ amount_min: string;
13
+ amount_max: string;
14
+ date: string;
15
+ repeat_freq: 'weekly' | 'monthly' | 'quarterly' | 'half-year' | 'yearly';
16
+ currency_code?: string;
17
+ end_date?: string;
18
+ active?: boolean;
19
+ notes?: string;
20
+ }): Promise<UnwrappedSingle>;
21
+ export declare function updateBill(client: FireflyClient, id: string, params: {
22
+ name?: string;
23
+ amount_min?: string;
24
+ amount_max?: string;
25
+ date?: string;
26
+ repeat_freq?: 'weekly' | 'monthly' | 'quarterly' | 'half-year' | 'yearly';
27
+ currency_code?: string;
28
+ end_date?: string;
29
+ active?: boolean;
30
+ notes?: string;
31
+ }): Promise<UnwrappedSingle>;
32
+ export declare function deleteBill(client: FireflyClient, id: string): Promise<{
33
+ deleted: true;
34
+ id: string;
35
+ }>;
36
+ export declare function fetchBillTransactions(client: FireflyClient, id: string, params: {
37
+ start?: string;
38
+ end?: string;
39
+ page?: number;
40
+ limit?: number;
41
+ }): Promise<UnwrappedList>;
42
+ export declare function registerBillTools(server: McpServer, client: FireflyClient): void;
43
+ //# sourceMappingURL=bills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bills.d.ts","sourceRoot":"","sources":["../../src/tools/bills.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;AAKzB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,aAAa,CAAC,CAMxB;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE;IACN,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE;IACN,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAG1G;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,aAAa,CAAC,CAMxB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CA8GhF"}