mcpField
P
plaid-integration

plaid-integration

github.com/b-open-ioDevelopment1667 installsUpdated 4w ago
Repository

About plaid-integration

A TypeScript and Bun integration skill for adding Plaid bank connections and transaction syncing to applications. It covers client setup, Link token creation, token exchange, paginated retrieval, incremental sync, error handling, and Bun SQLite storage examples.

Key features

  1. 01Plaid client setup with Bun
  2. 02Link token and access-token exchange
  3. 03Paginated transaction retrieval
  4. 04Cursor-based incremental sync
  5. 05Plaid error handling and SQLite examples

Use cases

  1. 01Adding bank account connections to an app
  2. 02Syncing transaction data over time
  3. 03Building a Bun SQLite transaction store

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/b-open-io/prompts --skill plaid-integration

After installing, type/plaid-integrationin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

README.md
.clawnet/
unsigned-skill.json
references/
api-reference.md
code-examples.md

Details

From the project README

Plaid API Integration

Integrate Plaid for connecting bank accounts and syncing transactions in TypeScript applications using Bun.

Installation

bun add plaid

Client Initialization

import { Configuration, PlaidApi, PlaidEnvironments } from 'plaid';

const plaidClient = new PlaidApi(new Configuration({
  basePath: PlaidEnvironments[process.env.PLAID_ENV || 'sandbox'],
  baseOptions: {
    headers: {
      'PLAID-CLIENT-ID': process.env.PLAID_CLIENT_ID,
      'PLAID-SECRET': process.env.PLAID_SECRET,
    }
  }
}));

Link Token Creation

Omit redirect_uri to use popup mode — required for local HTTP development:

const response = await plaidClient.linkTokenCreate({
  user: { client_user_id: `user-${Date.now()}` },
  client_name: 'My App',
  products: ['transactions'],
  country_codes: ['US'],
  language: 'en',
  // No redirect_uri = popup mode, works with HTTP localhost
});
const linkToken = response.data.link_token;

Token Exchange

After the user completes Link, exchange the temporary public_token for a permanent access_token:

const response = await plaidClient.itemPublicTokenExchange({ public_token });
const { access_token, item_id } = response.data;
// Store access_token securely — never expose to clients

Transaction Sync

Plaid returns a maximum of 500 transactions per request. Always paginate:

let offset = 0;
const count = 500;

while (true) {
  const response = await plaidClient.transactionsGet({
    access_token,
    start_date: '2023-01-01',
    end_date: '2024-12-31',
    options: { count, offset },
  });

  // Process response.data.transactions
  offset += response.data.transactions.length;
  if (offset >= response.data.total_transactions) break;
}

For ongoing incremental updates, prefer transactionsSync with a cursor — see references/api-reference.md.

Error Handling

Catch Plaid errors from error.response?.data:

try {
  await plaidClient.transactionsGet({ ... });
} catch (error: any) {
  const plaidError = error.response?.data;
  if (!plaidError) throw error;

  switch (plaidError.error_code) {
    case 'ITEM_LOGIN_REQUIRED':
      // Re-initialize Link in update mode
      break;
    case 'INVALID_ACCESS_TOKEN':
      // Token revoked — delete item, prompt re-link
      break;
    case 'PRODUCT_NOT_READY':
      // Data still processing — retry after delay
      break;
    default:
      throw new Error(`Plaid error: ${plaidError.error_code} — ${plaidError.error_message}`);
  }
}

Database Setup

Use Bun SQLite with items → accounts → transactions hierarchy. For the complete schema with indexes, prepared statements, and TypeScript types, see references/code-examples.md.

Reference Files

  • references/code-examples.md — Full working implementations: bank connection flow with Elysia server, transaction sync with pagination, complete Bun SQLite database module, CLI integration
  • references/api-reference.md — All API endpoints with request/response shapes, sandbox test credentials, webhook events, rate limits

Comments

Markdown supported