MCP ready

MCP Server, connect AI to bank & card data validation

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.

Ask Claude:

"Is routing number 021000021 valid, and which bank is it?"

AI calls MCP tool:
{
"tool": "validate_routing_number",
"params": {
"routing_number": "021000021"
}
}

What is MCP and why does it matter?

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.

Instant sandbox key

No signup form, no credit card. The register tool gets a working key in one call — the agent can do it itself.

Natural language

Ask "Validate IBAN DE89370400440532013000" and get an accurate, structured answer back.

Same API quota

MCP calls use whichever key you authenticate with — sandbox or production — and count against that account's existing quota.

Available MCP tools

16 tools mapped to BankDataStack REST endpoints, plus self-service registration.

validate_routing_number Routing

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.

lookup_routing_number_db Routing

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.

search_routing_numbers Routing

Multi-filter search across the local routing number database — bank, city, state, and/or zip. Maps to POST /api/v1/routing/database/search.

search_banks_by_name Routing

List banks matching a name (partial match). Maps to POST /api/v1/routing/database/bank.

search_banks_by_state Routing

List banks registered in a US state. Maps to POST /api/v1/routing/database/state.

search_banks_by_city Routing

List banks registered in a city, optionally narrowed by state. Maps to POST /api/v1/routing/database/city.

search_banks_by_zip Routing

List banks registered in a ZIP code. Maps to POST /api/v1/routing/database/zip.

lookup_bin Cards

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.

validate_iban IBAN

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.

lookup_swift SWIFT

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.

search_swift_codes SWIFT

Multi-filter search across the SWIFT/BIC registry — bank, city, country, and/or country code. Maps to POST /api/v1/swift/search.

search_swift_by_bank SWIFT

List all SWIFT/BIC codes for a bank name — a bank can have multiple codes across branches. Maps to POST /api/v1/swift/bank.

search_swift_by_country SWIFT

List all SWIFT/BIC codes registered in a country. Maps to POST /api/v1/swift/country.

search_swift_by_city SWIFT

List all SWIFT/BIC codes registered in a city, optionally narrowed by country code. Maps to POST /api/v1/swift/city.

validate_bic SWIFT

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.

register Auth

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.

Getting started

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.

MCP endpoint

No key yet? Ask your AI to call the register tool, or sign up for production access.

Client can't set custom headers? Some MCP clients only let you paste a URL, with no way to add an 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.

Connect to Claude

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.

1. Open Connectors

User menu → Settings → Customize → Connectors → Add custom connector.

2. Name and URL

Name: for example BankDataStack

Remote server URL: https://mcp.bankdatastack.com/mcp

3. Authentication

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.

4. Add and try it

Click Add, then ask: "Is routing number 021000021 valid?"

Connect with Claude Code

From any terminal (outside a claude session):

bash
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:

bash
claude mcp remove mcp-bankdatastack

Connect to Cursor

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.

mcp.json
{
  "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"

Connect to ChatGPT

In ChatGPT, open Settings → Connectors and add a custom MCP connector.

1. Name and URL

Remote server URL: https://mcp.bankdatastack.com/mcp

2. Authentication

Leave it unauthenticated — ask ChatGPT to register a sandbox key on first use.

3. Try it

"Is IBAN DE89370400440532013000 valid?"

"What bank issued card BIN 411111?"

"Look up SWIFT code DEUTDEFF"

Python: validate a routing number

A complete example that registers a sandbox key, then validates a routing number over MCP.

validate_routing_number.py
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())

Frequently asked questions

There is no OAuth flow to click through. Call the 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.
MCP calls count toward whichever account issued the key — the same quota as REST API calls. A sandbox key from register gets 200 requests/month; a paid plan gets its plan quota. Check pricing for plan details.
16 tools: routing number validation/lookup/search, BIN lookup, IBAN validation, SWIFT/BIC lookup/search/validation, and self-service registration. See Available Tools above for the full list and REST mappings.
A sandbox key (from the 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.
Yes. Any client that speaks the Model Context Protocol over Streamable HTTP can connect — Claude Desktop, claude.ai, Claude Code, Cursor, ChatGPT connectors, or a custom script.