Skip to main content
Glama
wilderfield

plaid-mcp

by wilderfield

plaid-mcp

일시적인 컨테이너에서 실행되는 AI 어시스턴트(Elowen)를 위한 지속형 Plaid MCP 서버입니다.

plaid-mcp는 Plaid 비밀 키와 연결된 모든 기관의 암호화된 액세스 토큰을 소유하는 장기 실행 외부 호스팅 서비스입니다. 어시스턴트는 런타임에 mcp__plaid__* 도구를 호출하며, 원시 액세스 토큰은 절대 볼 수 없고 Plaid가 이미 공개된 것으로 간주하는 불투명한 item_idaccount_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 프로세스가 두 개의 완전히 분리된 인터페이스를 노출합니다:

  1. MCP 서버. stdio(에이전트가 이 바이너리를 하위 프로세스로 생성) 또는 http(POST /mcp에서 스트리밍 HTTP, Bearer 인증) 중 하나를 선택합니다. MCP_TRANSPORT로 선택하십시오. 위에서 설명한 가계부 사용 사례의 경우, 여러 일시적 에이전트 컨테이너가 하나의 지속형 서버를 공유할 수 있도록 http를 권장합니다.

  2. HTTPS 링크 미니 앱 (/link/*). 일회성 은행 연결 흐름 중에만 사용됩니다. 사용자가 어시스턴트가 제공한 URL을 열고 Plaid Link 내에서 은행에 로그인하면 완료됩니다. 그 이후에는 해당 기관에 대해 브라우저가 다시 필요하지 않습니다.

Related MCP server: plaid-mcp

MCP 도구

도구

기능

list_linked_institutions()

needs_relink 상태 플래그를 포함한 모든 연결된 항목(항목당 /item/get 호출).

list_accounts(item_id?)

하나 또는 모든 기관에 대한 캐시된 계좌 목록(유형, 하위 유형, 마스킹, 최종 잔액).

get_balances(account_ids?)

/accounts/balance/get을 통한 실시간 잔액(유료 Plaid 엔드포인트).

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

날짜 범위별 거래 내역, 페이지당 약 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는 상위(upstream)에서 종료됨.

ADMIN_TOKEN

아니오

설정 시 /link/admin/* 인트로스펙션 경로를 보호함

MCP_TRANSPORT

아니오

http

stdio

http

MCP_BEARER_TOKEN

MCP_TRANSPORT=http일 때 필수

POST /mcp에 필요한 Bearer 토큰

DB_PATH

아니오

./data/plaid-mcp.sqlite

SQLite 경로. 여기에 지속형 볼륨을 마운트하십시오.

LOG_LEVEL

아니오

info

Pino 로그 레벨. 모든 로그는 stderr로 출력됨.

비밀 키 생성 방법:

make keys

저장소

$DB_PATH에 SQLite (better-sqlite3) 사용. 두 개의 테이블이 중요합니다:

  • 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는 상위(upstream)(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 onSuccess는 http://localhost에서 작동하지 않음). cloudflared, ngrok 또는 실제 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