Skip to main content
Glama

plaid-mcp

A read-only Model Context Protocol server that lets Claude, ChatGPT, or any MCP-compatible client analyze your real bank, credit card, loan, and brokerage data through Plaid or Teller.

Bring your own credentials, run the server locally (or behind TLS on a small VPS), link your accounts, and then just ask:

"What did I spend on groceries in March?" "Show me my credit card APRs sorted by balance." "Which of my holdings are down more than 10% this year?" "I have a 0% promo on my AA card — given that, which debt should I attack first?"

Everything runs locally. Access tokens stay in a chmod-600 SQLite file on your machine. The server never makes outbound calls except to Plaid's API.


Table of contents


Related MCP server: plaid-mcp

Why this exists

Consumer financial data is locked inside whichever app happens to be connected to your bank. If you want to ask questions of it — "compare my March spending YoY," "what's my real effective APR across all cards," "project when I pay off this debt if I add $200/month" — you end up either exporting CSVs or trusting a SaaS aggregator with your credentials.

This project is a thin, read-only adapter: Plaid on one side, the LLM of your choice on the other. The LLM gets a small set of well-documented tools (transactions, balances, holdings, liabilities, identity, income, debt analysis). You keep your tokens.

Features

Read-only tools grouped by Plaid product area:

  • Accounts & balanceslist_accounts, get_balances

  • Transactionssync_transactions, refresh_transactions, get_transactions, search_transactions, spending_summary

  • Investmentsget_holdings, get_investment_transactions

  • Liabilitiesget_liabilities (credit cards, student loans, mortgages with APRs and due dates)

  • Identity & incomeget_identity, get_income

  • Debt analysisset_account_override, add_external_debt, summarize_debt (avalanche/snowball with amortized payoff projections)

  • Account managementlink_account, complete_linking, list_linked_institutions, remove_institution

All access tokens and cached transactions live in SQLite at ~/.plaid-mcp/plaid.db by default. Nothing leaves your machine except Plaid API calls.

Quick start

The easiest install is pipx or uv tool — both put plaid-mcp on your PATH in an isolated venv.

# 1. Install (pick one)
pipx install plaid-mcp             # or: uv tool install plaid-mcp
                                   # or: pip install plaid-mcp

# 2. Configure — any of these work:
#    a) ~/.plaid-mcp/.env
#    b) project-local .env (if you're running from a clone)
#    c) inline env vars in your MCP client config (see "Claude Desktop" below)
mkdir -p ~/.plaid-mcp && cat > ~/.plaid-mcp/.env <<EOF
PLAID_CLIENT_ID=your_client_id
PLAID_SECRET=your_secret
PLAID_ENV=production
EOF

# 3. Link your first bank in the browser
plaid-mcp link

# 4. Wire it into Claude Desktop (see below) and ask:
#    "list my accounts"
#    "sync my transactions then summarize spending last month"

Prefer to run from source? See Development.

Total setup time if you already have Plaid credentials: ~5 minutes.

Setup (detailed)

1. Get Plaid credentials

You need your own Plaid developer account — don't share a client_id or reuse someone else's credentials. Plaid's terms tie each account to the person who signed up, and the Production trial tier is intended for you to link your own accounts.

  1. Sign up at dashboard.plaid.com. It's free.

  2. In Developers → Keys, note your client_id and one of two secrets:

    • Sandbox secret — fake test data. user_good / pass_good logs into ins_109508 ("First Platypus Bank"). Great for smoke-testing without real data.

    • Production secret — real banks. New accounts get a Production trial (~10 linked items) without going through billing review. No time limit on the trial; it caps at 10 items.

  3. Under Team Settings → Products, request access to Transactions, Investments, Liabilities, and Identity. Most approve instantly. Income requires a brief review.

Plaid retired the separate Development environment in late 2024. New accounts get Sandbox + a Production trial instead. PLAID_ENV=development still works here for backward compatibility; it's silently routed to Production.

2. Install

Choose whichever you prefer — all three drop a plaid-mcp executable on your PATH:

pipx install plaid-mcp            # isolated venv, recommended
uv tool install plaid-mcp         # same idea, uv-native
pip install plaid-mcp             # into your current env

Or from source (for development or running unreleased changes):

git clone https://github.com/t-rhex/plaid-mcp
cd plaid-mcp
uv sync                           # or: pip install -e .

Requires Python 3.10+.

3. Configure

cp .env.example .env
$EDITOR .env

Required fields:

PLAID_CLIENT_ID=your_client_id_here
PLAID_SECRET=your_secret_here
PLAID_ENV=production                            # or: sandbox

Common optional overrides:

# What Plaid products to request during linking.
# PLAID_PRODUCTS  — the bank MUST support these (link fails otherwise).
# PLAID_OPTIONAL_PRODUCTS — requested if supported; link doesn't fail if not.
PLAID_PRODUCTS=transactions
PLAID_OPTIONAL_PRODUCTS=investments,liabilities,identity

PLAID_COUNTRY_CODES=US                          # or: US,CA,GB,ES,FR,IE,NL,DE,IT
PLAID_MCP_DB=~/.plaid-mcp/plaid.db              # tilde gets expanded; file is chmod 600
PLAID_CLIENT_NAME=plaid-mcp                     # shown to the user inside Plaid Link

# For remote deployment only:
# MCP_AUTH_TOKEN=<random 32-byte token>         # required for HTTP mode
# PLAID_WEBHOOK_URL=https://yourhost/webhook    # if using webhook-driven link completion

Why the two product lists? Plaid requires every product you list under PLAID_PRODUCTS to be supported by the bank at link time. Citi doesn't have brokerage, Fidelity doesn't have liabilities, etc. PLAID_OPTIONAL_PRODUCTS are requested "if the bank supports them" via Plaid's required_if_supported_products — so one .env works across banks and brokers.

uv run python -m plaid_mcp link
# => Open this URL in your browser: https://cdn.plaid.com/link/v2/stable/link.html?...
# => After completing, press Enter.

Open the URL, pick your bank, complete the OAuth flow (for most banks this redirects to your bank's site and back), and return to the terminal.

You can also link new accounts directly from inside Claude/ChatGPT after the server is wired up — just say "link a new account" and follow the link it returns.


Choosing a provider

plaid-mcp speaks to two bank-data providers behind a shared adapter. Pick the one that matches what you want to analyze:

Plaid (default)

Teller

Environment variable

PROVIDER=plaid

PROVIDER=teller

Checking / savings / credit

Balances

Transactions (categorized)

✓ (cursor sync)

✓ (live date range)

Identity

Investment holdings + trades

Liabilities (APRs, due dates)

Student loans / mortgages

Income detection

Debt avalanche/snowball tools

✗ (needs APRs)

Free personal-use tier

10 linked items

100 live connections

Transparent per-call pricing

Contact sales

Published rate card

Generic tools (list_accounts, get_balances, get_transactions, search_transactions, get_identity) work on either provider. Plaid-only tools (everything else) return a clean capability error when PROVIDER=teller, so Teller users aren't left with confusing tracebacks.

You can freely switch by changing PROVIDER in your .env — each provider stores its enrollments independently (Plaid in SQLite, Teller in ~/.plaid-mcp/teller/enrollment.json), so nothing is lost.

Teller setup

# 1. Register at dashboard.teller.io (free), grab your Application ID
# 2. Download certificate.zip; move to ~/.plaid-mcp/teller/ (0600)
# 3. Add to .env:
PROVIDER=teller
TELLER_APPLICATION_ID=app_xxxxxxxxxxxxxxxxxxxxx
TELLER_ENV=sandbox                # sandbox needs no cert; dev/prod do
TELLER_CERT_PATH=~/.plaid-mcp/teller/certificate.pem
TELLER_KEY_PATH=~/.plaid-mcp/teller/private_key.pem

# 4. Link your first bank (either in your terminal or from the TUI)
plaid-mcp teller connect

# 5. Smoke-test
plaid-mcp teller probe

Sandbox credentials in Teller Connect: username / password against any bank. That returns a real sandbox access_token you can actually query.


Connecting it to an MCP client

Claude Desktop (local, stdio)

Edit ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows.

If you installed via pipx / uv tool / pip (recommended):

{
  "mcpServers": {
    "plaid": {
      "command": "plaid-mcp",
      "env": {
        "PLAID_CLIENT_ID": "<your client_id>",
        "PLAID_SECRET": "<your secret>",
        "PLAID_ENV": "production",
        "PLAID_PRODUCTS": "transactions",
        "PLAID_OPTIONAL_PRODUCTS": "investments,liabilities,identity"
      }
    }
  }
}

If plaid-mcp isn't found on Claude Desktop's PATH, use the absolute path that which plaid-mcp prints.

If you're running from a clone:

{
  "mcpServers": {
    "plaid": {
      "command": "uv",
      "args": [
        "--directory", "/absolute/path/to/plaid-mcp",
        "run", "python", "-m", "plaid_mcp"
      ],
      "env": {
        "PLAID_CLIENT_ID": "...",
        "PLAID_SECRET": "...",
        "PLAID_ENV": "production"
      }
    }
  }
}

Restart Claude Desktop. You should see "plaid" appear in the tools menu.

Claude.ai web or ChatGPT (remote, HTTPS)

Run in HTTP mode:

MCP_AUTH_TOKEN=$(python -c 'import secrets; print(secrets.token_urlsafe(32))') \
  uv run python -m plaid_mcp serve --host 0.0.0.0 --port 8080

Expose it with TLS (Caddy, Cloudflare Tunnel, ngrok). In Claude.ai or ChatGPT add it as a Custom Connector / MCP Connector and paste the bearer token. Never expose this server without TLS and MCP_AUTH_TOKEN set.

Other clients

Anything that speaks MCP will work. The server is built on FastMCP, which supports both stdio and HTTP transports.


Terminal UI

If you prefer browsing your accounts directly rather than asking an LLM, run:

plaid-mcp tui

Opens a Textual app with Accounts + Transactions screens, works with either provider, zero-friction navigation (q to quit, r to refresh, a/t to switch screens, c to link a new bank through Teller Connect without leaving the terminal).


Tool reference

All dates are ISO strings (YYYY-MM-DD). Amounts follow Plaid's convention: positive for outflows (spending), negative for inflows (deposits).

Account management

  • link_account() — Start a new Plaid Link session. Returns a hosted_link_url the user opens in their browser to authenticate with their bank.

  • complete_linking(link_token, timeout_seconds=180) — Finalize a Link session once the user has completed it in the browser.

  • list_linked_institutions() — Every institution currently linked, with account counts and any errors.

  • remove_institution(item_id) — Unlink an institution and purge its cached data.

Accounts & balances

  • list_accounts() — All accounts across all linked institutions, from the local cache. Fast.

  • get_balances(account_id=None) — Live balance lookup (hits Plaid, not the cache). Optionally filter to one account.

Transactions

  • sync_transactions(wait_for_ready=True, wait_timeout_seconds=60) — Pull the latest transactions into the local cache using Plaid's cursor-based /transactions/sync. Incremental and idempotent. On first call after linking, Plaid runs the historical pull asynchronously; this tool blocks briefly until HISTORICAL_UPDATE_COMPLETE.

  • refresh_transactions(item_id=None) — Ask Plaid to re-pull from the bank right now. Use when a user just made a purchase and wants to see it, or when data looks stale. Asynchronous — wait 30–60s then call sync_transactions. Some smaller banks don't support on-demand refresh.

  • get_transactions(start_date, end_date, account_id=?, category=?, merchant=?, min_amount=?, max_amount=?, limit=500) — Query the cache. Filter by any combination of the above.

  • search_transactions(query, start_date=?, end_date=?, limit=100) — Fuzzy search across transaction description + merchant name.

  • spending_summary(start_date, end_date, group_by="category") — Aggregate spending. group_by can be category, subcategory, merchant, or account.

Investments

  • get_holdings(account_id=None) — Current positions: tickers, quantities, market value, cost basis.

  • get_investment_transactions(start_date, end_date, account_id=None, limit=250) — Buys, sells, dividends, fees.

Liabilities

  • get_liabilities() — Credit cards (statement balance, minimum payment, due dates, APRs), student loans (balance, interest rate, payoff date, servicer), mortgages (principal, rate, maturity, next payment).

Identity & income

  • get_identity(account_id=None) — Account-holder names, emails, phones, addresses as reported by each institution.

  • get_income() — Bank-detected income streams. Requires Plaid's Income product enabled in your dashboard.

Debt analysis

Plaid's liabilities data covers the basics but misses things — notably promotional APRs on credit cards (0% intro offers, balance-transfer promos). This layer lets you annotate what Plaid missed and run honest payoff math.

Not financial advice. These tools do straightforward amortization math and rank debts by APR or balance — nothing more. For decisions that meaningfully affect your finances (debt consolidation, refinancing, tax implications of early payoff, etc.), talk to a CFP, CPA, or attorney. The outputs here are a starting point for a conversation with a professional, not a substitute for one.

  • set_account_override(account_id, effective_apr=?, promo_expires=?, note=?) — Record the true APR for a linked card. After promo_expires, analysis reverts to Plaid's reported purchase APR.

  • clear_account_override(account_id) — Remove an override.

  • list_overrides() — List all overrides.

  • add_external_debt(name, balance, apr, minimum_payment=0.0, next_payment_due_date=?, promo_expires=?, note=?) — Track a debt that isn't behind a linked Plaid account (BNPL, medical, 401(k) loans, small lenders). APR is a percentage (e.g. 18.5, not 0.185).

  • update_external_debt(debt_id, ...) — Partial update to any field.

  • remove_external_debt(debt_id)

  • list_external_debts()

  • summarize_debt(strategy="avalanche", extra_monthly_payment=0.0, today=?) — Merges Plaid credit cards + overrides + external debts, ranks them, and projects payoff:

    • avalanche (default) — highest effective APR first, minimizes interest paid.

    • snowball — lowest balance first, fastest sense of progress.

    • Returns total balance, monthly interest accrual at current rates, priority debt, amortized payoff timelines (minimum-only vs. with the extra payment), and warnings for promos expiring within 60 days. Flags debts whose minimum payment can't even cover monthly interest.


Example workflows

"Summarize my spending last month"

You: sync my transactions then show me top 10 merchants by spend in March 2026
LLM: [calls sync_transactions_tool, then spending_summary_tool with group_by=merchant]
     Top merchants in March 2026:
       Whole Foods            $412.80   (14 transactions)
       Amazon                 $287.43   (9 transactions)
       ...

"Which debt should I pay first?" — with a 0% promo

Plaid says your AA card is 26.49%, but it's actually on a 0% promo until 2027. By default, an LLM would tell you to attack the AA card first (because it sees 26.49%) — which is exactly wrong. Fix it:

You: my AA card is actually at 0% promo APR until 2027-01-01. set that override,
     then run an avalanche summary.

LLM: [set_account_override_tool(account_id="...", effective_apr=0.0,
                                promo_expires="2027-01-01")]
     [summarize_debt_tool(strategy="avalanche")]

     Priority: Costco Anywhere Visa, balance $1,204, effective APR 18.74%
     (was going to recommend the AA card at 26.49%, but you have a 0% override
      until 2027-01-01 — AA is now ranked last.)

     At minimum-only payments, the Costco card pays off in 78 months with
     $1,142 in interest. Add $200/mo and you're done in 7 months paying $96
     total — saves you ~$1,046 in interest.

"Track a BNPL I opened outside the linked banks"

You: I just took out a $1,500 Affirm loan for a mattress, 0% APR for 12 months,
     $125/mo minimum. Add it.

LLM: [add_external_debt_tool(name="Affirm Mattress", balance=1500, apr=0,
                             minimum_payment=125, promo_expires=<in 12mo>)]

     Added (ext_a1b2c3d4e5f6). Included in summarize_debt going forward.
You: are any of my linked accounts broken?
LLM: [calls list_linked_institutions_tool]
     Chase — 5 accounts, last sync 3h ago, no errors.
     Citi — 4 accounts, last_error: "ITEM_LOGIN_REQUIRED" (your password likely
            changed; re-link via `link a new account`).

"I just made a purchase and want to see it"

You: I just paid at Whole Foods 10 minutes ago, refresh and show it.
LLM: [refresh_transactions_tool()]
     [waits ~45 seconds]
     [sync_transactions_tool()]
     [search_transactions_tool(query="whole foods", start_date=<today>)]
     Found it: $84.12 at WHOLE FOODS MARKET today.

How linking works under the hood

This server uses Plaid's Hosted Link flow so you never need to embed a web widget. The tool sequence an LLM follows to add a bank:

  1. link_account — creates a link_token with a hosted_link object, returns the hosted_link_url and the raw link_token.

  2. User opens that URL in a browser, completes the OAuth flow with their bank.

  3. complete_linking(link_token) — polls /link/token/get until it sees a public_token in link_sessions[].results.item_add_results[], exchanges it for a permanent access_token, and caches the account list.

Per Plaid's docs, webhooks (SESSION_FINISHED event) are the recommended production mechanism for retrieving the public_token. This server uses polling instead because it requires no public endpoint — fine for personal CLI / stdio use. If you deploy remotely and want webhook-driven completion, set PLAID_WEBHOOK_URL in .env and add a webhook handler (not included yet — PRs welcome).


Paid hosted mode

plaid-mcp ships three payment rails; operators pick one via PAYWALL=<rail>. Tool discovery (tools/list, initialize) stays free across all of them — only tools/call is metered.

The Machine Payments Protocol via pympp. Use this if you want either:

  • Pure crypto — USDC on Tempo L2, no Stripe account required, wallet-to-wallet.

  • Traditional cards — any Stripe-supported method (requires a Stripe account).

  • Both, advertised in the same 402 — clients pick based on what they have.

uv sync --extra mpp
# or: pip install 'plaid-mcp[mpp]'
PAYWALL=mpp
MPP_METHODS=tempo,stripe                 # tempo | stripe | tempo,stripe

# Tempo rail (only needed when 'tempo' is in MPP_METHODS):
MPP_DESTINATION_ADDRESS=0x...            # Your Tempo wallet that receives USDC
MPP_NETWORK=tempo-testnet                # tempo-testnet | tempo-mainnet
# MPP_ALLOW_MAINNET=1                    # required to accept real USDC on Tempo

# Stripe rail (only needed when 'stripe' is in MPP_METHODS):
STRIPE_SECRET_KEY=sk_live_...            # your Stripe API secret
STRIPE_CURRENCY=usd
# STRIPE_PAYMENT_METHOD_TYPES=card,apple_pay

How the 402 works: on an unpaid tools/call, the server returns 402 Payment Required with one WWW-Authenticate: Payment ... header per configured method. A well-behaved MPP client picks the method it can satisfy (Tempo if it has a USDC wallet, Stripe if it has a card), signs a credential, and replays with Authorization: Payment <credential>. The server routes the incoming credential back to the matching rail based on the challenge method field. On success, a Payment-Receipt header carries the settlement receipt.

x402 (alternative) — Coinbase CDP or x402.org facilitator

Trustless HTTP 402 on Base. Use this for agents speaking Coinbase Agentic Wallets, CDP Agent Kit, or Cloudflare Agents — those clients have mature x402 support today. Base mainnet needs Coinbase CDP facilitator auth; Base Sepolia works against x402.org's hosted facilitator out of the box.

uv sync --extra cdp                      # only required for Base mainnet
PAYWALL=x402
X402_RECEIVING_ADDRESS=0x...             # Base address that receives USDC
X402_NETWORK=base-sepolia                # base-sepolia (testnet) | base (mainnet)
# X402_ALLOW_MAINNET=1                   # required to actually open mainnet
# X402_FACILITATOR_URL=                  # optional (defaults to https://x402.org/facilitator)

None (default)

PAYWALL=none

No paywall. Suitable for personal stdio use via Claude Desktop and for self-hosted HTTP deployments where you gate access with MCP_AUTH_TOKEN instead.

Client-side support

  • MPP clients — pympp ships with a Python client; Stripe-side, any SDK that can create a PaymentIntent with the challenge amount and return the confirmation token works.

  • Claude Desktop / Claude Code / Cursor (x402) — install Coinbase's x402 MCP bridge alongside plaid-mcp. The bridge holds the Base wallet and does the signing; plaid-mcp stays crypto-naive.

  • OpenAI Agents SDK / LangChain (x402)pip install "x402[httpx]", wrap the tool's HTTP client with the x402 client middleware.

  • CDP Agent Kit (x402) — native x402 actions; nothing extra to install.

  • ChatGPT Custom Connectors — no wallet primitive today; use an API-key fallback if you need this audience (not implemented yet).

Default prices

Default prices live in src/plaid_mcp/payments/prices.py (10¢ for most tools, 50¢ for summarize_debt_tool). Override per-tool by forking or by building your own PriceTable if you embed this as a library. The price table is shared across all rails — an MPP-tempo caller and an x402-Base caller pay the same cents for the same tool.

Verified end-to-end

Live facilitator round-trips ship under pytest markers. Set the relevant private key env var and run:

# x402 on Base Sepolia (needs ~cent of testnet USDC)
X402_TESTNET_PRIVATE_KEY=0x...                                     \
X402_RECEIVING_ADDRESS=0x<your-wallet-or-throwaway>                \
  uv run pytest -v -m x402_testnet

# MPP on Tempo testnet (xfail today; see test docstring)
MPP_TESTNET_PRIVATE_KEY=0x... uv run pytest -v -m mpp_testnet

Get x402 testnet USDC from Circle's faucet (pick Base Sepolia).


Deploying with Docker / Fly.io

A reference Dockerfile, docker-compose.yml, and Fly.io config live at the repo root + deploy/. See deploy/README.md for the step-by-step.

# Local hosted-mode smoke test
docker compose up --build

# Fly.io one-shot
fly apps create plaid-mcp
fly volumes create plaid_mcp_data --region iad --size 1
fly secrets set $(grep -v '^#' .env | xargs)
fly deploy --config deploy/fly.toml

The container runs plaid-mcp serve --host 0.0.0.0 --port 8080 as a non-root user, persists ~/.plaid-mcp/ on a named volume, and survives restarts with all Plaid items + Teller enrollment intact. Fly terminates TLS at the edge; self-hosting behind Caddy/Traefik/nginx works the same way.


Security notes

  • Access tokens are stored in SQLite at PLAID_MCP_DB (default ~/.plaid-mcp/plaid.db). On macOS and Linux the file is chmod'd to 0600.

  • Read-only, by design. There are no tools that move money, create transfers, or modify anything upstream. Plaid's /transfer/* endpoints are not exposed. The worst a prompt-injected LLM can do is read your data — not move it.

  • If you run it remotely, put it behind TLS and set MCP_AUTH_TOKEN to a random string. Never expose it over plain HTTP or without auth.

  • If you deploy this for anyone other than yourself, you need to complete Plaid's Production Enablement review first. The Production trial tier covers personal use; hosting a multi-user instance on your client_id without review violates Plaid's terms. Every user running their own copy with their own Plaid credentials is fine — that's the intended open-source usage.

  • Plaid's terms prohibit storing bank credentials — and this server never sees them. Plaid Link handles credentials directly with the institution; this server only gets a per-user access token.

  • The LLM sees your financial data while it's answering questions. Choose a provider you trust, and consider running against the Sandbox environment first to get a feel for what flows through context.


Troubleshooting

INVALID_PRODUCT: Your account is not enabled for <product>

You requested a product in PLAID_PRODUCTS that your Plaid dashboard isn't approved for. Go to Team Settings → Products, request access, and wait for approval. Or drop the product from PLAID_PRODUCTS (and put it in PLAID_OPTIONAL_PRODUCTS instead if you still want it when available).

"No investment accounts" when linking a non-brokerage bank (e.g. Citi)

You had investments in PLAID_PRODUCTS, which makes Plaid reject banks without brokerage. Move investments from PLAID_PRODUCTS to PLAID_OPTIONAL_PRODUCTS and re-link.

sync_transactions returns 0 transactions right after linking

Plaid's historical pull is async. The server blocks up to 60s for HISTORICAL_UPDATE_COMPLETE — but some banks (notoriously Citi) can take hours to backfill. Check list_linked_institutions for last_error. If there's no error, just wait and try again; the status field in the sync response tells you what Plaid is up to.

refresh_transactions returns PRODUCT_NOT_READY

Some smaller institutions don't support on-demand refresh. Plaid will still refresh them on its normal schedule (every few hours). This is an institution limitation, not a bug in the server.

Tokens got lost / I want to start over

Remove the SQLite DB: rm ~/.plaid-mcp/plaid.db. All your cached transactions and tokens go with it. You'll need to re-link every institution.

The LLM hallucinates numbers

Ask it to call the tools explicitly: "call sync_transactions_tool, then call spending_summary_tool with...". Also: instruct the LLM to always cite the tool output it's reasoning from. Model choice matters; the default instructions in the MCP server nudge toward tool use.

Claude Desktop doesn't see the tools

Confirm uv is on your PATH (which uv). Claude Desktop's launchd-style environment often doesn't inherit your shell PATH. You may need the absolute path (e.g. "command": "/Users/you/.cargo/bin/uv"). Restart Claude Desktop after config changes.


Development

uv sync --extra dev          # or: pip install -e ".[dev]"
ruff check .
pytest                       # unit + MCP smoke tests (no credentials needed)
pytest -m sandbox            # end-to-end tests against Plaid Sandbox

Sandbox tests read credentials from .env.test at the repo root (git-ignored). Create it when you want to run them:

PLAID_CLIENT_ID=your_sandbox_client_id
PLAID_SECRET=your_sandbox_secret

Sandbox tests use /sandbox/public_token/create to skip Plaid Link entirely, so no browser needed.

CI (GitHub Actions) runs on every push:

  • Unit + MCP smoke tests on Python 3.10 / 3.11 / 3.12.

  • Sandbox integration tests, if PLAID_CLIENT_ID_SANDBOX and PLAID_SECRET_SANDBOX are set as repository secrets.

Contributions

Welcome — particularly:

  • Additional Plaid product coverage (Assets, Statements, Signal).

  • Webhook handling for real-time transaction sync.

  • Export tools (write summaries to CSV / Markdown / Google Sheets).

  • Better LLM prompting for the debt workflows.

Please keep all tools read-only. No PR that introduces write endpoints (transfers, bill pay, account modification) will be merged.

License

MIT. See LICENSE.

Available Tools

24 tools
add_external_debt_toolC

Track a debt that isn't behind a linked Plaid account.

Plaid-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
aprYes
nameYes
noteNo
balanceYes
promo_expiresNo
minimum_paymentNo
next_payment_due_dateNo

TDQS

C2.1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description gives no information about side effects, data modifications, authentication requirements, or whether this is a create operation. With no annotations, the description alone fails to disclose any behavioral implications of invoking this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise but overly sparse—two short sentences without structured details. It conveys minimal information and does not organize any usage context or parameter hints, failing to be usefully structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with seven parameters and three required fields, this description is severely incomplete. It lacks parameter explanations, usage scenarios, and any relationship to other tools, leaving the agent without sufficient context to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description does not explain any of the seven parameters (name, balance, apr, etc.). The schema lacks descriptions, so the agent has no guidance on what each parameter means or how to fill them correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states that the tool tracks a debt not linked to a Plaid account, and the tool name 'add_external_debt_tool' clarifies it is for adding external debts. However, the phrasing 'isn't behind a linked Plaid account' is slightly awkward and could be clearer, preventing a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for non-Plaid debts but does not explicitly distinguish from sibling tools like 'link_account' or 'get_liabilities_tool'. No conditions, prerequisites, or when-not-to-use guidance is provided, leaving the agent to infer when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_account_override_toolA

Remove any APR override for an account.

Plaid-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of explaining behavioral impact. It states the removal action but does not mention whether the operation is irreversible, requires special permissions, or affects account data beyond the APR override.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, containing only two short sentences with no redundant information. The core action and a platform qualifier are presented efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter mutating tool with no output schema, the description covers the essential purpose and platform scope. It lacks behavioral detail, but the overall context is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only provides 'account_id' as a required string with no description. The description ties the parameter loosely to 'an account' but does not clarify the expected ID format, scope, or whether it refers to a Plaid account ID.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Remove any APR override') and the target ('for an account'), distinguishing it from related tools like set_account_override_tool and list_overrides_tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Plaid-only' note provides a platform restriction, but there is no explicit guidance on when to use this tool versus setting or listing overrides. Usage must be inferred from the tool name and sibling context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

complete_linkingA

Finalize a Link session once the user has completed it in their browser. Exchanges the public_token for a permanent access_token and caches accounts.

Plaid-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
link_tokenYes
timeout_secondsNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It reveals the token exchange and account caching side effects, which is useful, but it does not explain idempotency, failure behavior, or what 'caches accounts' means operationally.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the primary action, then the mechanism, then the scope qualifier. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no annotations, no output schema, and zero schema description coverage. The description conveys the core action but omits parameter semantics, expected response, and operational caveats, leaving an agent without enough detail to invoke it confidently in edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain link_token or timeout_seconds. link_token is inferable from context, but timeout_seconds is entirely unexplained, and the description mentions public_token rather than the actual parameter name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool finalizes a Link session, exchanges public_token for access_token, and caches accounts. It uses a specific verb and resource, and is distinguishable from siblings like link_account which starts the flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use this once the user has completed Link in their browser, giving clear timing context. It does not name alternatives or exclusions, but the intended point in the flow is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_balances_toolB

Live balance lookup. Filter by account_id if given.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. 'Lookup' implies a read-only operation, but the description does not explicitly state that there are no side effects, permissions required, or other behavioral traits. It is not misleading, but lacks explicit transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no redundant information. It uses clear, direct language and is efficiently structured for quick comprehension.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional parameter) and the presence of an output schema (not shown but indicated as true), the description is largely sufficient. It covers the core purpose and the only parameter. It does not mention edge cases or result format, but that falls under the output schema's responsibility.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning to the sole parameter `account_id` by explaining it is a filter and optional ('if given'). This is beyond the schema's type and default, compensating for the 0% schema description coverage. It does not elaborate on the semantics of the account_id value itself, but that is inferable from the domain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Live balance lookup' clearly states the tool's function (retrieve balances) and the optional filter by account_id. It is distinguishable from sibling tools like get_liabilities_tool or get_holdings_tool, though 'lookup' is slightly less explicit than 'get' or 'retrieve'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides minimal guidance on when to use this tool versus alternatives. It mentions 'Live' implying real-time data, but does not explicitly contrast with other balance-related tools or state conditions for selection. No usage scenarios are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_holdings_toolA

Current investment positions (tickers, quantities, market value, cost basis).

Plaid-only — Teller has no INVESTMENTS capability.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses that this is a Plaid-only read of current positions and lists return contents, but it does not explain optional account_id behavior, whether data is cached, or any authentication/linking requirements beyond the Plaid constraint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states what the tool returns, and the second gives the critical provider limitation. No words are wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for selecting the tool and understanding its return fields, but it is incomplete for correct invocation because it does not explain the optional account_id parameter or the effect of passing null. Since there is no output schema, a bit more detail on filtering behavior would be valuable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not mention account_id at all. The parameter name is somewhat self-explanatory, but the description fails to clarify whether omitting it returns all holdings or requires an account, so the agent lacks important invocation semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as current investment positions and lists the key fields returned (tickers, quantities, market value, cost basis). It does not explicitly distinguish itself from siblings like get_investment_transactions_tool, but 'positions' vs 'transactions' is reasonably clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit provider guidance: 'Plaid-only — Teller has no INVESTMENTS capability.' This tells the agent when the tool is applicable and when it is not, though it does not name alternative sibling tools for investment transactions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_identity_toolC

Account holder names, emails, phones, addresses as reported by the institution.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, so the description must carry the full burden of behavioral disclosure. It conveys only a static list of data fields and the phrase 'as reported by the institution'—this hints at provenance but says nothing about whether the operation is purely read-only, the impact of omitting account_id, failure conditions, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and free of filler, but it is a noun phrase fragment rather than a structured sentence. It lacks an ordering that leads the agent through what the tool returns and any conditions, so the brevity is more under-specification than efficient concision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There are no annotations, no output schema, and one optional parameter, so the description carries nearly all context. It fails to explain the output structure, what happens when account_id is null, and how this tool fits with sibling tools like list_linked_institutions or list_accounts. An agent would be uncertain about return shapes and parameter behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one parameter, account_id, with 0% coverage in the description. The description does not explain what account_id does—whether it filters to a single account, is required for any specific institution, or can be null to get all accounts. The tool description provides no compensation for the missing parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource and specific data fields (names, emails, phones, addresses) without ambiguously matching sibling tools. It lacks an explicit verb, but the subject matter clearly indicates a retrieval operation for account-holder identity data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to call this tool versus siblings like list_accounts_tool or get_income_tool, nor any mention of prerequisites such as a linked institution or authorization. An agent cannot tell the intended conditions for using this tool from the description alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_income_toolA

Bank-detected income streams. Requires Income product enabled in your Plaid dashboard.

Plaid-only — Teller has no INCOME capability.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden. It adds meaningful context about the Plaid-only restriction and the product requirement, which are important behavioral constraints. However, it does not mention error behavior, return structure, or what happens if the product is not enabled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at two short sentences, with the core purpose front-loaded and the prerequisite/limitation stated immediately after. Every sentence earns its place with no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, zero parameters, and absence of an output schema, the description is mostly complete for selection and invocation. It provides the key prerequisites and platform limitation, though it could have briefly stated that the return value is a list of income streams.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the empty schema fully documents the calling contract. The description adds no parameter information, but none is needed; the baseline for a no-parameter tool is appropriate here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as 'bank-detected income streams' and the tool name supplies the 'get' verb, making the purpose unambiguous. It also distinguishes itself from sibling tools by domain, though it does not explicitly compare against them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states the prerequisite of the Income product being enabled and explicitly restricts the tool to Plaid, noting Teller lacks INCOME capability. This gives clear context for when the tool is usable, though it does not discuss when to prefer it over alternative data sources.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_investment_transactions_toolC

Brokerage transactions: buys, sells, dividends, fees.

Plaid-only — Teller has no INVESTMENTS capability.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
end_dateYes
account_idNo
start_dateYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden, but it does not disclose side effects, read-only guarantees, pagination, data freshness, or error behavior. The short phrase only describes the content category, not how the tool behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and front-loads the core purpose and the key platform constraint. It avoids fluff, though the first line is a sentence fragment rather than a complete verb phrase.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description lacks essential invocation context: no return shape, no date-format guidance, no account-scoping semantics, and no explanation of how this differs operationally from sibling transaction tools. The Plaid-only note is useful but insufficient for reliable use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no parameter descriptions and the description adds no meaning to start_date, end_date, account_id, or limit. It does not mention date formats, whether account_id is required for certain providers, or how limit is applied, leaving the agent to guess.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource as brokerage transactions and enumerates the relevant transaction kinds (buys, sells, dividends, fees). It also distinguishes this tool from generic transaction tools by the investment focus and the Plaid-only constraint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states a concrete platform limitation: Plaid-only, and that Teller has no INVESTMENTS capability. However, it does not explicitly direct the agent to prefer this tool over get_transactions_tool or search_transactions_tool for investment-related calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_liabilities_toolA

Credit cards, student loans, mortgages with APRs, balances, due dates.

Plaid-only — Teller has no LIABILITIES capability.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral disclosure burden. It does reveal a meaningful platform limitation (Plaid-only, Teller unsupported), but it does not mention side effects, failure behavior for unsupported connections, or whether a linked account is required.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tight sentences with no filler. The core content is front-loaded, and the platform constraint is stated efficiently in the second sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read tool, the description is mostly complete: it names the data returned and the key platform limitation. The main gap is that, with no output schema and no annotations, an agent must infer the exact return shape and error behavior for unsupported providers.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema already covers this completely, so there is nothing for the description to add about inputs. The description appropriately focuses on what data will be returned.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource as liabilities and enumerates the included data (APRs, balances, due dates), which pairs clearly with the 'get' verb in the tool name. It is distinct from sibling tools like get_balances_tool or get_holdings_tool, though it does not explicitly state an action such as 'Retrieves...'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance or named alternative. The 'Plaid-only — Teller has no LIABILITIES capability' note implies a constraint, but it does not tell an agent when to prefer this tool over related siblings like list_accounts_tool, get_balances_tool, or summarize_debt_tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_transactions_toolA

Query transactions between two dates. Dates are YYYY-MM-DD.

Plaid: reads from the local cache — run sync_transactions first. Teller: fetches live from Teller's API for the date range. Positive amounts = spend.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
categoryNo
end_dateYes
merchantNo
account_idNo
max_amountNo
min_amountNo
start_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and covers meaningful traits: data source (local cache vs live API), a required prerequisite for Plaid, and the sign convention 'Positive amounts = spend.' It does not describe pagination or output ordering, but the output schema exists to cover return structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences with no filler: the main action is front-loaded, then provider behavior, prerequisite, and sign convention each earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and the required parameters are simple, the description is reasonably complete: it covers date format, provider-specific data freshness, and the sync prerequisite. It could be more complete by naming search_transactions_tool as the alternative for advanced filtering, but this is not a blocking gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description only compensates for the date format and amount sign interpretation. The remaining optional filters (limit, category, merchant, account_id) are left to their self-explanatory names and schema defaults, so the compensation is partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Query transactions between two dates,' and specifies the date format. It is clear, though it does not explicitly distinguish itself from sibling search_transactions_tool or spending_summary_tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives provider-specific usage context: for Plaid, 'run sync_transactions first' because it reads the local cache, while Teller fetches live. However, it never states when to choose this tool over sibling alternatives or mentions exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_accounts_toolA

List every account across every linked institution.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the burden of conveying behavior. 'List every account across every linked institution' transparently signals a global, unfiltered read operation, but it does not disclose details like pagination, performance, or authentication side effects. The output schema covers return shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tight sentence with no filler. The action and scope are front-loaded, and every word contributes to the meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool with an output schema, the description is nearly complete: it names the resource and the full scope. It does not explicitly call out sibling distinctions or read-only behavior, but those are largely inferable from 'list' and 'every account'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the input schema is empty, so there is nothing for the description to explain. The baseline for zero-parameter tools is 4, and the description appropriately avoids inventing parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List'), a precise resource ('every account'), and a clear scope ('across every linked institution'). This clearly differentiates it from siblings like list_linked_institutions_tool, which lists institutions rather than accounts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the main use case: retrieving the complete set of accounts across all linked institutions. However, it does not explicitly mention alternatives or say when not to use this tool, such as when only balances or institutions are needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_external_debts_toolB

List every external (non-Plaid-linked) debt the user has recorded.

Plaid-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are present, the description carries full responsibility for disclosing side effects. While 'List' implies a read-only operation, the description does not explicitly state that no data is modified, nor does it mention any potential changes to state or data. This lack of explicit transparency lowers the score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise and to the point: a single clear sentence followed by a short note. It avoids unnecessary details and is well-structured for quick understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential function and scope, and given the absence of parameters and output schema, it is nearly complete. However, the 'Plaid-only' note is unexplained and could leave the agent uncertain about platform constraints, slightly reducing completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is 100% (vacuously). The description has no need to explain parameters. Per the rubric, with high schema coverage, the baseline score is 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('List') and a precise resource ('external (non-Plaid-linked) debt'). The qualifier 'external (non-Plaid-linked)' effectively distinguishes it from sibling tools like get_liabilities_tool or summarize_debt_tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides the core function but offers no explicit guidance on when to choose this tool over alternatives. The 'Plaid-only' note is ambiguous and could be interpreted as a restriction, but it is not explained as a usage condition. No alternative actions or decision heuristics are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_linked_institutions_toolA

List every institution currently linked, with account counts and any errors.

Plaid-only — reads the local SQLite items table, which Teller doesn't use.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It explicitly says 'reads', indicating a read-only operation with no side effects, and describes the data source (local SQLite items table). It does not mention side effects or costs, but for a read tool this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: one for purpose and one for context. There is no redundancy or extraneous detail, making it appropriately concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides enough context for usage: what it does, the data source, and the Plaid scope. The output schema is present (not shown but indicated), so details about return values are covered there. It could mention what constitutes an 'institution' but that is not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters (properties empty), so there is nothing to describe. The description accurately reflects that it lists all institutions without filters, making parameter explanations unnecessary.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and the resource 'every institution currently linked', with account counts and errors. It also distinguishes itself by noting it is Plaid-only, which sets it apart from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear 'when to use' by stating it is Plaid-only and reads the local SQLite items table, implying it is appropriate for Plaid-linked institutions. It does not explicitly name alternatives but the scope is understood from the Plaid-versus-Teller context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_overrides_toolA

List every account APR override the user has recorded.

Plaid-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description implies a read-only operation by using 'List', but it does not explicitly state that no data is modified, nor does it mention permissions or side effects. Since there are no annotations, the description carries the burden, and the implication is not fully disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise and free of fluff. It conveys the exact purpose and a scope constraint ('Plaid-only') in two short sentences, with no redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool, the description is complete. It identifies what is listed (account APR overrides) and the context (user-recorded, Plaid-only). No output schema exists, so no return format explanation is required. It provides enough context for the agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters, the baseline is 4. The description adds meaning about the subject (account APR overrides), but since there are no parameters to explain, it does not go beyond the baseline in terms of parameter-specific semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool lists account APR overrides, distinguishing it from sibling tools like set_account_override_tool or clear_account_override_tool. The verb 'List' and resource 'account APR override' are explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Does not provide explicit guidance on when to use this tool versus alternatives. It mentions 'Plaid-only' as a scope constraint but does not explain scenarios for using it (e.g., before setting an override). No comparison to other list tools is offered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

refresh_transactions_toolC

Nudge Plaid to pull fresh transactions from the bank right now.

Plaid-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations. The description hints at an action but does not disclose whether the refresh is synchronous, modifies stored data, has rate limits, or how failures are surfaced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler or redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even for a simple schema, the description omits item_id semantics, return/acknowledgment behavior, async vs sync execution, and error cases, so an agent cannot call it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, item_id, has no description in the schema or the tool description. Its optionality and default null are unexplained, leaving meaning entirely ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the action (pull fresh transactions) and the context (Plaid, bank, immediate). Differentiates from get/search tools via the refresh intent, though 'nudge' is informal and 'Plaid-only' is vague.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Only constraint is 'Plaid-only'. No explicit guidance on when to use this tool versus siblings like sync_transactions_tool, or when refresh is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_external_debt_toolB

Delete an external debt entry.

Plaid-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
debt_idYes

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description implies a destructive operation but does not disclose side effects, irreversibility, or any required permissions. With no annotations, the description carries the burden and only partially addresses it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with no redundant words. The action and resource are front-loaded, and the extra 'Plaid-only' note is brief but potentially useful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple deletion tool, the description is minimally sufficient, but it omits any mention of return values, success/failure behavior, or edge cases. It is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The parameter 'debt_id' has no schema description and the tool description does not explain its format, origin, or how to obtain it. Schema coverage is 0%, and the description does not compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Delete') and the resource ('an external debt entry'), distinguishing it from sibling tools like add, update, list, and summarize debt. The purpose is immediately obvious.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, such as update_external_debt_tool or clear_account_override_tool. The 'Plaid-only' note is a constraint but not a usage condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_institution_toolA

Unlink an institution (Plaid item) and delete its local data.

Plaid-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It explicitly states that local data is deleted, which is an important destructive side effect beyond simply 'unlinking.' It does not mention reversibility or permissions, but the main risk is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the primary action, and adds the important destructive detail in the same sentence. The standalone 'Plaid-only.' line is minimal but useful context with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter destructive tool, the description conveys the core action and side effect. However, it omits any explanation of item_id provenance or expected format, and offers no guidance on what happens after unlinking or what response to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, and the description does not explicitly explain the item_id parameter. However, the description's mention of 'Plaid item' and the parameter name 'item_id' make it reasonably inferable that item_id identifies the institution to unlink.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Unlink') and resource ('institution (Plaid item)'), and adds a concrete consequence ('delete its local data'). This clearly identifies what the tool does and distinguishes it from sibling tools like link_account or remove_external_debt_tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Plaid-only' provides a constraint on when the tool applies, and the action itself implies it is for unlinking a linked institution. However, there is no explicit guidance about when not to use it or which alternative to choose, such as remove_external_debt_tool for non-Plaid debts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_transactions_toolC

Fuzzy search across transaction description and merchant name.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
end_dateNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations to communicate side effects, read-only behavior, or access requirements. The description merely states what the search does and does not disclose whether it mutates data, requires authentication, or has rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence with no redundant information. It states the core functionality clearly and efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the four parameters, the description leaves out important context such as how date filtering works, what the limit controls, and what the result set contains. It is minimal but not sufficient for an agent to fully understand the tool's behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no descriptions for the parameters, and the tool description does not explain the meaning of query, limit, start_date, or end_date. Since schema coverage is 0%, the description must compensate, but it entirely fails to do so.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action (fuzzy search) and the resource (transactions), narrowing the scope to description and merchant name. It does not explicitly differentiate itself from sibling tools like get_transactions_tool, but the 'fuzzy search' wording provides enough distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is given for when to use this tool versus alternatives such as get_transactions_tool. The use case is only implied by the phrase 'fuzzy search,' which is not enough to guide an agent effectively.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_account_override_toolB

Annotate a linked card with the real APR when Plaid misses it.

Plaid-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNo
account_idYes
effective_aprNo
promo_expiresNo

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description only states intent; it does not disclose whether existing overrides are replaced, how nullable fields behave, persistence, or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler; the key purpose and restriction are front-loaded and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Missing parameter meanings, output/return behavior, side effects, and relationship to clear/list override tools; only the 'Plaid-only' context is provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description only hints at effective_apr; account_id, note, and promo_expires semantics are not explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States it annotates a linked card with the real APR when Plaid misses it; specific and distinguishes from clear/list overrides, though 'annotate' is less precise than 'set/override'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a condition ('when Plaid misses it') and a 'Plaid-only' restriction, but does not explicitly contrast with clear_account_override_tool/list_overrides_tool or say when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

spending_summary_toolB

Aggregate spending by category | subcategory | merchant | account.

Plaid-only: reads the Plaid-shaped cache populated by sync_transactions.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateYes
group_byNocategory
start_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description indicates the tool is read-only ('reads the Plaid-shaped cache') and depends on prior syncing, but it does not disclose error behavior, data freshness, or whether it returns aggregated results directly or requires post-processing. This is partial transparency, not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using two short sentences that quickly convey the core function and data source. The pipe-separated grouping options are a compact way to list alternatives, though slightly informal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 3 parameters and an output schema, the description is incomplete: it does not explain parameter constraints, output structure, or how this tool relates to sibling tools like sync_transactions_tool. The mention of 'Plaid-only' and cache adds some context, but not enough for a new agent to use it effectively without additional investigation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero description coverage for the three parameters (start_date, end_date, group_by). The description does not explain date formats, allowed group_by values, or how the default 'category' is applied, leaving critical usage details undefined.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool aggregates spending with flexible grouping ('by category | subcategory | merchant | account'), which is a specific and unambiguous purpose. The verb 'aggregate' and the listed dimensions precisely convey what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives like search_transactions_tool or get_transactions_tool. It only mentions that it reads a cache populated by sync_transactions, which hints at a prerequisite but does not clarify selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_debt_toolB

Rank every debt and project payoff timelines.

Plaid-only — merges Plaid liabilities with local overrides + external debts.

ParametersJSON Schema
NameRequiredDescriptionDefault
todayNo
strategyNoavalanche
extra_monthly_paymentNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry behavioral disclosure. It does say the tool merges three data sources and ranks/projects, which is useful. But it does not explicitly confirm read-only behavior, error conditions, or what happens when no Plaid data is linked; a summary tool implies no mutation but leaves that implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler; the main action is front-loaded and the data-scope sentence earns its place. This is appropriately concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with three meaningful parameters, no output schema, and no annotations, the description is too thin. It omits parameter semantics, expected output shape, and failure modes such as a missing Plaid connection. It works as a high-level summary but not as a complete call specification.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description names none of the three parameters (today, strategy, extra_monthly_payment). The only indirect hint is 'project payoff timelines,' which does not explain the strategy default, how extra_monthly_payment changes results, or the role of today. This is a major gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+object ('Rank every debt') and explains it projects payoff timelines, which distinguishes it from raw retrieval siblings like get_liabilities_tool and list_external_debts_tool. It doesn't explicitly name those siblings, so it misses the top score, but the purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context: use this when a consolidated, ranked debt picture with payoff projections is needed, and the 'Plaid-only' note plus mention of overrides/external debts clarifies scope. It does not explicitly state when not to use it or name alternatives, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sync_transactions_toolA

Pull the latest transactions from Plaid into the local cache. Idempotent and incremental — uses cursors from the last sync.

Plaid-only: Teller has no cursor-based sync; get_transactions_tool fetches Teller transactions live by date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
wait_for_readyNo
wait_timeout_secondsNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose useful behavioral traits: idempotent, incremental, cursor-based, and cache-writing. However, it does not explain side effects on the local cache, return behavior, error handling, or the effect of wait_for_ready/wait_timeout_seconds.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences are front-loaded with purpose, then behavior, then usage routing. No filler or redundant restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a sync tool with two optional parameters and no output schema, the description covers selection and invocation basics but omits return values, failure modes, and wait-parameter semantics. It is adequate, not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage and the description never mentions wait_for_ready or wait_timeout_seconds. The names and defaults hint at waiting behavior, but an agent cannot understand what 'ready' means or how the timeout is applied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Pull the latest transactions from Plaid into the local cache.' It clearly identifies the source (Plaid) and differentiates from the sibling get_transactions_tool by stating 'Plaid-only' and contrasting Teller behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: use this for Plaid cursor-based sync, and explicitly names get_transactions_tool as the alternative for Teller live date-range fetches. The idempotent/incremental note also tells agents this tool is safe to reuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_external_debt_toolA

Update any subset of fields on an existing external debt.

Plaid-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
aprNo
nameNo
noteNo
balanceNo
debt_idYes
promo_expiresNo
minimum_paymentNo
next_payment_due_dateNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose that only a subset of fields is updated and that the debt already exists, which is useful. But it does not explain what happens when a field is omitted versus set to null, whether changes are reversible, or what occurs if the debt_id does not match an existing debt.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise and front-loaded. The first sentence states the action and scope, and the second adds a relevant constraint. There is no filler or redundant restating of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with eight parameters, no annotations, and no output schema, the description is too sparse. It does not explain required parameters, null-vs-omit semantics, return values, or error behavior, leaving significant gaps for an agent trying to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not compensate. It does not mention debt_id as the required identifier or clarify that null values likely mean 'clear the field' rather than 'leave unchanged.' With eight parameters and no descriptions, an agent is left to infer the meaning and update semantics from names and types alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the operation as updating an existing external debt and emphasizes partial updates ('any subset of fields'), which distinguishes it from sibling tools like add_external_debt_tool, remove_external_debt_tool, and list_external_debts_tool. The resource and action are both specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: update an existing external debt, and the 'Plaid-only' note provides a useful eligibility constraint. However, it does not explicitly say when not to use it or mention alternatives such as add_external_debt_tool for creating debts or remove_external_debt_tool for deleting them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 24 tool updatesv0.1.0
    • First observedadd_external_debt_tool
    • First observedclear_account_override_tool
    • First observedcomplete_linking
    • First observedget_balances_tool
    • First observedget_holdings_tool
    • First observedget_identity_tool
    • First observedget_income_tool
    • First observedget_investment_transactions_tool
    • First observedget_liabilities_tool
    • First observedget_transactions_tool
    • First observedlink_account
    • First observedlist_accounts_tool
    • First observedlist_external_debts_tool
    • First observedlist_linked_institutions_tool
    • First observedlist_overrides_tool
    • First observedrefresh_transactions_tool
    • First observedremove_external_debt_tool
    • First observedremove_institution_tool
    • First observedsearch_transactions_tool
    • First observedset_account_override_tool
    • First observedspending_summary_tool
    • First observedsummarize_debt_tool
    • First observedsync_transactions_tool
    • First observedupdate_external_debt_tool

TDQS

B3.1/5.0
Disambiguation4/5

Most tools target distinct resources and actions, such as accounts, balances, transactions, liabilities, holdings, and external debts. A few near-overlaps exist—get_liabilities_tool vs summarize_debt_tool and sync_transactions_tool vs refresh_transactions_tool—but the descriptions clarify the intended use.

Naming Consistency3/5

Tool names mostly follow a snake_case verb_noun_tool pattern, but link_account and complete_linking lack the _tool suffix, and spending_summary_tool is a noun phrase rather than a verb_noun construction. The pattern is mixed but still readable.

Tool Count3/5

With 24 tools, the surface is at the high end of a typical MCP and feels heavy. Each tool has a plausible role, but the count is large enough that navigation and selection could become unwieldy.

Completeness4/5

The tool set covers linking, account and transaction data, liabilities, investments, identity, income, local overrides, and external debt CRUD with summary capabilities. Minor gaps like per-transaction detail or category management are not critical for the core domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Self-hosted, read-only MCP server that connects banks, credit cards, loans, and brokerage accounts via Plaid. 9 tools for balances, transactions, recurring charges, liabilities, and investment holdings.
    9
    7
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    A read-only MCP server that enables users to analyze their real bank, credit card, loan, and brokerage data through Plaid. It provides financial analysis tools for transactions, balances, investments, liabilities, and debt while keeping all access tokens and data locally stored.
    24
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A persistent MCP server that securely manages Plaid bank connections, allowing AI assistants to query financial data (balances, transactions, investments, etc.) without exposing sensitive credentials.
    -
  • 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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kenchambers1987-png/plaid-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server