Plaid Sandbox MCP server for AI agents

Live

API KEY

FINTECH TESTING

Accounting & Finance

Plaid Sandbox gives your agent Plaid's test environment: create test Items without Plaid Link, add custom transactions, fire test webhooks, force login and verification states, and read accounts, balances, and transactions from test banks.

  • Per-user credentials: each call uses the actual user's API key, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Plaid Sandbox
agent · Acme Q3
Run
Create a test Item at First Platypus Bank with the transactions product.
S
plaidsandbox_sandbox_public_token_create
212ms
Sandbox test agent
Created a test Item at First Platypus Bank (ins_109508) with transactions. Exchange the returned public token to start calling account tools.
Sources: Plaid Sandbox, ins_109508
plaidsandbox
1 Item
18:29
Message Claude...

Tools your QA agent reaches for on Plaid Sandbox, scoped per user.

CALL ANY TOOL
32 tools for fintech testing in Plaid Sandbox: create test Items, add custom transactions, fire webhooks, set login and verification states, and read accounts, balances, transactions, identity, and investments.
plaidsandbox_accounts_balance_get
Get accounts balance
Get real-time balances for an Item's accounts by fetching fresh data from the institution. Returns accounts with balances (available, current, limit, iso_currency_code, last_updated_datetime) and item. Use plaidsandbox_accounts_balance_get before moving money or whenever balances must be current. Each call is billed and usually takes under 10 seconds, sometimes 30 or more. Use plaidsandbox_accounts_get for free cached balances.
Parameters
Name
Type
Required
Description
access_token
string
Required
The Item's access_token, returned by plaidsandbox_item_public_token_exchange after the end user links an account with Plaid Link. It starts with access-sandbox-. Example: access-sandbox-de3ce8ef-33f8-452c-a685-8671031fc0f6.
account_ids
array
Optional
Limit the accounts returned to these account_ids, from plaidsandbox_accounts_get. Leave empty for all of the Item's accounts. Plaid returns an error if an id does not belong to the Item. Example: ["BxBXxLj1m4HMXBm9WZZmCWVbPjX16EHwv99vp"].
min_last_updated_datetime
string
Optional
Oldest acceptable balance time, ISO 8601 (YYYY-MM-DDTHH:mm:ssZ). Only needed for institutions that do not return real-time balances (for example Capital One); Plaid returns an error if its balance is older. Example: 2026-10-20T00:00:00Z.
plaidsandbox_accounts_get
Get accounts
plaidsandbox_auth_get
Get auth
plaidsandbox_identity_get
Get identity
plaidsandbox_identity_match
Identity match
plaidsandbox_institutions_get
Get institutions
plaidsandbox_institutions_get_by_id
Institutions get by id
plaidsandbox_institutions_search
Search institutions
plaidsandbox_investments_refresh
Refresh investments
plaidsandbox_investments_transactions_get
Get investments transactions
plaidsandbox_item_access_token_invalidate
Item access token invalidate
plaidsandbox_item_get
Get item
plaidsandbox_item_public_token_exchange
Item public token exchange
plaidsandbox_item_remove
Remove item
plaidsandbox_item_webhook_update
Update item webhook
plaidsandbox_liabilities_get
Get liabilities
plaidsandbox_link_token_create
Create link token
plaidsandbox_link_token_get
Get link token
plaidsandbox_sandbox_item_fire_webhook
Sandbox item fire webhook
plaidsandbox_sandbox_item_reset_login
Sandbox item reset login
plaidsandbox_sandbox_item_set_verification_status
Sandbox item set verification status
plaidsandbox_sandbox_public_token_create
Create sandbox public token
plaidsandbox_sandbox_transactions_create
Create sandbox transactions
plaidsandbox_statements_list
List statements
plaidsandbox_statements_refresh
Refresh statements
plaidsandbox_transactions_get
Get transactions
plaidsandbox_transactions_refresh
Refresh transactions
plaidsandbox_transactions_sync
Sync transactions
plaidsandbox_user_create
Create user
plaidsandbox_user_remove
Remove user

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Plaid Sandbox tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["plaidsandbox"], toolNames: [
    "plaidsandbox_sandbox_public_token_create",
    "plaidsandbox_item_public_token_exchange",
    "plaidsandbox_transactions_sync"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Create a test Item at First Platypus Bank and sync its transactions" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["plaidsandbox"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Create a test Item at First Platypus Bank and sync its transactions" }],
  tools,
});

// Execute the tool call with the user's vaulted Plaid Sandbox API key
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["plaidsandbox"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Create a test Item at First Platypus Bank and sync its transactions" }],
  tools,
});

// Tool call runs with the user's vaulted Plaid Sandbox API key
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["plaidsandbox"] }, pageSize: 100,
});

const agent = new Agent({
  name: "sandbox_test_agent",
  model: "gemini-2.5-pro",
  instruction: "Plaid Sandbox tools scoped to this user",
  tools,
});

await agent.run("Create a test Item at First Platypus Bank and sync its transactions");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Plaid Sandbox tool. Click to copy, paste into your agent, done.
Test setup
Copy the prompt
Copied
Create a test Item at First Platypus Bank with the transactions product.
Copy the prompt
Copied
Add 5 custom transactions to this test Item, including a $1,200 rent payment.
Copy the prompt
Copied
Fire a SYNC_UPDATES_AVAILABLE webhook for this test Item.
Error states
Copy the prompt
Copied
Force this test Item into the ITEM_LOGIN_REQUIRED state.
Copy the prompt
Copied
Mark the micro-deposits on this test account as verified.
Copy the prompt
Copied
Check this test Item's status after the reset.
Reading data
Copy the prompt
Copied
Sync transactions for this test Item.
Copy the prompt
Copied
Get balances for every account on this test Item.
Copy the prompt
Copied
Show the identity data on file for this test Item.
SEE HOW AUTH WORKS
Each user connects their own Plaid Sandbox API key once, and Scalekit sends it with every call. Keys stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Plaid Sandbox
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Plaid Sandbox
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Plaid Sandbox
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Plaid Sandbox
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other accounting and finance connectors.
GTM and RevOps Teams
Revenue forecast commentary
Pulls open pipeline from Salesforce and HubSpot, calculates coverage against quota, flags at-risk stages, posts commentary to Slack, and logs every snapshot to Google Sheets.
Test other agents
See the same per-user auth pattern across other accounting and finance connectors.
GTM
Revenue forecast agent
Score pipeline coverage against quota across Salesforce and HubSpot, post forecast commentary to Slack, log snapshots to Sheets.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Plaid Sandbox API key looks fine in a demo. In production every test Item and webhook looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared key
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Plaid Sandbox today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Plaid Sandbox as the user or through a shared API key?
As the user. Each user connects their own Plaid Sandbox API key once, and Scalekit sends it with every call. Audit logs attribute every test Item, webhook, and data read to that user, not a shared service account.
Where is the Plaid Sandbox API key stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new API key. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Plaid Sandbox?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the sandbox setup and read tools without plaidsandbox_user_remove, which deletes a Plaid user and every Item linked to it. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Plaid Sandbox access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
What is Plaid Sandbox for?
Building and testing with test banks and test data. Plaid Sandbox uses your Plaid client ID and Sandbox secret and calls Plaid's Sandbox environment. Tools such as plaidsandbox_sandbox_public_token_create and plaidsandbox_sandbox_item_fire_webhook create test Items and trigger test events without Plaid Link.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""plaidsandbox"": {
""url"": ""https://mcp.scalekit.com/plaidsandbox"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.plaidsandbox]
url = ""https://mcp.scalekit.com/plaidsandbox""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""plaidsandbox"": {
""url"": ""https://mcp.scalekit.com/plaidsandbox"",
""type"": ""http""
}
}
}