# Add business checking recommendations to your SMB software agent

> How SMB software with embedded agents (invoicing, payroll, point-of-sale and vertical SaaS) uses the Bancadia MCP server to recommend a business checking account that fits how the business operates.

Canonical: https://bancadia.com/agent-integrations/smb-software

Invoicing, payroll, point-of-sale and vertical SaaS products see how a business gets paid and how it pays out. The moment for a recommendation is when the user connects a bank, receives a payout or runs payroll, and the current account doesn't fit: it charges for the cash a restaurant deposits every day, or it can't settle payroll fast enough. An embedded agent can recommend an account that matches how the business actually operates.

## When to call Bancadia

- Bank connection during setup: the user links a personal account, or has no business account to link.
- Payouts: card or invoice payouts land in an account with transaction limits or fees that the payout volume will exceed.
- Payroll: a run needs faster settlement than the current account offers, or the business needs ACH debit blocks for fraud control.
- Cash-heavy businesses (restaurants, retail, trades) paying per-deposit cash fees.

### Signals you likely already have

Each maps to an argument on `query_business_checking`. All arguments are optional and combine with AND semantics, except `target_industries` and `target_business_profiles`, which reorder results without excluding any.

| Signal | Argument |
| --- | --- |
| Industry (your product's vertical) | `target_industries`, e.g. `["restaurant_food_service"]` |
| Monthly transaction volume from payouts and invoices | `free_transactions_min` |
| Deposits cash | `cash_deposit_available: true` |
| Needs same-day payouts or payroll funding | `rtp_supported: true` |
| Accounting sync your product relies on | `accounting_integration_available: true` |
| Entity type and state from the account profile | `entity_types_accepted`, `available_states` |

## Quickstart: connect the MCP server

Bancadia is delivered as a remote MCP server over Streamable HTTP at `https://mcp.bancadia.com/`. `initialize` and `tools/list` need no credentials; `tools/call` needs a bearer token, which you can create for free at [bancadia.com/developer/signup](https://bancadia.com/developer/signup). The server exposes two tools: `query_business_checking` to search listings, and `get_business_checking_listing` for full fees and features on one listing.

### Claude Desktop

Add to `claude_desktop_config.json`. Claude Desktop runs local servers from this file, so the remote server is bridged with `mcp-remote`.

```json
{
  "mcpServers": {
    "bancadia": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://mcp.bancadia.com/",
        "--header",
        "Authorization:${BANCADIA_AUTH}"
      ],
      "env": {
        "BANCADIA_AUTH": "Bearer sk_bancadia_YOUR_TOKEN"
      }
    }
  }
}
```

### Claude Code

```bash
claude mcp add --transport http bancadia https://mcp.bancadia.com/ \
  --header "Authorization: Bearer sk_bancadia_YOUR_TOKEN"
```

### Any MCP client (TypeScript SDK)

Uses `@modelcontextprotocol/sdk`. The arguments match the example in the next section.

```ts
import { Client } from '@modelcontextprotocol/sdk/client/index.js'
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'

const transport = new StreamableHTTPClientTransport(new URL('https://mcp.bancadia.com/'), {
  requestInit: {
    headers: { Authorization: `Bearer ${process.env.BANCADIA_MCP_API_TOKEN}` },
  },
})
const client = new Client({ name: 'your-agent', version: '1.0.0' })
await client.connect(transport) // runs initialize + session negotiation

const result = await client.callTool({
  name: 'query_business_checking',
  arguments: {
    "entity_types_accepted": [
      "llc"
    ],
    "available_states": [
      "IL"
    ],
    "cash_deposit_available": true,
    "free_transactions_min": 300,
    "rtp_supported": true,
    "target_industries": [
      "restaurant_food_service"
    ],
    "target_business_profiles": [
      "established_smb"
    ]
  },
})

// content[0].text is a JSON-encoded array of listings
const listings = JSON.parse(result.content[0].text)
await client.close()
```

### Inside an agent framework

Vercel AI SDK: `@ai-sdk/mcp` turns the live `tools/list` manifest into model tools, so there is no hand-copied schema to drift.

```ts
import { createMCPClient } from '@ai-sdk/mcp'
import { generateText, stepCountIs } from 'ai'

const bancadia = await createMCPClient({
  transport: {
    type: 'http',
    url: 'https://mcp.bancadia.com/',
    headers: { Authorization: `Bearer ${process.env.BANCADIA_MCP_API_TOKEN}` },
  },
})

try {
  const { text } = await generateText({
    model: yourModel,
    system: SYSTEM_PROMPT, // see the system-prompt snippet below
    messages,
    tools: await bancadia.tools(), // query_business_checking, get_business_checking_listing
    stopWhen: stepCountIs(4),
  })
} finally {
  await bancadia.close()
}
```

Python: the official `mcp` SDK. The same session can be handed to any framework that accepts an MCP `ClientSession`.

```python
import json, os
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client

headers = {"Authorization": f"Bearer {os.environ['BANCADIA_MCP_API_TOKEN']}"}

async with streamablehttp_client("https://mcp.bancadia.com/", headers=headers) as (read, write, _):
    async with ClientSession(read, write) as session:
        await session.initialize()
        result = await session.call_tool(
            "query_business_checking",
            {
                "entity_types_accepted": [
                    "llc"
                ],
                "available_states": [
                    "IL"
                ],
                "cash_deposit_available": True,
                "free_transactions_min": 300,
                "rtp_supported": True,
                "target_industries": [
                    "restaurant_food_service"
                ],
                "target_business_profiles": [
                    "established_smb"
                ]
            },
        )
        listings = json.loads(result.content[0].text)
```

The full session lifecycle, response shape, rate limits and error codes are in the [MCP reference](https://bancadia.com/docs/mcp-reference).

## Example tool call and response

A restaurant on a POS platform deposits about $26,000 in cash a month, processes around 300 payouts and vendor payments a month, and runs biweekly payroll. The embedded agent looks for an account in Illinois that accepts cash deposits, covers that volume and supports real-time payments.

`tools/call` params

```json
{
  "name": "query_business_checking",
  "arguments": {
    "entity_types_accepted": [
      "llc"
    ],
    "available_states": [
      "IL"
    ],
    "cash_deposit_available": true,
    "free_transactions_min": 300,
    "rtp_supported": true,
    "target_industries": [
      "restaurant_food_service"
    ],
    "target_business_profiles": [
      "established_smb"
    ]
  }
}
```

Parsed `result.content[0].text`, trimmed to the fields this agent uses. Real listings carry about 50 fields each. Values and institution names here are placeholders, not live listings.

```json
[
  {
    "listing_slug": "example-bank-business-advantage-checking",
    "institution_name": "Example Bank",
    "product_name": "Business Advantage Checking",
    "monthly_fee": 16,
    "monthly_fee_waiver_condition": "Waived with a $5,000 average daily balance",
    "minimum_opening_deposit": 100,
    "entity_types_accepted": [
      "llc",
      "s_corp",
      "c_corp",
      "sole_prop",
      "partnership"
    ],
    "available_states": [
      "IL",
      "IN",
      "WI"
    ],
    "target_industries": [
      "restaurant_food_service",
      "retail_storefront"
    ],
    "target_business_profiles": [
      "established_smb"
    ],
    "insurance_type": "fdic",
    "free_transactions_per_month": 300,
    "per_transaction_fee_after_limit": 0.45,
    "cash_deposit_available": true,
    "cash_deposit_fee_per_100": 0.3,
    "monthly_cash_deposit_limit": 7500,
    "rtp_supported": true,
    "remote_deposit_capture": true,
    "ach_debit_block_available": true,
    "application_url": "https://bancadia.com/go/example-bank/business-advantage-checking",
    "last_modified": "2026-09-15T00:00:00Z",
    "is_verified": true
  },
  {
    "listing_slug": "example-credit-union-business-checking",
    "institution_name": "Example Credit Union",
    "product_name": "Business Checking",
    "monthly_fee": 0,
    "monthly_fee_waiver_condition": null,
    "minimum_opening_deposit": 25,
    "entity_types_accepted": [
      "llc",
      "sole_prop",
      "partnership",
      "nonprofit"
    ],
    "available_states": [
      "IL"
    ],
    "target_industries": [],
    "target_business_profiles": [],
    "insurance_type": "ncua",
    "free_transactions_per_month": 300,
    "per_transaction_fee_after_limit": 0.5,
    "cash_deposit_available": true,
    "cash_deposit_fee_per_100": 0.25,
    "monthly_cash_deposit_limit": 5000,
    "rtp_supported": true,
    "remote_deposit_capture": true,
    "ach_debit_block_available": false,
    "application_url": "https://bancadia.com/go/example-credit-union/business-checking",
    "last_modified": "2026-09-15T00:00:00Z",
    "is_verified": true
  }
]
```

### What the fields mean for this agent

| Field | How to use it |
| --- | --- |
| `(ordering)` | The credit union account has the lower monthly fee, but the first listing is tagged for restaurants and established businesses, so soft ranking moved it up. Both passed every filter. |
| `cash_deposit_fee_per_100 / monthly_cash_deposit_limit` | The fee per $100 of cash deposited above the monthly amount. Estimate monthly cost from the business's real cash volume. |
| `per_transaction_fee_after_limit` | What each transaction over `free_transactions_per_month` costs. Check busy months, not just the average. |
| `remote_deposit_capture / ach_debit_block_available` | Mobile check deposit and ACH debit blocks matter for payroll- and vendor-heavy businesses. |

### Going deeper on one listing

Call `get_business_checking_listing` for the top results and read `general_fees` for excess-transaction, returned-item and stop-payment fees, which add up in high-volume businesses. Features in the `cash_handling` category describe where and how cash can be deposited.

A `null` field means Bancadia doesn't have that data point for the listing yet. It doesn't mean "no". An empty array means nothing matched; loosen a filter rather than inventing a result.

## Present the recommendation

Your agent owns the conversation, so it decides when a recommendation is useful and how to phrase it. The snippet below is a starting point for your system prompt. Keep the disclosure line in whatever version you ship.

System-prompt snippet (`SYSTEM_PROMPT`)

```text
You are the assistant inside [Product], a POS and payments platform for
restaurants. When a user connects a bank account, reviews payouts or runs
payroll, and their current account doesn't fit how they operate, you may
suggest a business checking account using the Bancadia tools.

- Only suggest an account when there's a concrete reason in their data
  (cash deposit fees, transaction limits, slow payroll settlement).
- Query with their entity type, state, cash and transaction needs, and
  industry. Estimate monthly cost from their real volume using the returned
  fee fields. Only recommend accounts the tool returned.
- The suggestion is optional and never blocks setup or payouts. Their
  current account keeps working with [Product].
- Link only to the application_url returned by the tool.
- Include: "We may earn a commission if you open this account; it doesn't
  affect which accounts are shown."
```

What the end user sees

```text
Your current account charged $140 in cash deposit fees last month on about
$26,000 in cash deposits.

Business Advantage Checking from Example Bank is built for restaurants. At
your volume, cash deposits would cost about $56 a month (the first $7,500
each month has no cash fee), and its $16 monthly fee is waived because you
keep more than $5,000 on average. It includes 300 free transactions a month
and supports real-time payments.

Apply: https://bancadia.com/go/example-bank/business-advantage-checking

We may earn a commission if you open this account; it doesn't affect which
accounts are shown.
```

> **Disclosure is required in every recommendation.** Bancadia responses contain no commission or payout fields, so nothing in the data can push the model toward a higher-paying account. Your disclosure tells the user that, too.

## Commission share

Bancadia runs a commission-share model. When a bank or affiliate program pays a commission on an account opened through an agent's recommendation, Bancadia is designed to pass a share of it to the agent that made the recommendation. Bancadia is paid only on conversion. It never charges for impressions, placement or position.

- **No commissions are live yet.** Bancadia has no live bank partnerships today and pays nothing to anyone. Access to the registry is free.
- **Terms aren't set.** We don't publish rates or payout promises. Terms will be agreed per integration as commissions become available.
- **Coverage grows as partners come online.** Product data and commission eligibility will expand together, starting with business checking.
- **Commission never affects ranking.** See the [methodology](https://bancadia.com/methodology) for how results are ordered.

### How attribution works

Every `application_url` Bancadia returns is a `bancadia.com/go/…` redirect that logs the click, and every `tools/call` is logged against the token that made it. Pass `application_url` to your user unmodified. Tying a specific application back to the integration that surfaced it, which commission sharing depends on, isn't live yet. We'll document the mechanism here when it ships.

## FAQ

### Is ranking affected by commission?

No. Commission isn't an input and isn't in the response. Ordering is by monthly fee, with listings tagged for the industry and profile you send moved up, as in the example above. Re-ranking by estimated monthly cost from your own volume data is usually the better signal, and your agent is free to do it.

### We already have an embedded banking partner. Does this conflict?

That's a product decision for you. Bancadia doesn't require exclusivity or any placement. Some platforms call Bancadia only when their own account doesn't fit a user, such as a cash-heavy business their partner bank doesn't serve well.

### What user data do we send?

Filter criteria only: entity type, state, industry, and requirements like cash deposits or a minimum number of free transactions. Transaction histories, payout amounts and payroll data stay in your system. Compute costs locally from the returned fee fields.

### How is attribution tracked if the user applies later?

Each `application_url` is a `bancadia.com/go/…` redirect that logs the click. Linking an application back to your integration, which commission sharing will depend on, isn't live yet. See [commission share](#commission-share).

### Which products are covered today?

US business checking only. Merchant services, dedicated payroll accounts and business savings aren't in the registry today.

## Get started

[Create a free developer token](https://bancadia.com/developer/signup), then follow the [quickstart](https://bancadia.com/docs/quickstart). Questions about a specific integration? Email Scott at [scott.macpherson@bancadia.com](mailto:scott.macpherson@bancadia.com).
