Skip to main content
Glama
wilderfield

plaid-mcp

by wilderfield

plaid-mcp

エフェメラル(一時的)なコンテナで実行されるAIアシスタント(Elowen)のための、常駐型Plaid MCPサーバーです。

plaid-mcpは、Plaidのシークレットと、リンクされたすべての金融機関の暗号化されたアクセストークンを保持する、長期間稼働する外部ホスト型サービスです。アシスタントは実行時に mcp__plaid__* ツールを呼び出しますが、生のアクセストークンを見ることはありません。Plaidがすでに公開情報とみなしている不透明な item_id および account_id の値のみを扱います。

Elowen (ephemeral container)
  └─ calls mcp__plaid__* tools
        └─ plaid-mcp (persistent, nanoclaw-hosted)
              ├─ Plaid SDK + PLAID_SECRET (never leaves this service)
              ├─ access_token store (SQLite, AES-256-GCM at rest)
              └─ /link/start, /link/callback (HTTPS, browser-facing)
                    └─ Plaid REST API / Plaid Link JS

サーフェス

単一のNode.jsプロセスが、完全に分離された2つのサーフェスを公開します。

  1. MCPサーバー。 stdio(エージェントがこのバイナリをサブプロセスとして起動する)または httpPOST /mcp でのストリーミングHTTP、Bearer認証付き)のいずれか。MCP_TRANSPORT で選択します。前述の家計管理のユースケースでは、エフェメラルなエージェントコンテナの群れが1つの常駐サーバーを共有できるように http を推奨します。

  2. HTTPSリンクミニアプリ (/link/*)。銀行リンクの初回フロー時のみ使用されます。ユーザーはアシスタントから提供されたURLを開き、Plaid Link内で銀行にログインして完了します。その後、その金融機関のためにブラウザが必要になることはありません。

Related MCP server: plaid-mcp

MCPツール

ツール

機能

list_linked_institutions()

リンクされたすべてのアイテム。needs_relink ヘルスフラグ付き(アイテムごとに /item/get を呼び出し)。

list_accounts(item_id?)

1つまたはすべての金融機関のキャッシュされた口座リスト(タイプ、サブタイプ、マスク、最終残高)。

get_balances(account_ids?)

/accounts/balance/get(Plaidの有料エンドポイント)によるリアルタイム残高。

get_transactions(start_date, end_date, account_ids?, cursor?)

日付範囲指定の取引履歴。1ページあたり約250件、不透明なページネーションカーソルを使用。

search_transactions(query, since?, until?, min_amount?, max_amount?, category?)

サーバーサイドでフィルタリングされた取引検索。コンパクトな行を返します。

get_monthly_summary(month, group_by?)

category または merchant でグループ化された月次合計の事前集計。LLMのコンテキストを小さく保ちます。

get_investment_holdings(account_ids?)

ポジションのスナップショット(ティッカー、数量、市場価値、取得原価)。

get_investment_transactions(start_date, end_date, account_ids?)

指定期間内の売買・配当履歴。

get_liabilities(account_ids?)

クレジットカードのAPR/明細、学生ローン、住宅ローンの詳細。

initiate_link(institution_hint?)

{ url, session_id, expires_at } を返します。URLをユーザーに渡してください。

link_status(session_id)

succeeded(新しい item_id を含む)、failed、または expired になるまでポーリングします。

remove_institution(item_id)

Plaidアイテムを取り消し、ローカルトークンを削除します。

すべてのツール応答は、単一の text コンテンツアイテム内のJSONです(structuredContent を表示しないクライアントを含む、すべてのMCPクライアントで動作します)。

初回リンクフロー

  1. Elowenが initiate_link({ institution_hint: "Chase" }) を呼び出します。サーバーは以下の処理を行います。

    • Plaidの /link/token/create を呼び出す。

    • link_sessions 行を保存する(ステータスは pending)。

    • { url: "https://<LINK_BASE_URL>/link/start?s=<uuid>&sig=<hmac>", session_id, expires_at } を返す。

  2. ElowenがユーザーにURLを送信します。

  3. ユーザーがブラウザでURLを開きます。ページは公式CDNから link_token を使用してPlaid Link JSを読み込み、「Open Plaid Link」ボタンを表示します。

  4. Plaid Linkの onSuccess{ public_token, institution } と署名済みセッションIDを /link/callback にPOSTします。

  5. /link/callbackpublic_tokenaccess_token + item_id に交換し、アクセストークンをAES-256-GCMで暗号化して保存し、セッションを succeeded とマークします。

  6. Elowenが link_status(session_id) をポーリングし、item_id を伴う succeeded を確認して処理を続行します。

署名付きURLパラメータ (s, sig) は LINK_SESSION_SECRET によってHMAC-SHA256でキー化されています。DB行が信頼の源泉であり、HMACはSQLiteに触れる前に不正なリクエストを安価に拒否するためのものです。

設定

すべての設定は環境変数(.env から読み込み)で行います。

変数

必須

デフォルト

説明

PLAID_CLIENT_ID

はい

Plaidダッシュボードから取得

PLAID_SECRET

はい

Plaidダッシュボードから取得。このサービスから外部へは出ません。

PLAID_ENV

いいえ

sandbox

sandbox

development

production

PLAID_API_VERSION

いいえ

2020-09-14

固定されたAPIバージョン

PLAID_PRODUCTS

いいえ

transactions

カンマ区切りリスト。例: transactions,investments,liabilities

PLAID_COUNTRY_CODES

いいえ

US

ISO国コードのカンマ区切りリスト

PLAID_USER_ID

いいえ

family-default

Plaidに送信される安定した client_user_id

PLAID_ENCRYPTION_KEY

はい

32バイトの16進数 (openssl rand -hex 32)。保存時のトークン用AES-256-GCMキー。

LINK_SESSION_SECRET

はい

32バイト以上の16進数。署名付きリンクURL用のHMACキー。

LINK_SESSION_TTL_SECONDS

いいえ

900

リンクセッションの有効期間

LINK_BASE_URL

はい

ブラウザがアクセスする公開HTTPSベースURL (例: https://plaid.example.com)

PORT

いいえ

3333

HTTPポート。TLSは上位のnanoclawで終端されます。

ADMIN_TOKEN

いいえ

設定されている場合、/link/admin/* イントロスペクションルートを保護します

MCP_TRANSPORT

いいえ

http

stdio

http

MCP_BEARER_TOKEN

MCP_TRANSPORT=http の場合必須

POST /mcp で必要なBearerトークン

DB_PATH

いいえ

./data/plaid-mcp.sqlite (Docker: /data/plaid-mcp.sqlite)

SQLiteパス。ここに永続ボリュームをマウントしてください。

LOG_LEVEL

いいえ

info

Pinoログレベル。すべてのログはstderrに出力されます。

シークレットの生成方法:

make keys

ストレージ

$DB_PATH にSQLite (better-sqlite3) を使用します。重要なテーブルは2つです。

  • itemsitem_id (PK)、暗号化された access_token_blob (BLOB)、金融機関名/ID、ステータス、同意有効期限。

  • link_sessions — 短命なセッション。expires_at を過ぎた後の読み取り時、および60秒ごとのバックグラウンドスイープで自動的に期限切れになります。

アクセストークンは [1バイトのバージョン][12バイトのIV][16バイトのGCMタグ][Nバイトの暗号文] として保存されます。GCMタグが検証できない場合、復号は失敗します。

セキュリティモデル

  • MCP HTTPトランスポートは、すべてのリクエストで Authorization: Bearer $MCP_BEARER_TOKEN を要求します。これがないと、エージェント群がリンクされたすべての銀行口座をインターネットに公開することになります。

  • ブラウザ向けの /link/* ルートは署名(HMAC)されており、短命なDBベースのセッションにバインドされています。

  • TLSは**上位(nanoclaw / Caddy / エッジ環境)**で終端されることを想定しています。コンテナ内部はプレーンなHTTPで通信するため、プロキシ経由でのみ公開してください。

  • すべてのPlaidトークンは保存時に暗号化されます。SQLiteファイルが流出したとしても、PLAID_ENCRYPTION_KEY を持たない攻撃者はトークンを使用できません。

  • MCPツールはアクセストークンをエージェントに返しません。不透明な item_id / account_id 文字列のみがMCP境界を越えます。

ローカル開発

npm install
make setup           # creates .env from env.example
make keys >> .env    # append fresh PLAID_ENCRYPTION_KEY / LINK_SESSION_SECRET / MCP_BEARER_TOKEN
# edit .env: PLAID_CLIENT_ID, PLAID_SECRET, LINK_BASE_URL
npm run dev          # tsx with hot reload

ローカルでのリンクテストにはHTTPSトンネルが必要です(Plaid Linkの onSuccesshttp://localhost からは発火しません)。cloudflaredngrok、または実際のCaddyリバースプロキシなどが使用可能です。取得した公開ホスト名を LINK_BASE_URL に設定してください。

Docker

make build
make up
make logs

Composeファイルは ./data:/data をマウントしているため、SQLite DBは再起動後も保持されます。nanoclaw環境では、そのバインドマウントをクラスター管理の永続ボリュームに置き換えてください。

ホスト型インスタンスへのエージェントの接続

エージェントコンテナのMCPクライアント設定内:

{
  "mcpServers": {
    "plaid": {
      "url": "https://plaid-mcp.your-domain.example/mcp",
      "headers": {
        "Authorization": "Bearer <MCP_BEARER_TOKEN>"
      }
    }
  }
}

エージェントは、nanoclawが他のエージェントシークレットに使用しているシークレット注入メカニズムを通じてBearerトークンを取得します。PLAID_SECRET やアクセストークンを直接見ることはありません

ライセンス

内部利用。

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Self-hosted MCP server enabling Claude to query bank accounts, balances, and transactions through Plaid with OAuth and TLS.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    A local MCP server that provides read-only SQL access to financial accounts via Plaid, enabling natural language queries about transactions, balances, and holdings.
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Personal finance MCP server that integrates Plaid bank data with local SQLite memory for conversational budgeting, goal tracking, and transaction management.
    15
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server that exposes banking data (connections, accounts, balances, transactions) and agent skills, allowing AI agents to query and refresh financial data via stdio.
    139
    6
    Apache 2.0