@bank-mcp/server 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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +564 -0
  3. package/dist/config.d.ts +11 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +79 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/index.d.ts +11 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +33 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/init.d.ts +6 -0
  12. package/dist/init.d.ts.map +1 -0
  13. package/dist/init.js +96 -0
  14. package/dist/init.js.map +1 -0
  15. package/dist/providers/base.d.ts +22 -0
  16. package/dist/providers/base.d.ts.map +1 -0
  17. package/dist/providers/base.js +9 -0
  18. package/dist/providers/base.js.map +1 -0
  19. package/dist/providers/enable-banking/auth.d.ts +9 -0
  20. package/dist/providers/enable-banking/auth.d.ts.map +1 -0
  21. package/dist/providers/enable-banking/auth.js +30 -0
  22. package/dist/providers/enable-banking/auth.js.map +1 -0
  23. package/dist/providers/enable-banking/index.d.ts +12 -0
  24. package/dist/providers/enable-banking/index.d.ts.map +1 -0
  25. package/dist/providers/enable-banking/index.js +171 -0
  26. package/dist/providers/enable-banking/index.js.map +1 -0
  27. package/dist/providers/mock/index.d.ts +18 -0
  28. package/dist/providers/mock/index.d.ts.map +1 -0
  29. package/dist/providers/mock/index.js +151 -0
  30. package/dist/providers/mock/index.js.map +1 -0
  31. package/dist/providers/plaid/index.d.ts +12 -0
  32. package/dist/providers/plaid/index.d.ts.map +1 -0
  33. package/dist/providers/plaid/index.js +213 -0
  34. package/dist/providers/plaid/index.js.map +1 -0
  35. package/dist/providers/registry.d.ts +4 -0
  36. package/dist/providers/registry.d.ts.map +1 -0
  37. package/dist/providers/registry.js +26 -0
  38. package/dist/providers/registry.js.map +1 -0
  39. package/dist/providers/teller/index.d.ts +12 -0
  40. package/dist/providers/teller/index.d.ts.map +1 -0
  41. package/dist/providers/teller/index.js +215 -0
  42. package/dist/providers/teller/index.js.map +1 -0
  43. package/dist/providers/tink/index.d.ts +12 -0
  44. package/dist/providers/tink/index.d.ts.map +1 -0
  45. package/dist/providers/tink/index.js +169 -0
  46. package/dist/providers/tink/index.js.map +1 -0
  47. package/dist/server.d.ts +2 -0
  48. package/dist/server.d.ts.map +1 -0
  49. package/dist/server.js +90 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/tools/get-balance.d.ts +8 -0
  52. package/dist/tools/get-balance.d.ts.map +1 -0
  53. package/dist/tools/get-balance.js +39 -0
  54. package/dist/tools/get-balance.js.map +1 -0
  55. package/dist/tools/list-accounts.d.ts +7 -0
  56. package/dist/tools/list-accounts.d.ts.map +1 -0
  57. package/dist/tools/list-accounts.js +33 -0
  58. package/dist/tools/list-accounts.js.map +1 -0
  59. package/dist/tools/list-transactions.d.ts +17 -0
  60. package/dist/tools/list-transactions.d.ts.map +1 -0
  61. package/dist/tools/list-transactions.js +104 -0
  62. package/dist/tools/list-transactions.js.map +1 -0
  63. package/dist/tools/search-transactions.d.ts +10 -0
  64. package/dist/tools/search-transactions.d.ts.map +1 -0
  65. package/dist/tools/search-transactions.js +27 -0
  66. package/dist/tools/search-transactions.js.map +1 -0
  67. package/dist/tools/spending-summary.d.ts +25 -0
  68. package/dist/tools/spending-summary.d.ts.map +1 -0
  69. package/dist/tools/spending-summary.js +65 -0
  70. package/dist/tools/spending-summary.js.map +1 -0
  71. package/dist/types.d.ts +65 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +21 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/utils/cache.d.ts +19 -0
  76. package/dist/utils/cache.d.ts.map +1 -0
  77. package/dist/utils/cache.js +33 -0
  78. package/dist/utils/cache.js.map +1 -0
  79. package/dist/utils/http.d.ts +12 -0
  80. package/dist/utils/http.d.ts.map +1 -0
  81. package/dist/utils/http.js +34 -0
  82. package/dist/utils/http.js.map +1 -0
  83. package/dist/utils/zod-to-json.d.ts +9 -0
  84. package/dist/utils/zod-to-json.d.ts.map +1 -0
  85. package/dist/utils/zod-to-json.js +62 -0
  86. package/dist/utils/zod-to-json.js.map +1 -0
  87. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/plaid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,OAAO,EACP,iBAAiB,EACjB,WAAW,EACZ,MAAM,gBAAgB,CAAC;AA0DxB,qBAAa,aAAc,SAAQ,YAAY;IAC7C,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,sBAAsB;IAE1C,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIrD,eAAe,IAAI,WAAW,EAAE;IAiC1B,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAcrE,gBAAgB,CACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,WAAW,EAAE,CAAC;IAiDnB,UAAU,CACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,EAAE,CAAC;CA+BtB"}
@@ -0,0 +1,213 @@
1
+ import { BankProvider } from "../base.js";
2
+ import { httpFetch } from "../../utils/http.js";
3
+ const ENVIRONMENTS = {
4
+ sandbox: "https://sandbox.plaid.com",
5
+ development: "https://development.plaid.com",
6
+ production: "https://production.plaid.com",
7
+ };
8
+ function parseConfig(raw) {
9
+ const clientId = raw.clientId;
10
+ const secret = raw.secret;
11
+ const accessToken = raw.accessToken;
12
+ const environment = raw.environment || "sandbox";
13
+ if (!clientId || !secret || !accessToken) {
14
+ throw new Error("Plaid config requires: clientId, secret, accessToken");
15
+ }
16
+ if (!ENVIRONMENTS[environment]) {
17
+ throw new Error(`Invalid Plaid environment "${environment}". Use: sandbox, development, production`);
18
+ }
19
+ return { clientId, secret, accessToken, environment };
20
+ }
21
+ /**
22
+ * All Plaid endpoints are POST with JSON body containing credentials.
23
+ */
24
+ async function plaidPost(config, path, body) {
25
+ const baseUrl = ENVIRONMENTS[config.environment];
26
+ return httpFetch(`${baseUrl}${path}`, {
27
+ method: "POST",
28
+ headers: {
29
+ "Content-Type": "application/json",
30
+ "PLAID-CLIENT-ID": config.clientId,
31
+ "PLAID-SECRET": config.secret,
32
+ },
33
+ body: JSON.stringify({
34
+ access_token: config.accessToken,
35
+ ...body,
36
+ }),
37
+ timeoutMs: 30000,
38
+ retries: 2,
39
+ });
40
+ }
41
+ export class PlaidProvider extends BankProvider {
42
+ name = "plaid";
43
+ displayName = "Plaid (US/CA/EU)";
44
+ validateConfig(config) {
45
+ parseConfig(config);
46
+ }
47
+ getConfigSchema() {
48
+ return [
49
+ {
50
+ name: "clientId",
51
+ label: "Client ID",
52
+ type: "string",
53
+ required: true,
54
+ },
55
+ {
56
+ name: "secret",
57
+ label: "Secret",
58
+ type: "string",
59
+ required: true,
60
+ secret: true,
61
+ },
62
+ {
63
+ name: "accessToken",
64
+ label: "Access token (from Plaid Link)",
65
+ type: "string",
66
+ required: true,
67
+ secret: true,
68
+ },
69
+ {
70
+ name: "environment",
71
+ label: "Environment",
72
+ type: "select",
73
+ required: true,
74
+ options: ["sandbox", "development", "production"],
75
+ default: "sandbox",
76
+ },
77
+ ];
78
+ }
79
+ async listAccounts(config) {
80
+ const pc = parseConfig(config);
81
+ const data = (await plaidPost(pc, "/accounts/get", {}));
82
+ return data.accounts.map((a) => ({
83
+ uid: a.account_id,
84
+ iban: a.mask ? `****${a.mask}` : a.account_id,
85
+ name: a.official_name || a.name,
86
+ currency: a.balances?.iso_currency_code || "USD",
87
+ connectionId: "",
88
+ }));
89
+ }
90
+ async listTransactions(config, accountId, filter) {
91
+ const pc = parseConfig(config);
92
+ const startDate = filter?.dateFrom || defaultDateFrom(90);
93
+ const endDate = filter?.dateTo || today();
94
+ const allTx = [];
95
+ let offset = 0;
96
+ const pageSize = 500;
97
+ // Offset-based pagination — loop until we have all transactions
98
+ do {
99
+ const data = (await plaidPost(pc, "/transactions/get", {
100
+ start_date: startDate,
101
+ end_date: endDate,
102
+ options: {
103
+ account_ids: [accountId],
104
+ count: pageSize,
105
+ offset,
106
+ include_personal_finance_category: true,
107
+ },
108
+ }));
109
+ for (const raw of data.transactions) {
110
+ allTx.push(normalizeTransaction(raw));
111
+ }
112
+ offset += data.transactions.length;
113
+ if (offset >= data.total_transactions)
114
+ break;
115
+ } while (true);
116
+ // Apply local filters
117
+ let filtered = allTx;
118
+ if (filter?.amountMin !== undefined) {
119
+ filtered = filtered.filter((t) => Math.abs(t.amount) >= filter.amountMin);
120
+ }
121
+ if (filter?.amountMax !== undefined) {
122
+ filtered = filtered.filter((t) => Math.abs(t.amount) <= filter.amountMax);
123
+ }
124
+ if (filter?.type) {
125
+ filtered = filtered.filter((t) => t.type === filter.type);
126
+ }
127
+ if (filter?.limit) {
128
+ filtered = filtered.slice(0, filter.limit);
129
+ }
130
+ return filtered;
131
+ }
132
+ async getBalance(config, accountId) {
133
+ const pc = parseConfig(config);
134
+ const data = (await plaidPost(pc, "/accounts/balance/get", {
135
+ options: { account_ids: [accountId] },
136
+ }));
137
+ const balances = [];
138
+ for (const acc of data.accounts) {
139
+ const currency = acc.balances?.iso_currency_code || "USD";
140
+ if (acc.balances?.current !== null && acc.balances?.current !== undefined) {
141
+ balances.push({
142
+ accountId: acc.account_id,
143
+ amount: acc.balances.current,
144
+ currency,
145
+ type: "current",
146
+ });
147
+ }
148
+ if (acc.balances?.available !== null && acc.balances?.available !== undefined) {
149
+ balances.push({
150
+ accountId: acc.account_id,
151
+ amount: acc.balances.available,
152
+ currency,
153
+ type: "available",
154
+ });
155
+ }
156
+ }
157
+ return balances;
158
+ }
159
+ }
160
+ /**
161
+ * Normalize a Plaid transaction.
162
+ *
163
+ * CRITICAL: Plaid's amount sign is INVERTED from convention.
164
+ * Positive = money leaving the account (expense).
165
+ * Negative = money entering the account (income).
166
+ * We flip this to match our standard (negative = expense).
167
+ *
168
+ * Category: We use personal_finance_category.detailed when available
169
+ * (e.g. "FOOD_AND_DRINK_FAST_FOOD") as it's the most granular.
170
+ * Falls back to primary (e.g. "FOOD_AND_DRINK"), then legacy category array.
171
+ */
172
+ function normalizeTransaction(raw) {
173
+ // Flip sign: Plaid positive = debit (expense), we want negative = expense
174
+ const amount = -raw.amount;
175
+ const isDebit = amount < 0;
176
+ // Best merchant name: merchant_name > counterparty > name
177
+ const merchantName = raw.merchant_name ||
178
+ raw.counterparties?.find((c) => c.type === "merchant")?.name ||
179
+ undefined;
180
+ // Best category: detailed PFC > primary PFC > legacy category
181
+ let category;
182
+ if (raw.personal_finance_category?.detailed) {
183
+ category = raw.personal_finance_category.detailed;
184
+ }
185
+ else if (raw.personal_finance_category?.primary) {
186
+ category = raw.personal_finance_category.primary;
187
+ }
188
+ else if (raw.category?.length) {
189
+ category = raw.category.join(" > ");
190
+ }
191
+ return {
192
+ id: raw.transaction_id,
193
+ accountId: raw.account_id,
194
+ date: raw.date,
195
+ amount,
196
+ currency: raw.iso_currency_code || "USD",
197
+ description: merchantName || raw.name,
198
+ merchantName,
199
+ category,
200
+ type: isDebit ? "debit" : "credit",
201
+ reference: raw.original_description || raw.name,
202
+ rawData: raw,
203
+ };
204
+ }
205
+ function defaultDateFrom(days) {
206
+ const d = new Date();
207
+ d.setDate(d.getDate() - days);
208
+ return d.toISOString().slice(0, 10);
209
+ }
210
+ function today() {
211
+ return new Date().toISOString().slice(0, 10);
212
+ }
213
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/plaid/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { BankProvider } from "./base.js";
2
+ export declare function getProvider(name: string): BankProvider;
3
+ export declare function listProviders(): BankProvider[];
4
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAmB9C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAStD;AAED,wBAAgB,aAAa,IAAI,YAAY,EAAE,CAE9C"}
@@ -0,0 +1,26 @@
1
+ import { EnableBankingProvider } from "./enable-banking/index.js";
2
+ import { TellerProvider } from "./teller/index.js";
3
+ import { PlaidProvider } from "./plaid/index.js";
4
+ import { TinkProvider } from "./tink/index.js";
5
+ import { MockProvider } from "./mock/index.js";
6
+ const providers = new Map();
7
+ function register(provider) {
8
+ providers.set(provider.name, provider);
9
+ }
10
+ register(new EnableBankingProvider());
11
+ register(new TellerProvider());
12
+ register(new PlaidProvider());
13
+ register(new TinkProvider());
14
+ register(new MockProvider());
15
+ export function getProvider(name) {
16
+ const provider = providers.get(name);
17
+ if (!provider) {
18
+ const available = [...providers.keys()].join(", ");
19
+ throw new Error(`Unknown provider "${name}". Available: ${available}`);
20
+ }
21
+ return provider;
22
+ }
23
+ export function listProviders() {
24
+ return [...providers.values()];
25
+ }
26
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;AAElD,SAAS,QAAQ,CAAC,QAAsB;IACtC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,QAAQ,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;AACtC,QAAQ,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC;AAC/B,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;AAC9B,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;AAC7B,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;AAE7B,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,iBAAiB,SAAS,EAAE,CACtD,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { BankProvider } from "../base.js";
2
+ import type { BankAccount, Transaction, Balance, TransactionFilter, ConfigField } from "../../types.js";
3
+ export declare class TellerProvider extends BankProvider {
4
+ readonly name = "teller";
5
+ readonly displayName = "Teller (US Banks)";
6
+ validateConfig(config: Record<string, unknown>): void;
7
+ getConfigSchema(): ConfigField[];
8
+ listAccounts(config: Record<string, unknown>): Promise<BankAccount[]>;
9
+ listTransactions(config: Record<string, unknown>, accountId: string, filter?: TransactionFilter): Promise<Transaction[]>;
10
+ getBalance(config: Record<string, unknown>, accountId: string): Promise<Balance[]>;
11
+ }
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/teller/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,OAAO,EACP,iBAAiB,EACjB,WAAW,EACZ,MAAM,gBAAgB,CAAC;AA+FxB,qBAAa,cAAe,SAAQ,YAAY;IAC9C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,uBAAuB;IAE3C,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIrD,eAAe,IAAI,WAAW,EAAE;IAwB1B,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAqBrE,gBAAgB,CACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,WAAW,EAAE,CAAC;IA0DnB,UAAU,CACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,EAAE,CAAC;CAgCtB"}
@@ -0,0 +1,215 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { request as httpsRequest, Agent } from "node:https";
4
+ import { BankProvider } from "../base.js";
5
+ const API_BASE = "https://api.teller.io";
6
+ function parseConfig(raw) {
7
+ const certificatePath = raw.certificatePath;
8
+ const privateKeyPath = raw.privateKeyPath;
9
+ const accessToken = raw.accessToken;
10
+ if (!certificatePath || !privateKeyPath || !accessToken) {
11
+ throw new Error("Teller config requires: certificatePath, privateKeyPath, accessToken");
12
+ }
13
+ return { certificatePath, privateKeyPath, accessToken };
14
+ }
15
+ function expandPath(p) {
16
+ return resolve(p.replace(/^~/, process.env.HOME || ""));
17
+ }
18
+ /**
19
+ * Create an HTTPS agent with mutual TLS client certificate.
20
+ *
21
+ * Teller requires mTLS for all API requests — the app proves its
22
+ * identity at the TLS layer, then user enrollment is authenticated
23
+ * via HTTP Basic Auth (token:empty_password).
24
+ */
25
+ function createAgent(config) {
26
+ return new Agent({
27
+ cert: readFileSync(expandPath(config.certificatePath)),
28
+ key: readFileSync(expandPath(config.privateKeyPath)),
29
+ });
30
+ }
31
+ /**
32
+ * Make an HTTPS request with mTLS client certificate.
33
+ *
34
+ * Uses node:https directly because Node's global fetch doesn't
35
+ * reliably support passing an https.Agent for mTLS across all
36
+ * Node versions. This is the battle-tested approach.
37
+ */
38
+ async function tellerFetch(url, config, agent) {
39
+ const auth = Buffer.from(`${config.accessToken}:`).toString("base64");
40
+ return new Promise((resolve, reject) => {
41
+ const req = httpsRequest(url, {
42
+ method: "GET",
43
+ agent,
44
+ headers: {
45
+ Authorization: `Basic ${auth}`,
46
+ Accept: "application/json",
47
+ },
48
+ }, (res) => {
49
+ const chunks = [];
50
+ res.on("data", (chunk) => chunks.push(chunk));
51
+ res.on("end", () => {
52
+ const body = Buffer.concat(chunks).toString("utf-8");
53
+ if (res.statusCode && res.statusCode >= 400) {
54
+ reject(new Error(`Teller API ${res.statusCode} ${res.statusMessage}: ${body.slice(0, 200)}`));
55
+ return;
56
+ }
57
+ try {
58
+ resolve(JSON.parse(body));
59
+ }
60
+ catch {
61
+ reject(new Error(`Teller API: invalid JSON response: ${body.slice(0, 200)}`));
62
+ }
63
+ });
64
+ });
65
+ req.on("error", reject);
66
+ req.setTimeout(30000, () => {
67
+ req.destroy(new Error("Teller API request timed out (30s)"));
68
+ });
69
+ req.end();
70
+ });
71
+ }
72
+ export class TellerProvider extends BankProvider {
73
+ name = "teller";
74
+ displayName = "Teller (US Banks)";
75
+ validateConfig(config) {
76
+ parseConfig(config);
77
+ }
78
+ getConfigSchema() {
79
+ return [
80
+ {
81
+ name: "certificatePath",
82
+ label: "Path to client certificate (.pem)",
83
+ type: "path",
84
+ required: true,
85
+ },
86
+ {
87
+ name: "privateKeyPath",
88
+ label: "Path to private key (.pem)",
89
+ type: "path",
90
+ required: true,
91
+ },
92
+ {
93
+ name: "accessToken",
94
+ label: "Access token (from Teller Connect enrollment)",
95
+ type: "string",
96
+ required: true,
97
+ secret: true,
98
+ },
99
+ ];
100
+ }
101
+ async listAccounts(config) {
102
+ const tc = parseConfig(config);
103
+ const agent = createAgent(tc);
104
+ const accounts = (await tellerFetch(`${API_BASE}/accounts`, tc, agent));
105
+ return accounts
106
+ .filter((a) => a.status === "open")
107
+ .map((a) => ({
108
+ uid: a.id,
109
+ iban: a.last_four ? `****${a.last_four}` : a.id,
110
+ name: a.name,
111
+ currency: a.currency || "USD",
112
+ connectionId: "",
113
+ }));
114
+ }
115
+ async listTransactions(config, accountId, filter) {
116
+ const tc = parseConfig(config);
117
+ const agent = createAgent(tc);
118
+ // Teller uses cursor pagination with from_id + count
119
+ const allTx = [];
120
+ let fromId;
121
+ const pageSize = 250;
122
+ do {
123
+ const params = new URLSearchParams();
124
+ params.set("count", String(pageSize));
125
+ if (fromId)
126
+ params.set("from_id", fromId);
127
+ const url = `${API_BASE}/accounts/${accountId}/transactions?${params}`;
128
+ const page = (await tellerFetch(url, tc, agent));
129
+ if (page.length === 0)
130
+ break;
131
+ for (const raw of page) {
132
+ const tx = normalizeTransaction(raw);
133
+ // Apply date filter (Teller doesn't support server-side date filtering)
134
+ if (filter?.dateFrom && tx.date < filter.dateFrom)
135
+ continue;
136
+ if (filter?.dateTo && tx.date > filter.dateTo)
137
+ continue;
138
+ allTx.push(tx);
139
+ }
140
+ // If we got a full page, there may be more
141
+ if (page.length < pageSize)
142
+ break;
143
+ fromId = page[page.length - 1].id;
144
+ // Safety: if we've passed the dateFrom window, stop paginating
145
+ if (filter?.dateFrom) {
146
+ const lastDate = page[page.length - 1].date;
147
+ if (lastDate < filter.dateFrom)
148
+ break;
149
+ }
150
+ } while (true);
151
+ // Apply remaining local filters
152
+ let filtered = allTx;
153
+ if (filter?.amountMin !== undefined) {
154
+ filtered = filtered.filter((t) => Math.abs(t.amount) >= filter.amountMin);
155
+ }
156
+ if (filter?.amountMax !== undefined) {
157
+ filtered = filtered.filter((t) => Math.abs(t.amount) <= filter.amountMax);
158
+ }
159
+ if (filter?.type) {
160
+ filtered = filtered.filter((t) => t.type === filter.type);
161
+ }
162
+ if (filter?.limit) {
163
+ filtered = filtered.slice(0, filter.limit);
164
+ }
165
+ return filtered;
166
+ }
167
+ async getBalance(config, accountId) {
168
+ const tc = parseConfig(config);
169
+ const agent = createAgent(tc);
170
+ const bal = (await tellerFetch(`${API_BASE}/accounts/${accountId}/balances`, tc, agent));
171
+ const balances = [];
172
+ if (bal.ledger !== null) {
173
+ balances.push({
174
+ accountId,
175
+ amount: parseFloat(bal.ledger),
176
+ currency: "USD",
177
+ type: "ledger",
178
+ });
179
+ }
180
+ if (bal.available !== null) {
181
+ balances.push({
182
+ accountId,
183
+ amount: parseFloat(bal.available),
184
+ currency: "USD",
185
+ type: "available",
186
+ });
187
+ }
188
+ return balances;
189
+ }
190
+ }
191
+ /**
192
+ * Normalize a Teller transaction.
193
+ *
194
+ * Teller's amounts are pre-signed strings ("-86.46" for debits).
195
+ * Categories are flat (~28 values). Counterparty is already extracted.
196
+ */
197
+ function normalizeTransaction(raw) {
198
+ const amount = parseFloat(raw.amount);
199
+ const isDebit = amount < 0;
200
+ const merchantName = raw.details?.counterparty?.name || undefined;
201
+ return {
202
+ id: raw.id,
203
+ accountId: raw.account_id,
204
+ date: raw.date,
205
+ amount,
206
+ currency: "USD",
207
+ description: merchantName || raw.description,
208
+ merchantName,
209
+ category: raw.details?.category || undefined,
210
+ type: isDebit ? "debit" : "credit",
211
+ reference: raw.description,
212
+ rawData: raw,
213
+ };
214
+ }
215
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/teller/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { BankProvider } from "../base.js";
2
+ import type { BankAccount, Transaction, Balance, TransactionFilter, ConfigField } from "../../types.js";
3
+ export declare class TinkProvider extends BankProvider {
4
+ readonly name = "tink";
5
+ readonly displayName = "Tink (EU Open Banking)";
6
+ validateConfig(config: Record<string, unknown>): void;
7
+ getConfigSchema(): ConfigField[];
8
+ listAccounts(config: Record<string, unknown>): Promise<BankAccount[]>;
9
+ listTransactions(config: Record<string, unknown>, accountId: string, filter?: TransactionFilter): Promise<Transaction[]>;
10
+ getBalance(config: Record<string, unknown>, accountId: string): Promise<Balance[]>;
11
+ }
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/tink/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,OAAO,EACP,iBAAiB,EACjB,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAoDxB,qBAAa,YAAa,SAAQ,YAAY;IAC5C,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,4BAA4B;IAEhD,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIrD,eAAe,IAAI,WAAW,EAAE;IAY1B,YAAY,CAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,WAAW,EAAE,CAAC;IAcnB,gBAAgB,CACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,WAAW,EAAE,CAAC;IAmDnB,UAAU,CACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,EAAE,CAAC;CA+BtB"}