Integrate BankDataStack with Claude, Cursor, ChatGPT or any MCP-compatible assistant. Validate routing numbers, BINs, IBANs, and SWIFT/BIC codes right from your AI conversations — with an instant sandbox key, no signup form required.
"Is routing number 021000021 valid, and which bank is it?"
The Model Context Protocol (MCP) lets AI assistants call external tools in real time. Instead of guessing at bank details from training data, your AI can validate real routing numbers, BINs, IBANs, and SWIFT codes — just by asking a question.
Example: Ask Claude "Is routing number 021000021 valid?" and it will call our
validate_routing_number tool automatically.
No signup form, no credit card. The register tool gets a working key in one call — the agent can do it itself.
Ask "Validate IBAN DE89370400440532013000" and get an accurate, structured answer back.
MCP calls use whichever key you authenticate with — sandbox or production — and count against that account's existing quota.
16 tools mapped to BankDataStack REST endpoints, plus self-service registration.
Validates a US bank routing number (ABA number) for ACH or wire transfers and returns the bank name, address, and payment-rail eligibility. Maps to POST /api/v1/routing/validate.
Richer than validate_routing_number: looks up a routing number in the local database (19,000+ US banks and credit unions) with full address, phone, and revision date. Pass refresh=true to force a fresh upstream lookup. Maps to POST /api/v1/routing/database/lookup.
Multi-filter search across the local routing number database — bank, city, state, and/or zip. Maps to POST /api/v1/routing/database/search.
List banks matching a name (partial match). Maps to POST /api/v1/routing/database/bank.
List banks registered in a US state. Maps to POST /api/v1/routing/database/state.
List banks registered in a city, optionally narrowed by state. Maps to POST /api/v1/routing/database/city.
List banks registered in a ZIP code. Maps to POST /api/v1/routing/database/zip.
Looks up a card Bank Identification Number (the first 6-8 digits of a card) and returns the issuing bank, card brand, card type/level, and country. Maps to POST /api/v1/bin/lookup.
Validates an International Bank Account Number: country participation, length, and MOD-97 checksum, then returns the country code, check digits, and BBAN. Maps to POST /api/v1/iban/validate.
Looks up a SWIFT/BIC code in the bank registry and returns the bank name, branch, city, address, and country. Maps to POST /api/v1/swift/lookup.
Multi-filter search across the SWIFT/BIC registry — bank, city, country, and/or country code. Maps to POST /api/v1/swift/search.
List all SWIFT/BIC codes for a bank name — a bank can have multiple codes across branches. Maps to POST /api/v1/swift/bank.
List all SWIFT/BIC codes registered in a country. Maps to POST /api/v1/swift/country.
List all SWIFT/BIC codes registered in a city, optionally narrowed by country code. Maps to POST /api/v1/swift/city.
Validates a BIC (same format as SWIFT) and returns a detailed breakdown — bank code, country code, location code, branch code. Maps to POST /api/v1/bic/validate.
Gets a free sandbox API credential with no signup form and no credit card — the agent can call this itself. Chains POST /oauth/register + POST /oauth/token into one step and returns a working key.
Same URL for every client. No OAuth screen to click through — call register for an
instant sandbox key, or use a real key from your dashboard.
Authorization header. In that case, append your key to the URL instead:
https://mcp.bankdatastack.com/mcp?apikey=YOUR_KEY. Prefer the header form when your client supports it.
Works the same on claude.ai and in the Claude Desktop app — the connector is saved on your Claude account, not in a local file.
User menu → Settings → Customize → Connectors → Add custom connector.
Name: for example BankDataStack
Remote server URL: https://mcp.bankdatastack.com/mcp
Leave authentication off, since there's no OAuth server behind this connector.
Once added, just ask Claude to "register a BankDataStack sandbox key" — it will call the
register tool and use the returned key for the rest of the conversation.
Click Add, then ask: "Is routing number 021000021 valid?"
From any terminal (outside a claude session):
claude mcp add --transport http mcp-bankdatastack https://mcp.bankdatastack.com/mcp
Then open a Claude Code session and ask it to register a sandbox key and validate something — no separate auth step is needed for the sandbox tier. Remove the server later with:
claude mcp remove mcp-bankdatastack
Paste this into ~/.cursor/mcp.json on a Mac, or
%USERPROFILE%\.cursor\mcp.json on Windows
(or .cursor/mcp.json in a project folder for a project-only setup).
Save, quit Cursor fully, and reopen it.
{
"mcpServers": {
"bankdatastack": {
"url": "https://mcp.bankdatastack.com/mcp"
}
}
}
No auth block needed to get started — ask Cursor to call register for a sandbox key
the first time you use it. For a production key instead, add
?apikey=YOUR_KEY to the url above.
After setup, try: "Look up SWIFT code DEUTDEFF"
In ChatGPT, open Settings → Connectors and add a custom MCP connector.
Remote server URL: https://mcp.bankdatastack.com/mcp
Leave it unauthenticated — ask ChatGPT to register a sandbox key on first use.
"Is IBAN DE89370400440532013000 valid?"
"What bank issued card BIN 411111?"
"Look up SWIFT code DEUTDEFF"
A complete example that registers a sandbox key, then validates a routing number over MCP.
import httpx
import json
import asyncio
MCP_SERVER_URL = "https://mcp.bankdatastack.com/mcp"
async def call_mcp_tool(tool_name: str, arguments: dict, api_key: str | None = None):
headers = {"Authorization": f"Bearer {api_key}"} if api_key else {}
async with httpx.AsyncClient(timeout=30) as client:
response = await client.post(
MCP_SERVER_URL,
headers=headers,
json={
"jsonrpc": "2.0",
"id": "1",
"method": "tools/call",
"params": {"name": tool_name, "arguments": arguments}
}
)
return response.json()
async def main():
# 1. No key yet? Register a free sandbox credential — no signup, no card.
reg = await call_mcp_tool("register", {"client_name": "python-example"})
token = json.loads(reg["result"]["content"][0]["text"])["access_token"]
# 2. Use it to validate a routing number.
result = await call_mcp_tool(
"validate_routing_number",
{"routing_number": "021000021"},
api_key=token,
)
print(json.dumps(result, indent=2))
asyncio.run(main())
register tool with no credentials to get an instant sandbox key (200 requests/month, 5 requests/minute, expires in 7 days), then pass it as an Authorization: Bearer YOUR_KEY or X-API-Key: YOUR_KEY header on the MCP server — or, if your client cannot set custom headers, as ?apikey=YOUR_KEY on the MCP URL. For production-scale access, sign up and generate a real key from the dashboard.register gets 200 requests/month; a paid plan gets its plan quota. Check pricing for plan details.register tool) is free, requires no human signup, and is capped at 200 requests/month, 5 requests/minute, expiring after 7 days — meant for evaluation, not production traffic. A real API key (from signing up and subscribing) has no expiry and a much higher quota.