# Bancadia (full text) --- > Bancadia is the data layer AI agents use to recommend financial products — a verified, real-time registry of US business banking products, queryable over MCP. Bancadia is infrastructure for AI agents, not a consumer comparison site. Agents connect through the MCP server at https://mcp.bancadia.com/. --- Index: https://bancadia.com/llms.txt --- # Product discovery is moving from web pages to APIs and MCP servers > More of the internet is becoming API-driven, and product discovery is following. I believe the next wave of product research will happen through APIs and MCP servers that AI agents query directly, not through HTML pages built for human eyes. Bancadia is building the product-data and attribution layer for that shift, starting with business checking. By Scott Macpherson, Founder, Bancadia (https://bancadia.com/authors/scott-macpherson). Published September 29, 2026. Updated October 1, 2026. Canonical: https://bancadia.com/articles/product-discovery-is-moving-to-apis ## Key takeaways - Agents research and act on behalf of users, and they get information by calling tools, not by browsing. - Scraping pages built for people gives agents data that is fragile, stale and unverifiable. - Agents need structured, fresh, accurate, queryable product data, delivered where they already work: an MCP server. - When an agent's recommendation leads to a signup, the agent has delivered a customer, so it should be paid on conversion, not by the impression. - Bancadia starts with business checking, for agents that serve small businesses. ## What is changing about how people find products? Software systems have talked to each other through APIs for years. What's new is that software now does the shopping. AI assistants research purchases, compare options and, more and more, take actions for the person they work for. Answer engines return one synthesized answer instead of ten blue links. The plumbing for this arrived quickly. The Model Context Protocol (MCP) is an open standard for connecting AI models to external tools and data; Anthropic [introduced it in November 2024](https://www.anthropic.com/news/model-context-protocol) and the [specification is public](https://modelcontextprotocol.io). A capability published once as an MCP server can be called by any agent that speaks the protocol. I believe product discovery will follow. When a small-business owner asks their AI CFO where the business should bank, the answer won't come from a person scrolling a comparison site. It will come from an agent that calls a tool, weighs the results against what it knows about the business, and explains its choice. ## Why doesn't SEO-era product content work for AI agents? The discovery system we have was built for human eyeballs. Product information lives in HTML designed to persuade. Fee schedules live in PDFs. The comparison layer on top is mostly listicles, written once for an average reader and ranked by some mix of editorial judgment and payout. Agents inherit all of that when they scrape. Scraped pages are **fragile**: a site redesign breaks the parser. They're **stale**: last quarter's crawl quotes last quarter's rate. And they're **unverifiable**: the agent can't tell the standard rate from the promotional one, or whether a fee it found applies to the plan its user would actually get. Then the model states the result with full confidence. For most products that's an annoyance. For financial products, where a wrong fee or rate costs the end user real money, it isn't good enough. ## What do AI agents need from product data instead? Four things, which I go through in detail in [what AI agents need from product data](https://bancadia.com/articles/what-ai-agents-need-from-product-data): - **Freshness.** Data that's current when the agent asks, with a timestamp so the agent can tell. - **Structure the agent can query.** Typed fields for fees, rates and eligibility that an agent can filter on, not prose to interpret. - **Token efficiency.** A lookup that returns the fields the agent needs and nothing else, rather than tens of thousands of tokens of page markup. - **Accuracy.** Authoritative values, so the model isn't guessing a fee from marketing copy. Underneath all four is one idea: every business is a different combination of entity type, state, balances, cash habits and software. An agent should be able to express that whole combination as a query and get back only the products that fit. I make that case in [why agents need filterable product data](https://bancadia.com/articles/ai-agents-need-filterable-product-data). ## What is Bancadia building? Bancadia is a queryable data layer for financial products, delivered as an MCP server. The MCP server is the only way in; there is no public REST API. An agent calls `query_business_checking` with what it knows about its user (entity type, state, fee ceiling, required features such as cash deposits or an accounting integration) and gets back structured listings with fees, rates, eligibility and an application link. A second tool, `get_business_checking_listing`, returns the full fee schedule and feature detail for one listing. The agent keeps the relationship with its user and decides when a recommendation is useful. Bancadia handles the product data and, as bank and affiliate partners come online, the commission. When a recommendation converts, Bancadia is designed to earn an affiliate commission and share it with the agent that made the recommendation. Where things stand today: the data is free to use, it's compiled from institutions' own published materials, and coverage is early. There are no live bank partnerships and no commissions being paid yet. How listings get in and how results are ordered is on our [methodology page](https://bancadia.com/methodology). ## Why pay agents for conversions instead of selling ads? By the time an agent recommends a business checking account, it already knows the business, has narrowed the options and is ready to help its user apply. That isn't an impression. It's something very close to a qualified lead, and qualified leads have always been paid for on conversion, the way affiliates are paid. My bet is that, as more discovery runs through agents, conversion-based pay takes share from impression-based pay. I lay out the full argument in [In AI search, the agent is the lead](https://bancadia.com/articles/ai-agents-are-bottom-of-funnel). ## Why start with business checking? We're starting with business checking, for agents that serve small businesses: [AI CFOs, bookkeeping and accounting agents, treasury tools, entity-formation platforms and SMB software](https://bancadia.com/agent-integrations). Those agents already hold the facts that decide which account fits, such as entity type, state, transaction volume and how much cash the business handles. And opening a business account is a high-intent moment with a clear best answer for each business. From there we'll add more business financial products, following what integrating agents ask for. Longer term, I think the same pattern (structured product data plus conversion-based attribution) applies to agentic commerce broadly. That's a direction, not current scope. ## FAQ ### Is Bancadia a comparison website? No. Bancadia is a data layer that AI agents query through an MCP server. The agent decides what to recommend to its own user; Bancadia supplies the structured product data and, once partners are live, the attribution and commission. ### Does Bancadia have a REST API? No. The MCP server at mcp.bancadia.com is the only integration surface. Agents call two tools: query_business_checking to search, and get_business_checking_listing for one listing's full detail. ### Are banks paying Bancadia today? No. There are no live bank partnerships and no commissions being earned or paid yet. The data is free to use while we onboard early partners. ### What products does Bancadia cover? US business checking accounts only, today. More business financial products will follow based on what integrating agents ask for. ## Work with us **For banks, credit unions and fintechs:** Want your products queryable by AI agents? We're onboarding early partners. Email Scott at [scott.macpherson@bancadia.com](mailto:scott.macpherson@bancadia.com). **For agent builders:** connect your agent to Bancadia's MCP server. Start with the [agent integration guides](https://bancadia.com/agent-integrations). --- # In AI search, the agent is the lead: why affiliate networks will overtake ad networks > In AI search, ad networks and affiliate networks are converging, and I think affiliate wins. An agent only recommends a product after it has understood its user's situation and narrowed the options, so its recommendation is a near-qualified lead, not an impression. Leads get paid on conversion, which is exactly how affiliate networks already work. By Scott Macpherson, Founder, Bancadia (https://bancadia.com/authors/scott-macpherson). Published October 1, 2026. Canonical: https://bancadia.com/articles/ai-agents-are-bottom-of-funnel ## Key takeaways - **The agent is the lead.** By the time an agent recommends a product, the research and qualification are already done. - **Context is the asset.** An agent knows its user's real situation in their own words, far beyond a keyword and a cookie. - **Conversion-based pay follows.** Something that delivers a qualified lead should be paid like a lead source: per conversion (CPA), not per impression (CPM). - **Affiliate gains on ads.** As more discovery runs through agents, the networks that already settle on conversions take share from the ones that sell attention. ## Are ad networks and affiliate networks converging in AI search? I think they are, and fast. For twenty years they did different jobs. Ad networks sold attention near the top of the funnel: a slot on a results page, a banner, a sponsored listing. Affiliate networks paid for outcomes at the bottom: a sale, a signup, a funded account, credited to whoever sent the customer. In AI search the two jobs collapse into one moment. A user describes a problem to an agent, the agent works out what fits, and it recommends something. There's no separate "awareness" step for an ad to buy into and no results page for a sponsored slot to sit on. There is just a recommendation, and then either the user acts on it or they don't. Ad networks won't disappear. They'll keep selling impressions wherever people still scroll, and they'll try to get into AI answers too. But when the unit of discovery is a recommendation that leads straight to action, the question of how to pay for it has an obvious answer, and it isn't per impression. ## What is the difference between CPM and CPA? - **CPM (cost per mille)** means the advertiser pays for every thousand times an ad is shown, whether or not anyone does anything. - **CPA (cost per acquisition)** means the advertiser pays only when a defined result happens, such as an account being opened. Search ads are usually bought per click (CPC), which sits in between: you pay for a visit, not a result. All three are ways of pricing uncertainty. CPM puts all the risk on the advertiser, who pays for attention that may go nowhere. CPA puts the risk on whoever sends the customer, who earns nothing unless the customer converts. Affiliate networks are the infrastructure for CPA: they track who referred a customer, confirm the conversion and settle the payment. That's the piece that matters in an agent-driven world. ## How much does a search ad actually know about the person who sees it? Less than most people assume. A search ad for business checking is matched to a keyword, such as "best business checking account" or "business bank account no fees", and maybe some audience signals: rough location, device, and whatever demographic or interest segments the platform has inferred from browsing history and cookies. From those few words, the bank has to guess everything that decides whether its account is a fit. Is this a sole proprietor or a ten-person S corp? Do they deposit cash? Which state are they in? Are they unhappy with their current bank, or just curious? The ad is paid for before any of that is known, which is why so much of it reaches people the product was never right for. ## What does an AI agent know about its user that an ad never could? **Hypothetical scenario.** Consider an AI bookkeeping agent working for a two-person landscaping company in Texas, set up as an LLC. Because the agent does the books, it already knows: - the entity type (LLC) and the state (Texas) - monthly revenue, and that a meaningful share of it arrives as cash from residential customers - the current bank and the fees it has charged over the past year, including a monthly maintenance fee and cash deposit fees - that the books run on accounting software and the bank feed matters - that the owner asked, in their own words, "why am I paying my bank every month for this?" None of that came from a cookie. The agent learned it by doing the work, and the user told it the rest directly. That's more context than any ad platform has ever had about a person at the moment of decision, and it's attached to an explicit need. So the agent can turn its knowledge into a precise request. Against Bancadia's MCP server it would call `query_business_checking` with `entity_types_accepted: ["llc"]`, `available_states: ["TX"]`, `cash_deposit_available: true`, `accounting_integration_available: true` and a `monthly_fee_max` below what the business pays now, and it could soft-rank toward accounts built for `construction_trades`. Every result that comes back is one the business can actually open and that fits how it operates. (How we order those results is described in our [methodology](https://bancadia.com/methodology).) Then the agent can do something no ad can: compare the fees in the results against what the business actually paid last year, and tell the owner what switching would save. ## Why is an AI agent a bottom-of-funnel lead source? "Bottom of funnel" means the last stage before a purchase: the person knows what they need, has compared options and is ready to act. Marketing teams spend most of their budget moving people toward that stage. An agent does that work before it ever names a product. It has understood the need, ruled out what doesn't fit and picked from what's left. When it says "this account fits your business, and here's why", the user is already at the bottom of the funnel. The agent hasn't generated awareness. It has handed over a qualified lead. That changes what the bank is buying. Paying for an impression made sense when nobody knew who was looking. When the referrer knows exactly who the customer is and why the product fits, the bank should pay for the result. ## Will affiliate networks replace ad networks in AI search? Not replace, but I believe affiliate takes share, and keeps taking it as more discovery runs through agents. Three reasons: 1. **The pricing fits the moment.** An agent's recommendation is a lead, and leads are priced per conversion. Selling it as an impression means pricing it as if nobody knew who the user was. 2. **The incentives point the right way.** An agent paid on conversion only earns when its user opens the account, so the recommendation that pays is the one the user actually takes up. An agent paid per impression earns by showing things. 3. **The infrastructure already exists.** Affiliate networks already track referrals, confirm conversions and settle payment. What they need is attribution that works when the referrer is an agent instead of a person clicking a link on a blog. That last point is the gap. Affiliate tracking was built around a person clicking a link on a web page. In agent-driven discovery, the thing to credit is the agent that made the recommendation, and the system has to know which agent that was. ## What does this mean for bank and fintech marketing teams? If agents are lead sources, two things follow. First, your products have to be findable by agents in a form they can query. An agent can only recommend what it can match to its user, and it matches on data, not on ad creative. That's the argument in [your product data has to keep up](https://bancadia.com/articles/ai-agents-need-filterable-product-data). Second, the budget conversation moves. I expect more acquisition spend to move from paying for attention to paying for accounts opened, and the institutions that are set up to pay agents on conversion will be the ones agents can afford to recommend. ## How does Bancadia pay agents? This is why Bancadia is built on a commission share. When a recommendation made through Bancadia converts, Bancadia is designed to earn an affiliate commission from the institution or its affiliate program and pass a share to the agent that made the recommendation. Bancadia is paid on conversion only: no impressions, no placement fees, no bidding for position. To be clear about where we are: there are no live bank partnerships yet, and no commissions are being earned or paid. Terms will be agreed per partner as they come online. ## FAQ ### What does "bottom of funnel" mean? It's the last stage before a purchase, when a person knows what they need, has compared options and is ready to act. An AI agent that recommends a product after qualifying its user delivers someone at that stage. ### What is the difference between CPM and CPA? CPM (cost per mille) charges for every thousand times an ad is shown. CPA (cost per acquisition) charges only when a defined result happens, such as an account being opened. ### Why should AI agents be paid on conversion? Because they deliver something close to a qualified lead. The agent has already understood the user's need and narrowed the options, so paying for the result matches the value it creates. ### Does Bancadia pay agents today? Not yet. Bancadia is designed to share affiliate commission with the recommending agent, but there are no live bank partnerships and no commissions being paid today. ## Work with us **For banks, credit unions and fintechs:** Want your products queryable by AI agents? We're onboarding early partners. Email Scott at [scott.macpherson@bancadia.com](mailto:scott.macpherson@bancadia.com). **For agent builders:** connect your agent to Bancadia's MCP server. Start with the [agent integration guides](https://bancadia.com/agent-integrations). --- # AI agents know everything about their user. Your product data has to keep up. > AI agents hold an enormous amount of context about their users, and they use it by turning it into filters. To make the best recommendation, an agent needs product data it can filter on many dimensions at once: fees, waivers, cash handling, eligibility, states, integrations and more. A marketing page or a "best of" list can't be filtered. A structured dataset can. By Scott Macpherson, Founder, Bancadia (https://bancadia.com/authors/scott-macpherson). Published October 1, 2026. Canonical: https://bancadia.com/articles/ai-agents-need-filterable-product-data ## Key takeaways - An agent's knowledge of its user becomes a set of filters, and the more it knows, the more filters it needs. - Business checking alone has well over a dozen dimensions that decide fit, from cash deposit fees to accepted entity types. - A web page, however well optimized, is one undifferentiated blob to an agent. It can't answer "which accounts accept S corps in two states and pay interest?" - If your product's attributes aren't available as structured, filterable data, an agent can't match you to the customer you're best for. - That's why treating AEO as page optimization misses the point. ## How does an AI agent turn what it knows about a user into a recommendation? It filters. An agent that knows its user is an S corp in California doesn't want every business checking account in the country. It wants the ones that accept S corps and serve California. Each fact the agent holds removes products that can't work, until what's left is a short list it can actually reason about. This is the part most AEO advice skips. AEO (answer engine optimization) is the practice of getting your products to show up in answers from AI systems. Most of the advice is about restructuring web pages so a language model will cite them. But an agent with real context about its user isn't looking for a page to quote. It's looking for a set of products that pass its filters. The more an agent knows, the more filters it applies, and the more its recommendation depends on the product data supporting those filters. ## What does that look like for a real business? **Hypothetical scenario.** An AI CFO agent works for a six-person e-commerce company. It's an S corp, registered in California, with a second warehouse in Nevada. It pays overseas suppliers by international wire every month, keeps a cash cushion it would like to earn something on, wants a separate sub-account to set aside sales tax, and runs its books in accounting software. It rarely handles physical cash. Here is how that context becomes a query against Bancadia's MCP server: Arguments to `query_business_checking` (every argument is a real filter in the tool schema) ```json { "entity_types_accepted": ["s_corp"], "available_states": ["CA", "NV"], "interest_bearing": true, "sub_accounts_supported": true, "accounting_integration_available": true, "monthly_fee_max": 30, "target_industries": ["ecommerce"], "target_business_profiles": ["established_smb"] } ``` The first six arguments are hard filters: an account that fails any of them isn't returned. The last two only reorder the results toward accounts built for e-commerce businesses at this stage. (The full ordering rules are on our [methodology page](https://bancadia.com/methodology).) The agent then does the part only it can do. Each result comes back with `outgoing_international_wire_fee`, `apy_default` and the account's `plan_tiers`, so the agent can work out what this specific business would pay on its actual wire volume and earn on its actual balance, and rank the short list by net cost. ## Which product attributes does an agent need to filter on? For business checking, an agent needs to be able to filter or compare on at least the dimensions below. The right-hand column is what Bancadia supports today, stated plainly, including where we aren't there yet. "Filter" means an agent can pass it as a query argument. "Returned" means it comes back in each result for the agent to compare, but isn't a query argument yet. | Dimension | What the agent is matching against | Bancadia today | | --- | --- | --- | | Monthly fee | What the business is willing to pay | Filter: `monthly_fee_max` | | Fee-waiver conditions | Whether this business will clear the waiver | Returned as text: `monthly_fee_waiver_condition`, per plan tier too | | Opening deposit and minimum balance | Cash on hand at opening and month to month | Filter: `minimum_opening_deposit_max`. Ongoing minimum balances appear in waiver text and the detail fee schedule only | | Cash deposits | How much cash the business handles | Filter: `cash_deposit_available`. Returned: `cash_deposit_fee_per_100`, `monthly_cash_deposit_limit` | | Transaction limits | Monthly transaction volume | Filter: `free_transactions_min`. Returned: `per_transaction_fee_after_limit`, `daily_debit_limit` | | Wire fees | Domestic and international wire volume | Returned: incoming and outgoing domestic and international wire fees, `free_domestic_wires_per_month` | | ACH fees | ACH payment volume | Not a structured field yet | | Entity types accepted | LLC, S corp, sole prop, nonprofit and so on | Filter: `entity_types_accepted` | | States served | Where the business is registered and operates | Filter: `available_states` | | Restricted industries | Whether the bank will open an account for this line of business | Not in the schema yet. `target_industries` ranks toward accounts built for an industry but doesn't exclude | | Interest and APY | Idle balance the business wants to earn on | Filter: `interest_bearing`, `apy_min`. Returned: `apy_default`, `apy_tiers` | | Deposit insurance | Balance relative to the insurance limit | Filter: `insurance_type` (FDIC, NCUA, uninsured). Sweep programs and extended coverage aren't structured yet | | Branch and ATM access | Whether the owner needs a branch or cash access | Returned: `atm_network`, `atm_fee_reimbursement`. Branch access isn't structured yet | | Mobile deposit | Whether checks arrive by mail | Returned: `remote_deposit_capture` (yes or no). Deposit limits aren't structured yet | | Sub-accounts | Separating tax, payroll or reserves | Filter: `sub_accounts_supported` | | Card and payment controls | Spend control and fraud protection | Returned: `virtual_cards_available`, `physical_debit_card_available`, `positive_pay_available`, `ach_debit_block_available` | | Software integrations | The accounting, tax and expense tools in use | Filter: `accounting_integration_available`, `tax_integration_available`, `expense_integration_available` (category-level, not which product) | | Real-time payments | Whether the business needs instant transfers | Filter: `rtp_supported`, `rtp_network` | That's eighteen dimensions for one product category, and that's before plan tiers, promotions and the fine print in a fee schedule. An agent with deep context about its user can use every one of them. ## Why can't an AI agent just read the bank's product page? It can read it. It can't filter it. A product page is a single document that describes one product the way the marketing team wants it described. To answer a multi-constraint question, an agent would have to find every relevant product page, read each one, pull out values that may or may not be stated, and line them up itself. That's slow, expensive and full of gaps (see [what AI agents need from product data](https://bancadia.com/articles/what-ai-agents-need-from-product-data) for what that costs). Worse, the attributes that decide fit are often not on the page at all. Cash deposit fees, wire fees and waiver conditions usually live in a fee schedule PDF, if they're published anywhere. A page can be perfectly optimized for citation and still leave the agent unable to answer the one question that decides whether its user should open the account. A "best of" list is worse still. It's already been filtered, by someone else, for a reader they knew nothing about. I come back to that in [affiliate content was written for a generic reader](https://bancadia.com/articles/affiliate-content-was-built-for-a-generic-reader). ## What should banks and fintechs do about it? Make your product attributes available as structured, filterable data, somewhere agents actually query. Every product is the best choice for somebody. A bank whose business checking has low cash deposit fees is the best fit for a business that deposits cash every week. But an agent can only find that match if "cash deposit fee" is a value it can filter and compare on, not a line in a PDF. This is the core of my disagreement with AEO as page optimization. Rewriting your product page so a model is more likely to cite it helps you appear in generic answers. It doesn't help an agent that knows its user and is filtering for a specific fit. For that agent, if your attributes aren't queryable, you're not in the result set, no matter how good your web page is. Where you're the best fit is exactly where structured data helps you most. The more specific the user, the fewer products pass the filters, and the more likely the agent recommends one of the few that do. ## FAQ ### What is AEO? AEO (answer engine optimization) is the practice of getting your products to show up in answers from AI systems. Most AEO advice focuses on web pages; I argue that for agents, structured and filterable product data matters more. ### Can an AI agent filter on a bank's web page? No. An agent can read a page, but it can't run a query against it. To compare many products on many constraints, it needs typed fields it can filter on directly. ### Which filters does Bancadia support for business checking? Entity type, state, monthly fee, opening deposit, insurance type, cash deposits, sub-accounts, free transactions, real-time payments, accounting, tax and expense integrations, interest and minimum APY, plus soft ranking by industry and business profile. The MCP reference has the full list. ### Does schema.org markup on my product page solve this? It helps a crawler understand one page. It doesn't give an agent a way to query across every product on many constraints at once, which is what a recommendation needs. ## Work with us **For banks, credit unions and fintechs:** Want your products queryable by AI agents? We're onboarding early partners. Email Scott at [scott.macpherson@bancadia.com](mailto:scott.macpherson@bancadia.com). **For agent builders:** connect your agent to Bancadia's MCP server. Start with the [agent integration guides](https://bancadia.com/agent-integrations). --- # What AI agents need from product data: fresh, structured, token-efficient and accurate > AI agents need four things from product data: it has to be fresh, highly structured and queryable, cheap to look up in tokens, and accurate enough that the model never has to guess. Web pages fail on all four. In one test I ran, the raw HTML of five product sites cost about 78 times more tokens than a single MCP query returning the same five products, and still left out facts the query returned. By Scott Macpherson, Founder, Bancadia (https://bancadia.com/authors/scott-macpherson). Published October 1, 2026. Canonical: https://bancadia.com/articles/what-ai-agents-need-from-product-data ## Key takeaways - **Freshness.** Rates and fees change. An agent quoting stale data gives a wrong answer that its user acts on. - **Structure.** Typed fields an agent can filter and compare on directly, not prose to interpret. - **Token efficiency.** In my test, raw product pages cost about 78 times more tokens than one MCP query covering the same five accounts. - **Accuracy.** When an agent infers a fee from a marketing page it guesses. Authoritative structured data removes the guessing. ## Why does freshness matter so much for AI product recommendations? Because the user acts on the answer. Rates move, fees get added, waiver thresholds change, promotions expire. A person reading an old blog post at least sees the date at the top. An agent working from a months-old crawl states the old fee as fact, and its user opens an account expecting terms that no longer exist. Freshness has two parts. The data has to be current, and the agent has to be able to tell that it's current. A value without a timestamp forces the agent to either trust it blindly or hedge everything. Every listing Bancadia returns carries a `last_modified` timestamp and an `is_verified` flag, so the agent can say "as of this date" when it quotes a fee. How we track and flag staleness is on our [methodology page](https://bancadia.com/methodology). ## What does "structured and queryable" mean for product data? It means every attribute that decides fit is a typed field: the monthly fee is a number, accepted entity types are a fixed list of values, cash deposit support is true or false. And it means an agent can query on those fields, asking for "accounts that accept S corps in California and Nevada, pay interest and support sub-accounts", and get back only what matches. Structure is what lets an agent use what it knows about its user. An agent with deep context turns that context into filters, and filters need fields. I go through the full set of dimensions for business checking, and which ones Bancadia supports today, in [your product data has to keep up](https://bancadia.com/articles/ai-agents-need-filterable-product-data). Prose can't do this. "Low fees for growing businesses" isn't a value. "No monthly fee with a $1,500 average balance" is closer, but an agent still has to parse it, and parsing is where errors creep in. ## How many tokens does an agent waste reading product pages? A lot. A token is the unit language models read and are billed in, roughly a short word or part of one. Every token an agent spends reading markup, navigation, scripts and marketing copy costs money and adds latency, and at agent scale that adds up across every user and every question. I measured it. On October 1, 2026, I ran one real query against Bancadia's MCP server for the hypothetical Texas landscaping LLC from [the agent is the lead](https://bancadia.com/articles/ai-agents-are-bottom-of-funnel): `query_business_checking` with `entity_types_accepted: ["llc"]`, `available_states: ["TX"]`, `cash_deposit_available: true`, `accounting_integration_available: true` and `monthly_fee_max: 15`. It returned five accounts. I then fetched the website each of those five listings links to (for these online-first institutions, the homepage is the main product page) and counted tokens for all three versions with the same tokenizer. | What the agent reads | Tokens for all five accounts | Compared with the MCP response | | --- | --- | --- | | Raw HTML of the five product pages | 305,168 (27,787 to 75,354 per page) | About 78 times larger | | Visible text only (scripts, styles and tags stripped) | 13,627 | About 3.5 times larger | | One `query_business_checking` response | 3,916 | Baseline | **Method:** pages were fetched with a standard desktop browser user agent; "visible text" removes `script`, `style`, `noscript`, `svg` and `template` elements, comments and tags, and collapses whitespace; the MCP figure is the full JSON text of the tool result. All counts use Google's Gemini `countTokens` API with the `gemini-2.5-flash` model. Other tokenizers will give different absolute numbers, but the ratios are what matter. This is one query on one day, not a benchmark. The smaller numbers flatter the pages. Even after stripping everything but the visible text, the pages still didn't answer the question. All five accounts passed the `cash_deposit_available` filter, but the phrase "cash deposit" appeared on only one of the five pages. The MCP response, in under a third of the tokens, stated the monthly fee, cash deposit support, the outgoing domestic wire fee and a `last_modified` timestamp for all five, as typed values the agent could compare directly. And this is the best case for scraping: the agent already knew which five sites to read. Without a query, it would have to find the candidates first, which means more pages and more tokens. ## How does structured product data reduce AI hallucinations? By taking away the need to guess. When a model has to infer a fee from a marketing page, it fills gaps with whatever seems plausible. That's what a hallucination is in this setting: a confident statement the source never made. Interest rates are a good example. A product page that says "earn up to 2% APY" invites the agent to quote 2%. But the top rate often needs a paid plan or a minimum balance, and the default rate can be much lower or zero. Bancadia's data separates the two: `apy_max` is the best rate the account can pay, `apy_default` is what a customer gets by default, and `plan_tiers` shows what each plan costs and earns. An agent reading those fields doesn't have to guess which number applies to its user. Structured data can also say "I don't know" honestly. In Bancadia's responses, a `null` field means we don't have that data point yet, not that the feature is absent. A page that doesn't mention cash deposit fees just leaves a gap, and a model will often fill it. For financial products, accuracy isn't a nice-to-have. A wrong fee or rate becomes a real decision by a real business, and the agent that recommended it loses that user's trust. ## What should financial institutions take from this? Agents will recommend from whatever data they can get. If the only source for your product is your marketing page, they'll get an expensive, partial and possibly outdated version of it, and that version is what they'll tell their users. If your product is available as fresh, structured, accurate data an agent can query cheaply, that's what gets recommended instead. That's the gap Bancadia fills for business checking: one MCP server that agents query, returning typed, timestamped fields for every listed account. For agent builders, [our integration guides](https://bancadia.com/agent-integrations) show the exact calls. ## FAQ ### What do AI agents need from product data? Four things: freshness, structured and queryable fields, token-efficient lookups, and accuracy. Without them an agent quotes stale terms, can't filter, spends heavily on tokens, and guesses. ### How many more tokens does scraping a product page cost than an MCP query? In one test on October 1, 2026, the raw HTML of five business checking product pages was 305,168 tokens, versus 3,916 for one MCP query covering the same five accounts: about 78 times more. ### How does Bancadia show data freshness? Every listing returned over MCP carries a last_modified timestamp and an is_verified flag, so an agent can tell its user how current a fee or rate is. ### Why do AI agents hallucinate fees and rates? Usually because the source doesn't state the value clearly, so the model infers one. Structured fields with explicit values, and explicit nulls when a value is unknown, remove the need to infer. ## Work with us **For banks, credit unions and fintechs:** Want your products queryable by AI agents? We're onboarding early partners. Email Scott at [scott.macpherson@bancadia.com](mailto:scott.macpherson@bancadia.com). **For agent builders:** connect your agent to Bancadia's MCP server. Start with the [agent integration guides](https://bancadia.com/agent-integrations). --- # Affiliate content was written for a generic reader. AI agents know exactly who they're helping. > Traditional affiliate content, like "The 10 best business checking accounts of 2026", is written for a reader the author knows nothing about, so it has to be broad. AI agents know their user's business in detail and build highly specific queries from it. A listicle can't answer those queries. A structured, queryable data layer can. By Scott Macpherson, Founder, Bancadia (https://bancadia.com/authors/scott-macpherson). Published October 1, 2026. Canonical: https://bancadia.com/articles/affiliate-content-was-built-for-a-generic-reader ## Key takeaways - Affiliate content is broad by necessity: the author has to write one article for every possible reader. - An AI agent knows its user's entity type, location, cash flow, tools and constraints, and turns them into a precise, multi-constraint query. - A ranked list can't answer a query it wasn't written for, and nearly every real query is one it wasn't written for. - The affiliate model of being paid on conversion survives. The article format doesn't. Agents need data that is structured, token-efficient, queryable, fresh and accurate. ## Why is affiliate content so generic? Because the author has no choice. Someone writing "The 10 best business checking accounts" doesn't know who will read it. It might be a freelance designer, a restaurant with three locations, a nonprofit or a venture-backed startup. The article has to be useful to all of them, which means it can't be specific to any of them. So the format settles into a pattern you've seen a thousand times: a ranked list, a "best for" label on each entry ("best for startups", "best for no fees", "best for cash deposits"), a short pros-and-cons box and a button to apply. The "best for" labels are the author's guess at reader segments. The reader is left to work out which segment they belong to, and then to check the fine print themselves. That was a reasonable answer to a real constraint. When the reader is anonymous, broad content is the only content you can write. The constraint is what's changing. ## What does an AI agent know that a content writer doesn't? Almost everything that decides which account fits. An AI CFO, bookkeeping or accounting agent works inside the business's finances. It knows the entity type and state of registration, how revenue arrives, how much of it is cash, what the current bank charges, which accounting software is in use and what the owner has said they want. I go into why that context is so valuable in [the agent is the lead](https://bancadia.com/articles/ai-agents-are-bottom-of-funnel). With that context, an agent doesn't ask "what are the best business checking accounts?" It asks a much narrower question that only makes sense for its user, and it expects an answer that respects every constraint at once. ## Can a "best business checking" listicle answer an AI agent's query? **Hypothetical scenario.** An AI bookkeeping agent works for a food truck run as a two-person partnership, operating in Oregon and across the river in Washington. Most sales are card payments, but the truck also takes cash every day and deposits it weekly. The books run on accounting software. The owners have said they don't want to pay a monthly fee, and they can't tie up more than $100 to open the account. Here's what the agent would send to Bancadia's MCP server: Arguments to `query_business_checking` for one specific business ```json { "entity_types_accepted": ["partnership"], "available_states": ["OR", "WA"], "cash_deposit_available": true, "accounting_integration_available": true, "monthly_fee_max": 0, "minimum_opening_deposit_max": 100, "target_industries": ["restaurant_food_service"] } ``` Then, from what comes back, it compares `cash_deposit_fee_per_100` and `monthly_cash_deposit_limit` against the truck's actual weekly cash, because for this business the cost of depositing cash matters more than almost anything else. Now put that next to the listicle: | What the agent needs to know | What a "10 best" list offers | | --- | --- | | Does the account accept partnerships? | Sometimes mentioned in a pros box, often not at all | | Is it available in both Oregon and Washington? | Rarely stated; online accounts are often assumed to be national | | Can the business deposit cash, and what does it cost per $100? | Maybe a "best for cash deposits" label on one entry; the fee itself is in a PDF | | Is there a monthly cash deposit limit? | Almost never mentioned | | Does it connect to the business's accounting software? | A general "integrates with popular tools" line | | Is the monthly fee $0 for this business, not just with a waiver? | Headline fee only, with waiver conditions in small print | | Is the opening deposit $100 or less? | Sometimes listed | | Which of the accounts that pass all of the above is cheapest for this truck? | Not answerable; the list is ranked once, for everyone | The listicle isn't wrong, exactly. It just answers a different question, the average reader's question, and the agent isn't asking that one. To use the list, the agent would have to read it, follow every link, find each fee schedule, extract the values and do the filtering itself, which is the expensive, error-prone path I measured in [what AI agents need from product data](https://bancadia.com/articles/what-ai-agents-need-from-product-data). ## Why does the old affiliate content model break when the reader is an agent? The value of affiliate content was always the research. A writer read the fee schedules so the reader didn't have to, then packaged the result as an article. The article was just the delivery format, chosen because the reader was a person reading a page. An agent doesn't need the packaging. It needs the research in raw form: every product, every attribute, as typed values it can filter against its user's constraints. Give it an article and it has to undo the packaging to get at the data underneath, and much of the data was never in the article to begin with. There's also a ranking problem. A listicle is ranked once, by its author, for a reader they've never met. An agent ranks for one user, at the moment that user needs an account. Those are different jobs, and only one of them produces the right answer for the person asking. ## Does affiliate marketing survive AI agents? The affiliate model does: being paid when a recommendation turns into a customer. In fact I think it gets stronger, because the agent making the recommendation knows far more than any content writer did. What doesn't survive is the article as the unit of value. In its place, agents need a data layer with five properties: **highly structured**, **token-efficient**, **highly queryable**, **fresh** and **accurate**. I make the case for queryability in [your product data has to keep up](https://bancadia.com/articles/ai-agents-need-filterable-product-data), and for the rest in [what AI agents need from product data](https://bancadia.com/articles/what-ai-agents-need-from-product-data). That's what Bancadia is for business checking. Agents query it over MCP with their user's constraints and get back only the accounts that fit. How results are filtered and ordered is documented on our [methodology page](https://bancadia.com/methodology). ## What should banks and fintechs do with this? Stop counting on a placement in someone else's list as your agent strategy. A spot in "the 10 best" reaches readers who are browsing. It does very little for an agent working out which account fits one business, because the agent can't filter an article. Instead, make sure the attributes that make you the right choice for a specific kind of business are available as structured data agents can query. If your account is great for cash-heavy businesses, that should be a value an agent can filter on, not a "best for" label in an article that ranks you seventh. ## FAQ ### Why is affiliate content written so broadly? Because the author doesn't know who the reader is. One article has to serve every possible reader, so it can't be specific to any of them. ### Can AI agents use "best of" listicles to make recommendations? They can read them, but a listicle answers the average reader's question. An agent asking a multi-constraint question for one specific user has to dig past the article to the underlying data, which is slow and often incomplete. ### Is affiliate marketing dead because of AI? I don't think so. Being paid on conversion fits agent recommendations well. What changes is the format: agents need structured, queryable product data instead of articles. ### What should a bank do instead of chasing listicle placements? Make the product attributes that make it the right choice for specific businesses available as structured data that agents can query and filter on. ## Work with us **For banks, credit unions and fintechs:** Want your products queryable by AI agents? We're onboarding early partners. Email Scott at [scott.macpherson@bancadia.com](mailto:scott.macpherson@bancadia.com). **For agent builders:** connect your agent to Bancadia's MCP server. Start with the [agent integration guides](https://bancadia.com/agent-integrations). --- # Methodology and disclosure > How Bancadia selects and ranks business checking products for AI agents, how commissions work and why they don't affect ranking, what data coverage looks like today, and how data freshness is tracked. Last updated September 29, 2026. Canonical: https://bancadia.com/methodology This page explains how products get into Bancadia's registry, exactly how results are ordered when an agent queries it, how commissions are meant to work, and what the data does and doesn't cover today. [Product discovery is moving to APIs and MCP servers](https://bancadia.com/articles/product-discovery-is-moving-to-apis) explains why we work this way. ## How products get into the registry Bancadia lists US business checking accounts. Today, Bancadia compiles each listing from the institution's own published materials (product pages, fee schedules, terms and rate sheets) and maps it to a typed schema: fees and rates are numbers, eligible entity types and insurance type are fixed values, and no core product attribute is free text. No institution pays to be listed, and no listing is included or excluded because of a commercial relationship. There are no live bank or affiliate partnerships today. Only listings with an active status are returned to agents. Draft, paused and scheduled listings never are. ## How results are ranked When an agent calls `query_business_checking`, results go through three steps: 1. **Eligibility filters.** Every argument the agent sends (entity types, states, fee ceilings, required features) is a hard filter, and a listing that fails any one isn't returned. Array filters require every value: a listing must accept every requested entity type and be available in every requested state. A listing available in `ALL` states matches any state. 2. **Base order: monthly fee, lowest first.** Ties are broken by a fixed internal ID, so the same query returns the same order. 3. **Soft ranking by fit.** If the agent sends `target_industries` or `target_business_profiles`, listings tagged for more of those segments move ahead of the rest, keeping fee order within each group. This step never excludes anything: an untagged listing that passed the filters is still returned, just lower. That's the whole ordering. Commission, payout and commercial relationships are not inputs, and tool responses contain no commission fields. Agents can re-rank results by their own criteria, such as a business's expected net cost, and often should. Segment tags describe who an account is built for, based on the institution's own positioning. A listing can have several tags or none. ## How commissions work Bancadia is built on 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 keep part of it and pass a share to the agent that made the recommendation. Bancadia is paid on conversion only: no impressions, no placement fees, no bidding for position. - **Nothing is live yet.** There are no live bank partnerships, and no commissions are being earned or paid to anyone. - **No published rates.** The split isn't set, and we don't make payout promises. Terms will be agreed per integration as commissions become available. - **Coverage and commissions expand together** as partners come online. ### Why commissions don't drive ranking The ranking described above has no access to commission data, and responses don't carry any, so neither Bancadia's ordering nor the calling agent's model can favor a higher-paying account. When commission terms exist, they'll be kept separate from ranking, and we'll update this page to say how they're disclosed. ### Disclosure Every [agent integration guide](https://bancadia.com/agent-integrations) gives the agent a disclosure line to show its user, for example: "We may earn a commission if you open this account; it doesn't affect which accounts are shown." Application links are Bancadia-controlled `bancadia.com/go/…` redirects that log each click; raw affiliate tracker URLs are never returned. More detail is on the [compliance and disclosure page](https://bancadia.com/compliance). ## What data we have today - **US business checking only.** The MCP server exposes two tools: `query_business_checking` and `get_business_checking_listing`. There are no tools for personal accounts, business savings, money market accounts or CDs today. - **Coverage is early.** The registry covers a limited set of institutions and doesn't include every account offered in a given state. An empty result means there's no match in the registry yet, not that no suitable account exists. - **Some fields are incomplete.** A `null` field means Bancadia doesn't have that data point for the listing yet. It doesn't mean the feature is absent. - **Integrations are category-level.** Filters such as `accounting_integration_available` say whether an account connects to some accounting software, not which one. Named integrations appear as feature text where we have them. ## Data freshness Every listing the MCP server returns carries two freshness signals: - `last_modified`: when the listing's data last changed in the registry. - `is_verified`: set once the listing's fields have been checked against the institution's source documents. Active listings that haven't been updated within 30 days are flagged internally as stale and queued for review. Institutions can change rates and fees at any time without notifying Bancadia. Agents should show the `last_modified` date when quoting a rate, and send users to the institution's application for final terms. To report an error, email [corrections@bancadia.com](mailto:corrections@bancadia.com). ## Related - [Product discovery is moving from web pages to APIs and MCP servers](https://bancadia.com/articles/product-discovery-is-moving-to-apis) - [Articles](https://bancadia.com/articles) - [Agent integration guides](https://bancadia.com/agent-integrations) - [MCP reference](https://bancadia.com/docs/mcp-reference) - [Compliance and disclosure](https://bancadia.com/compliance) --- # Agent integrations > Bancadia plugs into agents that serve small businesses. Each guide below covers when that kind of agent should call Bancadia, how to connect the MCP server, a realistic tool call and response, and how to present the recommendation with a commission disclosure. Canonical: https://bancadia.com/agent-integrations ## Integration guides - [AI CFO agents](https://bancadia.com/agent-integrations/ai-cfo): During cash-position, fee and yield reviews, recommend an account that fits how the business actually holds and moves money. Markdown: https://bancadia.com/agent-integrations/ai-cfo.md - [AI bookkeeping agents](https://bancadia.com/agent-integrations/ai-bookkeeper): When onboarding or categorization shows personal and business money mixed together, or fees eating into the books, suggest a dedicated account. Markdown: https://bancadia.com/agent-integrations/ai-bookkeeper.md - [Treasury and cash-management agents](https://bancadia.com/agent-integrations/treasury-cash-management): When optimizing idle cash, fees and account structure, recommend an operating account that matches balance and payment patterns. Markdown: https://bancadia.com/agent-integrations/treasury-cash-management.md - [Entity-formation platforms](https://bancadia.com/agent-integrations/entity-formation): Right after an LLC or corporation is formed, when the founder needs a first business bank account. This is the highest-intent moment. Markdown: https://bancadia.com/agent-integrations/entity-formation.md - [SMB software with embedded agents](https://bancadia.com/agent-integrations/smb-software): Invoicing, payroll, POS and vertical SaaS. When a user connects a bank, gets paid or runs payroll, recommend an account that fits how they operate. Markdown: https://bancadia.com/agent-integrations/smb-software.md - [AI CPA and accounting agents](https://bancadia.com/agent-integrations/ai-cpa): During tax prep, year-end close or advisory reviews, recommend an account as part of the firm's advice, with independence-aware disclosure. Markdown: https://bancadia.com/agent-integrations/ai-cpa.md - [Financial advisor and RIA copilots](https://bancadia.com/agent-integrations/advisor-ria): For advisors serving business owners: when a planning review shows business cash in the wrong kind of account, draft a recommendation for the advisor. Markdown: https://bancadia.com/agent-integrations/advisor-ria.md ## Background - [Product discovery is moving from web pages to APIs and MCP servers](https://bancadia.com/articles/product-discovery-is-moving-to-apis) - [All articles](https://bancadia.com/articles) - [Methodology and disclosure](https://bancadia.com/methodology) - [MCP quickstart](https://bancadia.com/docs/quickstart) - [MCP reference](https://bancadia.com/docs/mcp-reference) --- # Add business checking recommendations to your AI CFO agent > How AI CFO and fractional CFO agents use the Bancadia MCP server to recommend a better-fit business checking account during cash, fee and yield reviews. Canonical: https://bancadia.com/agent-integrations/ai-cfo An AI CFO already sees the business's cash position, what it pays in bank fees and what its idle balance earns. When a review turns up an operating account that charges too much or pays nothing on a large balance, "shop around" isn't useful advice. Bancadia lets the agent name specific accounts that fit, with the fee and rate terms to back up the recommendation. ## When to call Bancadia - A monthly or quarterly cash review shows the business paying maintenance, wire or transaction fees it could avoid. - The operating account holds a large idle balance at a low or zero rate. - Runway or cash-flow planning calls for separating operating cash, reserves and tax set-asides into sub-accounts. - The business expands into new states or changes its entity type (for example, converting to a C-corp), which changes which accounts it qualifies for. ### 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 | | --- | --- | | Entity type (from the books or formation documents) | `entity_types_accepted`, e.g. `["s_corp"]` | | States where the business operates | `available_states`, e.g. `["TX"]` | | Current monthly bank fees | `monthly_fee_max`, set below what it pays today | | Idle balance and target yield | `interest_bearing: true`, `apy_min` (decimal, `0.02` = 2%) | | Needs reserves and tax set-asides | `sub_accounts_supported: true` | | Monthly transaction count | `free_transactions_min` | | Accounting stack | `accounting_integration_available: true` | | Company stage | `target_business_profiles`, e.g. `["established_smb"]` | ## 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": [ "s_corp" ], "available_states": [ "TX" ], "monthly_fee_max": 15, "interest_bearing": true, "apy_min": 0.02, "sub_accounts_supported": true, "accounting_integration_available": true, "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": [ "s_corp" ], "available_states": [ "TX" ], "monthly_fee_max": 15, "interest_bearing": True, "apy_min": 0.02, "sub_accounts_supported": True, "accounting_integration_available": True, "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 Texas S-corp keeps about $180,000 in an account that pays no interest and charges $25 a month. The CFO agent looks for an interest-bearing account at $15 a month or less, with sub-accounts for tax reserves, that connects to accounting software. `tools/call` params ```json { "name": "query_business_checking", "arguments": { "entity_types_accepted": [ "s_corp" ], "available_states": [ "TX" ], "monthly_fee_max": 15, "interest_bearing": true, "apy_min": 0.02, "sub_accounts_supported": true, "accounting_integration_available": true, "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-digital-bank-business-checking-plus", "institution_name": "Example Digital Bank", "product_name": "Business Checking Plus", "monthly_fee": 0, "monthly_fee_waiver_condition": null, "minimum_opening_deposit": 0, "entity_types_accepted": [ "llc", "s_corp", "c_corp", "sole_prop", "partnership" ], "available_states": [ "ALL" ], "target_industries": [], "target_business_profiles": [ "established_smb", "high_growth" ], "insurance_type": "fdic", "sub_accounts_supported": true, "accounting_integration_available": true, "interest_bearing": true, "apy_max": 0.031, "apy_default": 0.031, "plan_tiers": [], "application_url": "https://bancadia.com/go/example-digital-bank/business-checking-plus", "last_modified": "2026-09-15T00:00:00Z", "is_verified": true }, { "listing_slug": "example-bank-business-interest-checking", "institution_name": "Example Bank", "product_name": "Business Interest Checking", "monthly_fee": 15, "monthly_fee_waiver_condition": "Waived with a $10,000 average daily balance", "minimum_opening_deposit": 100, "entity_types_accepted": [ "llc", "s_corp", "c_corp" ], "available_states": [ "TX", "OK", "LA" ], "target_industries": [], "target_business_profiles": [ "established_smb" ], "insurance_type": "fdic", "sub_accounts_supported": true, "accounting_integration_available": true, "interest_bearing": true, "apy_max": 0.025, "apy_default": 0.0125, "plan_tiers": [ { "plan_name": "Standard", "monthly_fee": 15, "apy": 0.0125, "apy_condition": null, "is_default": true }, { "plan_name": "Premier", "monthly_fee": 40, "apy": 0.025, "apy_condition": "Premier plan subscription required", "is_default": false } ], "application_url": "https://bancadia.com/go/example-bank/business-interest-checking", "last_modified": "2026-09-15T00:00:00Z", "is_verified": true } ] ``` ### What the fields mean for this agent | Field | How to use it | | --- | --- | | `apy_default` | The rate the business earns without upgrading. Compare this, not `apy_max`, against what the current account pays. | | `apy_max / plan_tiers` | `apy_min` filters on the best available rate. When `apy_default` is lower, `plan_tiers` shows which tier and monthly fee the top rate requires. `monthly_fee_max` filters on the base fee only, so include the tier fee in your math. | | `monthly_fee_waiver_condition` | Free text. Check it against the balance the business actually keeps. | | `sub_accounts_supported` | Confirms reserves and tax set-asides can sit in the same account relationship. | | `last_modified / is_verified` | Freshness signals. Show the date whenever you quote a rate. | ### Going deeper on one listing Before recommending a switch, call `get_business_checking_listing` with the `listing_slug` to pull `general_fees` and per-tier `fees` (overdraft, NSF, excess-transaction and dormancy charges). A CFO recommendation should net expected annual fees against interest earned, not compare headline fees alone. 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 company's CFO agent. During cash and fee reviews, if the operating account costs more or earns less than a better-fit alternative, you may recommend a business checking account using the Bancadia tools. - Call query_business_checking with the company's entity type, state and requirements. Never recommend an account the tools didn't return. - Compare on the company's real numbers: estimated annual fees minus interest earned at apy_default (not apy_max, unless the company will qualify for the tier that pays it). - Recommend at most two accounts and give the reason each one fits. - Link only to the application_url returned by the tool. - End every recommendation with: "We may earn a commission if you open this account; it doesn't affect which accounts are shown." - Switching banks is the owner's decision. Never open accounts or move money yourself. ``` What the end user sees ```text Your operating account charged $300 in maintenance fees over the last 12 months and earned nothing on an average balance of about $180,000. Business Checking Plus from Example Digital Bank has no monthly fee and pays 3.10% APY by default, about $5,600 a year at your current balance. It supports sub-accounts, so your quarterly tax reserve can sit alongside operating cash, and it connects to accounting software. Apply: https://bancadia.com/go/example-digital-bank/business-checking-plus (Rate data last updated September 15, 2026.) 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. Results are filtered by the arguments you send, ordered by monthly fee (lowest first), then reordered by how many of your `target_industries` and `target_business_profiles` each listing is tagged for. Commission isn't an input, and responses contain no commission fields. A CFO agent will usually re-sort the shortlist by its own net-cost math, which is the right thing to do. ### Should my agent rank by apy_max? Usually not. `apy_max` is the best rate the account can pay, often only on a paid tier or under a balance condition. Rank on `apy_default`, or on the tier the business will actually use, from `plan_tiers`. ### What data do I need to send? Only filter criteria: entity type, states, fee ceilings and feature requirements. The tool has no fields for company names, balances, EINs or account numbers. Keep balances in your own system and use them to compare the results locally. ### How fresh is the rate data? `last_modified` is when the listing last changed in the registry, and `is_verified` means Bancadia has checked it against the institution's published terms. Rates can change at any time, so show the date whenever you quote a rate. See [data freshness](https://bancadia.com/methodology#data-freshness). ### Which products are covered today? US business checking accounts, including interest-bearing checking. Business savings, money market accounts and CDs aren't available through the MCP server yet. Coverage is early, so an empty result can mean the registry has no match yet, not that none exists. ## 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). --- # Add business checking recommendations to your AI bookkeeping agent > How AI bookkeeping agents use the Bancadia MCP server to recommend a business checking account when onboarding or categorization reveals commingled funds or avoidable fees. Canonical: https://bancadia.com/agent-integrations/ai-bookkeeper A bookkeeping agent sees the problem before anyone else: personal groceries and business software on the same account, or a sole proprietor paying monthly fees on a personal account used for business. A separate business account makes the books cleaner and tax time simpler, and the agent can name one that connects to the ledger it already keeps. ## When to call Bancadia - During onboarding, the only connected accounts are personal accounts, or there is no dedicated business account at all. - Categorization keeps flagging commingled transactions: personal spending in the business account, or business income landing in a personal one. - Bank fees show up as a recurring expense category, such as maintenance, excess-transaction or paper-statement fees. - The client adds a new revenue stream or entity and needs a separate account to keep it clean. ### 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 | | --- | --- | | Entity type from onboarding | `entity_types_accepted`, e.g. `["sole_prop"]` or `["llc"]` | | Business address state | `available_states` | | Monthly transaction count from the bank feed | `free_transactions_min` | | Bank fees categorized in the ledger | `monthly_fee_max` | | Ledger software the client uses | `accounting_integration_available: true` | | Receipt and expense tooling in use | `expense_integration_available: true` | | Business type and stage | `target_industries`, `target_business_profiles`, e.g. `["side_hustle"]` | ## 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": [ "NY" ], "monthly_fee_max": 0, "free_transactions_min": 60, "accounting_integration_available": true, "target_industries": [ "content_creator_solopreneur" ], "target_business_profiles": [ "bootstrapped_solopreneur" ] }, }) // 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": [ "NY" ], "monthly_fee_max": 0, "free_transactions_min": 60, "accounting_integration_available": True, "target_industries": [ "content_creator_solopreneur" ], "target_business_profiles": [ "bootstrapped_solopreneur" ] }, ) 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 freelance video editor in New York runs a single-member LLC through a personal checking account. The bookkeeping agent sees about 60 business transactions a month mixed in with personal spending. It looks for a no-fee account that accepts LLCs, covers that volume and connects to accounting software. `tools/call` params ```json { "name": "query_business_checking", "arguments": { "entity_types_accepted": [ "llc" ], "available_states": [ "NY" ], "monthly_fee_max": 0, "free_transactions_min": 60, "accounting_integration_available": true, "target_industries": [ "content_creator_solopreneur" ], "target_business_profiles": [ "bootstrapped_solopreneur" ] } } ``` 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-digital-bank-freelancer-business-checking", "institution_name": "Example Digital Bank", "product_name": "Freelancer Business Checking", "monthly_fee": 0, "monthly_fee_waiver_condition": null, "minimum_opening_deposit": 0, "entity_types_accepted": [ "llc", "sole_prop" ], "available_states": [ "ALL" ], "target_industries": [ "content_creator_solopreneur" ], "target_business_profiles": [ "bootstrapped_solopreneur", "side_hustle" ], "insurance_type": "fdic", "free_transactions_per_month": 200, "per_transaction_fee_after_limit": 0.25, "accounting_integration_available": true, "expense_integration_available": true, "application_url": "https://bancadia.com/go/example-digital-bank/freelancer-business-checking", "last_modified": "2026-09-15T00:00:00Z", "is_verified": true }, { "listing_slug": "example-bank-simple-business-checking", "institution_name": "Example Bank", "product_name": "Simple Business Checking", "monthly_fee": 0, "monthly_fee_waiver_condition": null, "minimum_opening_deposit": 25, "entity_types_accepted": [ "llc", "s_corp", "sole_prop", "partnership" ], "available_states": [ "NY", "NJ", "CT" ], "target_industries": [], "target_business_profiles": [ "established_smb" ], "insurance_type": "fdic", "free_transactions_per_month": 100, "per_transaction_fee_after_limit": 0.5, "accounting_integration_available": true, "expense_integration_available": false, "application_url": "https://bancadia.com/go/example-bank/simple-business-checking", "last_modified": "2026-09-15T00:00:00Z", "is_verified": true } ] ``` ### What the fields mean for this agent | Field | How to use it | | --- | --- | | `target_industries / target_business_profiles` | Listings tagged for the segments you sent rank first. The second result isn't tagged for freelancers but passed every filter, so it's still returned. | | `free_transactions_per_month` | Compare against the client's actual monthly count, with headroom for busy months. | | `per_transaction_fee_after_limit` | What each transaction over the free allowance costs. | | `accounting_integration_available` | Category-level: the account connects to some accounting software, not necessarily the client's. Check the listing detail before naming a specific product. | | `minimum_opening_deposit` | Matters for new solo businesses that don't have much cash on hand. | ### Going deeper on one listing Call `get_business_checking_listing` on the top result. Check `general_features` in the `platform_integrations` category for named integrations, and `general_fees` for paper-statement or excess-transaction fees, before recommending it. 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 a bookkeeping agent. If onboarding or categorization shows a client mixing personal and business money, or paying avoidable bank fees, you may suggest opening a dedicated business checking account. - Explain the bookkeeping reason first (cleaner books, simpler tax prep), then suggest an account. Keep it short, and don't repeat the suggestion every session if the client declines. - Use query_business_checking with the client's entity type, state and monthly transaction count. Only recommend accounts the tool returned. - Say whether the account connects to accounting software, but don't name a specific integration (like QuickBooks) unless the listing detail does. - Link only to the application_url returned by the tool. - Always 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 About 40% of the transactions in your personal checking account this month were for your business. A separate business account would make categorizing faster and tax time simpler. One option: Freelancer Business Checking from Example Digital Bank. It accepts single-member LLCs in New York, has no monthly fee, includes 200 free transactions a month (you average about 60) and connects to accounting software. Apply: https://bancadia.com/go/example-digital-bank/freelancer-business-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 to ordering and isn't in the response. Results are filtered by your arguments, ordered by monthly fee, then moved toward listings tagged for the industry and business profile you send. The full rules are on the [methodology page](https://bancadia.com/methodology). ### Can I filter by a specific accounting package, like QuickBooks or Xero? Not today. `accounting_integration_available` is category-level. Where Bancadia has named integrations for a listing, they appear as feature text in `get_business_checking_listing`, which your agent can read before naming one. ### What client data leaves my system? Only the arguments you pass: entity type, state, and numeric or yes/no requirements. Don't send names, transactions or account numbers; the schema has no fields for them. Bancadia logs the arguments with your token so it can report which listings were returned. ### Can a sole proprietor open a business checking account? Many accounts accept sole proprietors. Pass `entity_types_accepted: ["sole_prop"]` and only accounts that list sole proprietors are returned. Document requirements, such as an EIN or a DBA filing, vary by institution and aren't fields in the registry today, so point users to the institution's application for specifics. ### Which products are covered today? US business checking only, and coverage is early. If a query returns nothing, relax the fee or transaction filters before concluding there's no fit. ## 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). --- # Add business checking recommendations to your treasury or cash-management agent > How treasury and cash-management agents use the Bancadia MCP server to recommend operating accounts that match a business's balances, payment rails and account structure. Canonical: https://bancadia.com/agent-integrations/treasury-cash-management Treasury agents decide where cash should sit: how much stays liquid for operations, how much earns yield, and how it moves between accounts. The operating account is the base of that structure. When it earns nothing, can't separate funds or moves money slowly, a treasury agent can recommend an account that fits the business's balances and payment patterns instead of a generic "consider a high-yield option." ## When to call Bancadia - Idle operating cash sits well above the business's monthly burn and earns little or nothing. - The business needs separate buckets for payroll, reserves and taxes, and its current account can't create sub-accounts. - Vendors or payroll need same-day settlement, so real-time payment rails (RTP, FedNow) are a requirement. - Wire volume is high enough that wire fees are a line item worth reducing. - Balances exceed deposit insurance coverage at one institution ($250,000 per depositor, per insured bank, per ownership category), so the business wants a second operating account. ### 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 | | --- | --- | | Average daily balance and monthly burn | `interest_bearing: true`, `apy_min`. There's no balance argument, so compare yields against the balance locally. | | Needs segregated buckets | `sub_accounts_supported: true` | | Same-day payment requirements | `rtp_supported: true`, or `rtp_network`: `"fednow"`, `"rtp_network"` or `"both"` | | Monthly payment and transfer volume | `free_transactions_min` | | Deposit insurance requirement | `insurance_type: "fdic"` | | Entity type and operating states | `entity_types_accepted`, `available_states` | | Funding stage | `target_business_profiles`, e.g. `["vc_backed", "high_growth"]` | ## 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": [ "c_corp" ], "available_states": [ "CA" ], "insurance_type": "fdic", "interest_bearing": true, "sub_accounts_supported": true, "rtp_network": "both", "free_transactions_min": 250, "target_industries": [ "saas_tech" ], "target_business_profiles": [ "vc_backed", "high_growth" ] }, }) // 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": [ "c_corp" ], "available_states": [ "CA" ], "insurance_type": "fdic", "interest_bearing": True, "sub_accounts_supported": True, "rtp_network": "both", "free_transactions_min": 250, "target_industries": [ "saas_tech" ], "target_business_profiles": [ "vc_backed", "high_growth" ] }, ) 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 venture-backed C-corp in California holds $2.4M after a raise, pays vendors by same-day transfer, and wants operating cash, payroll and a runway reserve kept separate. The treasury agent looks for an FDIC-insured, interest-bearing account with sub-accounts and both real-time rails. `tools/call` params ```json { "name": "query_business_checking", "arguments": { "entity_types_accepted": [ "c_corp" ], "available_states": [ "CA" ], "insurance_type": "fdic", "interest_bearing": true, "sub_accounts_supported": true, "rtp_network": "both", "free_transactions_min": 250, "target_industries": [ "saas_tech" ], "target_business_profiles": [ "vc_backed", "high_growth" ] } } ``` 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-digital-bank-startup-treasury-checking", "institution_name": "Example Digital Bank", "product_name": "Startup Treasury Checking", "monthly_fee": 0, "monthly_fee_waiver_condition": null, "minimum_opening_deposit": 0, "entity_types_accepted": [ "llc", "s_corp", "c_corp" ], "available_states": [ "ALL" ], "target_industries": [ "saas_tech" ], "target_business_profiles": [ "vc_backed", "high_growth", "early_stage_startup" ], "insurance_type": "fdic", "free_transactions_per_month": 500, "sub_accounts_supported": true, "rtp_supported": true, "rtp_network": "both", "interest_bearing": true, "apy_max": 0.035, "apy_default": 0.02, "outgoing_domestic_wire_fee": 0, "positive_pay_available": true, "ach_debit_block_available": true, "plan_tiers": [ { "plan_name": "Standard", "monthly_fee": 0, "apy": 0.02, "apy_max_balance_eligible": null, "apy_condition": null, "is_default": true }, { "plan_name": "Plus", "monthly_fee": 35, "apy": 0.035, "apy_max_balance_eligible": 1000000, "apy_condition": "Rate applies to balances up to $1,000,000", "is_default": false } ], "application_url": "https://bancadia.com/go/example-digital-bank/startup-treasury-checking", "last_modified": "2026-09-15T00:00:00Z", "is_verified": true }, { "listing_slug": "example-bank-commercial-checking", "institution_name": "Example Bank", "product_name": "Commercial Checking", "monthly_fee": 20, "monthly_fee_waiver_condition": "Waived with a $25,000 average collected balance", "minimum_opening_deposit": 1000, "entity_types_accepted": [ "llc", "s_corp", "c_corp", "partnership", "nonprofit" ], "available_states": [ "CA", "OR", "WA" ], "target_industries": [], "target_business_profiles": [ "established_smb" ], "insurance_type": "fdic", "free_transactions_per_month": 300, "sub_accounts_supported": true, "rtp_supported": true, "rtp_network": "both", "interest_bearing": true, "apy_max": 0.015, "apy_default": 0.015, "outgoing_domestic_wire_fee": 25, "positive_pay_available": true, "ach_debit_block_available": true, "plan_tiers": [], "application_url": "https://bancadia.com/go/example-bank/commercial-checking", "last_modified": "2026-09-15T00:00:00Z", "is_verified": true } ] ``` ### What the fields mean for this agent | Field | How to use it | | --- | --- | | `apy_default / plan_tiers[].apy` | The first listing pays 2.00% by default and 3.50% on its $35/month Plus tier. At $2.4M the tier pays for itself, but `apy_max_balance_eligible` caps the higher rate at $1,000,000. | | `rtp_network` | `both` means the account supports RTP and FedNow. Filter on `rtp_supported: true` instead if either rail is acceptable. | | `positive_pay_available / ach_debit_block_available` | Fraud controls that most treasury policies require at this balance. | | `outgoing_domestic_wire_fee` | Multiply by the business's monthly wire count to compare real costs. | | `insurance_type` | FDIC coverage is $250,000 per depositor, per insured bank, per ownership category. At seven figures, explain the limit rather than imply the full balance is insured. | ### Going deeper on one listing Call `get_business_checking_listing` on the shortlist to read per-tier `fees` and `features`: wire, overdraft and excess-transaction fees, plus any feature notes on sweeps or payment rails. These often decide a treasury recommendation. 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 a treasury agent. When a review shows idle cash earning little, a need for segregated sub-accounts, or payment rails the current account lacks, you may recommend a business checking account using the Bancadia tools. - Query with hard requirements (entity type, state, insurance, sub-accounts, payment rails). Evaluate yield against the company's actual balance locally, using plan_tiers and apy_max_balance_eligible, not apy_max alone. - State FDIC/NCUA coverage limits plainly when balances exceed them. Never imply a balance above the limit is fully insured. - Recommend a structure (which account, which tier, which sub-accounts) and show the annual math. Only use accounts the tool returned. - 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." - Never move funds without explicit approval. ``` What the end user sees ```text Your $2.4M sits in one account earning 0.10%. Here's a structure that puts more of it to work: 1. Open Startup Treasury Checking from Example Digital Bank on its Plus tier ($35/month). It pays 3.50% APY on balances up to $1,000,000 and supports sub-accounts, so operating cash, payroll and your runway reserve can be kept separate. It also supports RTP and FedNow for same-day vendor payments. 2. Decide where the remaining $1.4M should sit. FDIC insurance covers $250,000 per depositor, per bank, per ownership category, so most of this balance isn't insured at any single bank today. On the first $1,000,000, the Plus tier would earn about $35,000 a year, compared with about $1,000 at today's rate. The tier costs $420 a year. Apply: https://bancadia.com/go/example-digital-bank/startup-treasury-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. Hard filters decide eligibility, results are ordered by monthly fee, and the stage and industry arguments move matching listings ahead of the rest. Commission isn't an input and isn't in the response. A treasury agent should re-rank the shortlist on its own net-yield math. ### Can I filter by balance, or ask what an account pays at $2M? Not directly. There's no balance argument today. Filter on `interest_bearing` and `apy_min`, then compute yield locally from `apy_default` and `plan_tiers` (`apy`, `apy_max_balance_eligible`, `apy_condition`). ### Does Bancadia cover sweep programs or extended deposit insurance? Not as structured fields. `insurance_type` records FDIC, NCUA or uninsured. Where a listing's detail mentions a sweep or extended-coverage program, it appears in feature text from `get_business_checking_listing`, which your agent should read rather than assume. ### What data do I need to send? Filter criteria only. Balances, burn and cash forecasts stay in your system; nothing in the schema accepts them. The arguments you send are logged with your token. ### How current is the rate data? Each listing carries `last_modified` and `is_verified`. Deposit rates change often, so show the date next to any rate you quote and re-query before acting on a move. See [data freshness](https://bancadia.com/methodology#data-freshness). ## 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). --- # Add business checking recommendations to your entity-formation or incorporation agent > How LLC and corporation formation platforms use the Bancadia MCP server to recommend a first business checking account right after formation, filtered by entity type and operating state. Canonical: https://bancadia.com/agent-integrations/entity-formation Right after an LLC or corporation is formed, the founder needs somewhere to put the business's money, and most post-formation checklists put "open a business bank account" near the top. It's the highest-intent moment on this list. The formation agent already knows the entity type, the state and often the company's stage, and those are the facts that decide eligibility. ## When to call Bancadia - Formation documents are filed and the EIN is issued, so the next checklist step is a business bank account. - The founder asks "where should I bank?" or "what do I need to open an account?" inside the formation flow. - A foreign qualification or conversion (for example, LLC to C-corp before a raise) changes which accounts the entity qualifies for. - A compliance-reminder or registered-agent flow notices the founder still hasn't set up a business account. ### 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 | | --- | --- | | Entity type just formed | `entity_types_accepted`, e.g. `["llc"]` | | State where the business will operate (may differ from the formation state) | `available_states` | | Founder's expected opening deposit | `minimum_opening_deposit_max` | | Pre-revenue and fee-sensitive | `monthly_fee_max: 0` | | Industry from the formation questionnaire | `target_industries`, e.g. `["ecommerce"]` | | Stage and funding plans | `target_business_profiles`, e.g. `["early_stage_startup"]` | ## 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": [ "OH" ], "monthly_fee_max": 0, "minimum_opening_deposit_max": 100, "target_industries": [ "ecommerce" ], "target_business_profiles": [ "early_stage_startup" ] }, }) // 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": [ "OH" ], "monthly_fee_max": 0, "minimum_opening_deposit_max": 100, "target_industries": [ "ecommerce" ], "target_business_profiles": [ "early_stage_startup" ] }, ) 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 founder just formed a Delaware LLC for an ecommerce business run from Ohio. The formation agent knows the entity type, operating state and industry, and that the founder plans to open the account with about $100. `tools/call` params ```json { "name": "query_business_checking", "arguments": { "entity_types_accepted": [ "llc" ], "available_states": [ "OH" ], "monthly_fee_max": 0, "minimum_opening_deposit_max": 100, "target_industries": [ "ecommerce" ], "target_business_profiles": [ "early_stage_startup" ] } } ``` 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-digital-bank-business-checking", "institution_name": "Example Digital Bank", "product_name": "Business Checking", "monthly_fee": 0, "monthly_fee_waiver_condition": null, "minimum_opening_deposit": 0, "entity_types_accepted": [ "llc", "s_corp", "c_corp", "sole_prop" ], "available_states": [ "ALL" ], "target_industries": [ "ecommerce", "small_business_digital_first" ], "target_business_profiles": [ "early_stage_startup", "bootstrapped_solopreneur" ], "insurance_type": "fdic", "physical_debit_card_available": true, "promotions": [ { "bonus_amount": 300, "condition_description": "Deposit $2,500 within 60 days of opening", "minimum_deposit": 2500, "expiry_date": "2026-12-31", "promo_url": null } ], "application_url": "https://bancadia.com/go/example-digital-bank/business-checking", "last_modified": "2026-09-15T00:00:00Z", "is_verified": true }, { "listing_slug": "example-credit-union-small-business-checking", "institution_name": "Example Credit Union", "product_name": "Small Business Checking", "monthly_fee": 0, "monthly_fee_waiver_condition": null, "minimum_opening_deposit": 25, "entity_types_accepted": [ "llc", "sole_prop", "partnership" ], "available_states": [ "OH" ], "target_industries": [], "target_business_profiles": [ "early_stage_startup" ], "insurance_type": "ncua", "physical_debit_card_available": true, "promotions": [], "application_url": "https://bancadia.com/go/example-credit-union/small-business-checking", "last_modified": "2026-09-15T00:00:00Z", "is_verified": true } ] ``` ### What the fields mean for this agent | Field | How to use it | | --- | --- | | `available_states` | `["ALL"]` means available nationwide. Filter on where the business operates, not where it was formed: a Delaware LLC run from Ohio needs an account offered in Ohio. | | `minimum_opening_deposit` | New businesses often start with little cash, so show this up front. | | `entity_types_accepted` | The entity types the account accepts. Required documents (EIN letter, operating agreement) aren't fields today, so link to the institution for specifics. | | `promotions` | Opening bonuses and their conditions. Always present the condition with the bonus, never the bonus alone. | ### Going deeper on one listing For the account the founder picks, call `get_business_checking_listing` to surface the fees that catch new businesses out, such as minimum-balance, paper-statement and dormancy fees in `general_fees`. 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 help founders form companies. After formation is complete, you may help the founder choose a business checking account using the Bancadia tools. - Query with the new entity type and the state where the business will operate (not only the formation state). Present at most three options, only from the tool's results. - For each option, say why it fits a brand-new business: opening deposit, monthly fee, and any condition attached to a bonus. - Opening an account is optional and separate from formation. Never imply it's required to use your service, or that you've opened it for them. - Link only to the application_url returned by the tool. - Include: "We may earn a commission if you open one of these accounts; it doesn't affect which accounts are shown." ``` What the end user sees ```text Your LLC is formed. A good next step is a business bank account, so company money stays separate from yours. Based on your LLC, your Ohio operations and your ecommerce business, here are two options with no monthly fee: - Business Checking from Example Digital Bank: $0 to open. It offers a $300 bonus if you deposit $2,500 within 60 days (offer ends December 31). - Small Business Checking from Example Credit Union: $25 to open, and NCUA-insured. Apply (Example Digital Bank): https://bancadia.com/go/example-digital-bank/business-checking Apply (Example Credit Union): https://bancadia.com/go/example-credit-union/small-business-checking We may earn a commission if you open one of these accounts; 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. Eligibility comes from your filters, and ordering is by monthly fee, with listings tagged for the founder's industry and stage moved up. Commission isn't an input, and a listing with an opening bonus gets no ranking boost from it. ### Should I filter on the formation state or the operating state? The operating state. `available_states` lists where the institution offers the account, and many founders form in Delaware or Wyoming but run the business elsewhere. If the business operates in several states, pass all of them: only listings available in every state you list are returned. ### What data do I need to send? Entity type and operating state are enough for a useful result, and industry and stage improve the ordering. Don't send the founder's name, EIN or address; the tool has no fields for them. ### Can my agent open the account for the founder? No. Bancadia returns product data and an `application_url`, and the founder applies directly with the institution. There is no account-opening or identity-verification flow through the MCP server. ### Which products are covered today? US business checking only. Business savings and other products founders need soon after formation aren't available through the MCP server yet, and checking coverage itself is still early. ## 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). --- # 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). --- # Add business checking recommendations to your AI CPA or accounting agent > How AI CPA, accounting and tax agents use the Bancadia MCP server to recommend a business checking account as part of advisory work, with disclosure that respects CPA independence obligations. Canonical: https://bancadia.com/agent-integrations/ai-cpa Tax prep, year-end close and advisory reviews are where structural problems surface: owner draws and personal expenses running through the business account, an S-corp with no dedicated account, or fees that don't fit the entity. Recommending a business checking account at that point is advice, and it should read like advice from the firm, with the firm's independence obligations kept in view. ## When to call Bancadia - Tax prep finds commingled funds (personal and business activity in the same account), which makes deductions harder to substantiate. - Year-end close shows the entity has no dedicated business account, or a business that recently elected S-corp status is still banking like a sole proprietorship. - An advisory review finds an account structure that doesn't fit the entity: no separate account for payroll or tax reserves, or fees out of proportion to activity. - An engagement letter or onboarding checklist includes "separate business and personal finances." ### 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 | | --- | --- | | Entity type and tax classification | `entity_types_accepted`, e.g. `["s_corp"]` | | Client's state | `available_states` | | Bank fees found in the review | `monthly_fee_max` | | Tax software the firm uses | `tax_integration_available: true` | | Ledger sync | `accounting_integration_available: true` | | Needs a tax reserve | `sub_accounts_supported: true` | | Client's industry | `target_industries`, e.g. `["professional_services"]` | ## 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": [ "s_corp" ], "available_states": [ "MA" ], "monthly_fee_max": 15, "sub_accounts_supported": true, "accounting_integration_available": true, "tax_integration_available": true, "target_industries": [ "professional_services" ] }, }) // 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": [ "s_corp" ], "available_states": [ "MA" ], "monthly_fee_max": 15, "sub_accounts_supported": True, "accounting_integration_available": True, "tax_integration_available": True, "target_industries": [ "professional_services" ] }, ) 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 During year-end close for a Massachusetts consulting business that elected S-corp status this year, the CPA agent finds owner draws, personal expenses and business income running through one personal account. It looks for a low-fee account that accepts S-corps, supports a separate tax reserve and connects to accounting and tax software. `tools/call` params ```json { "name": "query_business_checking", "arguments": { "entity_types_accepted": [ "s_corp" ], "available_states": [ "MA" ], "monthly_fee_max": 15, "sub_accounts_supported": true, "accounting_integration_available": true, "tax_integration_available": true, "target_industries": [ "professional_services" ] } } ``` 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-digital-bank-business-checking-for-professionals", "institution_name": "Example Digital Bank", "product_name": "Business Checking for Professionals", "monthly_fee": 0, "monthly_fee_waiver_condition": null, "minimum_opening_deposit": 0, "entity_types_accepted": [ "llc", "s_corp", "c_corp", "sole_prop", "partnership" ], "available_states": [ "ALL" ], "target_industries": [ "professional_services" ], "target_business_profiles": [ "established_smb", "bootstrapped_solopreneur" ], "insurance_type": "fdic", "sub_accounts_supported": true, "accounting_integration_available": true, "tax_integration_available": true, "expense_integration_available": true, "application_url": "https://bancadia.com/go/example-digital-bank/business-checking-for-professionals", "last_modified": "2026-09-15T00:00:00Z", "is_verified": true }, { "listing_slug": "example-bank-professional-services-checking", "institution_name": "Example Bank", "product_name": "Professional Services Checking", "monthly_fee": 12, "monthly_fee_waiver_condition": "Waived with a $2,500 minimum daily balance", "minimum_opening_deposit": 100, "entity_types_accepted": [ "llc", "s_corp", "c_corp", "partnership" ], "available_states": [ "MA", "NH", "RI" ], "target_industries": [ "professional_services", "healthcare_practice" ], "target_business_profiles": [ "established_smb" ], "insurance_type": "fdic", "sub_accounts_supported": true, "accounting_integration_available": true, "tax_integration_available": true, "expense_integration_available": false, "application_url": "https://bancadia.com/go/example-bank/professional-services-checking", "last_modified": "2026-09-15T00:00:00Z", "is_verified": true } ] ``` ### What the fields mean for this agent | Field | How to use it | | --- | --- | | `entity_types_accepted` | Institutions classify an LLC taxed as an S-corp differently. If an `["s_corp"]` query comes back thin, run a second query with `["llc"]` and confirm eligibility on the institution's application. | | `sub_accounts_supported` | Lets the client hold estimated-tax and payroll-tax reserves separately. Often the most useful part of the recommendation. | | `tax_integration_available` | Category-level: the account connects to some tax-prep or filing software. Confirm the firm's software in the listing detail before saying so. | | `monthly_fee_waiver_condition` | Check the waiver against the balance the client will actually keep. | ### Going deeper on one listing Before the recommendation goes into client-facing advice, call `get_business_checking_listing` and review `general_fees` (overdraft, NSF, returned-item) so the firm isn't recommending an account whose fees recreate the problem. 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 an accounting and tax agent working on behalf of [Firm]. During tax prep, year-end close or advisory reviews, if you find commingled funds, no dedicated business account, or an account structure that doesn't fit the entity, you may recommend a business checking account as part of your advice. - Lead with the finding and why it matters (substantiation, a cleaner close, tax-reserve planning). The account recommendation is secondary. - Query with the client's current entity classification and state. Recommend at most two accounts, only from the tool's results. - Do not make commission-bearing recommendations to clients the firm has flagged as attest clients. - Link only to the application_url returned by the tool. - Always include: "[Firm] may earn a commission if you open this account; it doesn't affect which accounts are shown." ``` What the end user sees ```text Finding: this year, owner draws, personal expenses and business income all ran through your personal checking account. Now that the business is an S-corp, keeping them separate matters more. It makes deductions easier to substantiate and payroll and distributions easier to track. Recommendation: open a dedicated business account with a separate tax reserve. One that fits: Business Checking for Professionals from Example Digital Bank. It accepts S-corps in Massachusetts, has no monthly fee, supports sub-accounts for estimated-tax reserves, and connects to accounting and tax software. Apply: https://bancadia.com/go/example-digital-bank/business-checking-for-professionals [Firm] 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. ## Independence and disclosure for CPA firms CPAs and accounting firms are subject to professional rules on commissions, referral fees and independence, including the AICPA Code of Professional Conduct and state board rules. Under the AICPA Code, a member generally can't accept a commission for recommending a product to a client for whom the firm performs certain attest services, and permitted commissions must be disclosed to the client. Whether a commission share is acceptable for a given client is the firm's decision, not Bancadia's. - Treat the recommendation as advisory. Explain the accounting reason before naming any account. - Disclose the commission relationship in plain language, plus anything else your firm's rules require. - Exclude attest clients from commission-bearing recommendations, or don't accept the commission for them. - The recommendation is the firm's advice. Bancadia supplies product data and never contacts your clients. Bancadia doesn't provide legal or professional-ethics advice. Confirm your approach with your firm's compliance counsel. ## 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 a ranking input and doesn't appear in responses, so the agent can't favor a higher-paying account. Ordering is by monthly fee, with listings tagged for the client's industry moved up. See the [methodology](https://bancadia.com/methodology). ### Can a CPA firm accept a commission share? It depends on the client and the services the firm provides. Commissions from attest clients are generally prohibited under the AICPA Code, and permitted commissions must be disclosed. Your firm decides. Commissions aren't live yet, so there's nothing to accept today, and the data is free to use with no commission arrangement. ### What client data leaves the firm? Only the query arguments: entity type, state, and requirements like tax-software connectivity. No client names, SSNs, EINs, balances or transactions; the schema has no fields for them. Arguments are logged against your token. ### How should an LLC taxed as an S-corp be queried? Institutions classify these differently. Array filters require every value you pass, so run separate queries rather than one with both: start with `["s_corp"]`, and if results are thin, query `["llc"]` and confirm eligibility on the institution's application. ### Which products are covered today? US business checking only. Coverage is early, so treat an empty result as "no match in the registry yet," not "no suitable account exists." ## 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). --- # Add business checking recommendations to your advisor or RIA copilot > How advisor and RIA copilots use the Bancadia MCP server to recommend a business checking account for business-owner clients, with fiduciary-aware disclosure. Canonical: https://bancadia.com/agent-integrations/advisor-ria Advisors who serve business owners usually see the personal half of the balance sheet in detail and the business half only in passing. When a planning review shows business cash sitting in the wrong kind of account, a copilot can draft a recommendation for a business checking account that fits, with the conflict-of-interest disclosure the advisory relationship requires. ## When to call Bancadia - An annual review or financial plan shows business operating cash held in a personal account, or no separation between the two. - Cash-flow planning shows a large idle balance in a business account that pays no interest. - A client starts, buys or restructures a business and asks where it should bank. - Exit or succession planning calls for cleaner business financials. ### 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 | | --- | --- | | Business entity type | `entity_types_accepted` | | Business state | `available_states` | | Business balance in the plan | `interest_bearing: true`, `apy_min` | | Business bank fees in the review | `monthly_fee_max` | | Deposit insurance preference | `insurance_type` | | Business industry and stage | `target_industries`, `target_business_profiles`, e.g. `["real_estate"]` | ## 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": [ "FL" ], "insurance_type": "fdic", "interest_bearing": true, "monthly_fee_max": 10, "target_industries": [ "real_estate" ], "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": [ "FL" ], "insurance_type": "fdic", "interest_bearing": True, "monthly_fee_max": 10, "target_industries": [ "real_estate" ], "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 client owns a real estate brokerage in Florida, organized as an LLC, and keeps $120,000 of operating cash in a business account that earns nothing. The advisor's copilot looks for an FDIC-insured, interest-bearing business account with a monthly fee of $10 or less. `tools/call` params ```json { "name": "query_business_checking", "arguments": { "entity_types_accepted": [ "llc" ], "available_states": [ "FL" ], "insurance_type": "fdic", "interest_bearing": true, "monthly_fee_max": 10, "target_industries": [ "real_estate" ], "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-interest-checking", "institution_name": "Example Bank", "product_name": "Business Interest Checking", "monthly_fee": 10, "monthly_fee_waiver_condition": "Waived with a $15,000 average daily balance", "minimum_opening_deposit": 100, "entity_types_accepted": [ "llc", "s_corp", "c_corp", "partnership" ], "available_states": [ "FL", "GA" ], "target_industries": [ "real_estate", "professional_services" ], "target_business_profiles": [ "established_smb" ], "insurance_type": "fdic", "institution": { "display_name": "Example Bank", "institution_type": "community_bank" }, "interest_bearing": true, "apy_max": 0.0225, "apy_default": 0.0225, "application_url": "https://bancadia.com/go/example-bank/business-interest-checking", "last_modified": "2026-09-15T00:00:00Z", "is_verified": true }, { "listing_slug": "example-digital-bank-business-checking", "institution_name": "Example Digital Bank", "product_name": "Business Checking", "monthly_fee": 0, "monthly_fee_waiver_condition": null, "minimum_opening_deposit": 0, "entity_types_accepted": [ "llc", "s_corp", "c_corp", "sole_prop" ], "available_states": [ "ALL" ], "target_industries": [], "target_business_profiles": [], "insurance_type": "fdic", "institution": { "display_name": "Example Digital Bank", "institution_type": "neobank" }, "interest_bearing": true, "apy_max": 0.03, "apy_default": 0.015, "application_url": "https://bancadia.com/go/example-digital-bank/business-checking", "last_modified": "2026-09-15T00:00:00Z", "is_verified": true } ] ``` ### What the fields mean for this agent | Field | How to use it | | --- | --- | | `apy_default` | What the client earns without upgrading. Use it for planning projections, not `apy_max`. | | `institution.institution_type` | Community bank, national bank, credit union, neobank and so on. Some clients have a preference. | | `insurance_type` | FDIC or NCUA coverage is $250,000 per depositor, per insured institution, per ownership category. Frame it that way in client materials. | | `monthly_fee_waiver_condition` | Check the waiver against the balance the client will keep there. | ### Going deeper on one listing Call `get_business_checking_listing` to confirm fees, and any plan tier the stated rate depends on, before a recommendation appears in a client-facing plan. 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 a copilot for [Firm]'s advisors. When a client's plan shows business cash in a personal account, idle business balances earning nothing, or a new or restructured business that needs an account, you may draft a business checking recommendation for the advisor to review. - Draft for the advisor, not directly for the client. The advisor approves what the client sees. - Query with the business's entity type, state and requirements. Use apy_default for projections. Only use accounts the tool returned. - State deposit insurance limits accurately. - Link only to the application_url returned by the tool. - Include: "[Firm] may earn a commission if you open this account; it doesn't affect which accounts are shown. See our Form ADV for details on conflicts of interest." ``` What the end user sees ```text Draft for advisor review Your brokerage keeps about $120,000 in operating cash that currently earns nothing. Business Interest Checking from Example Bank is FDIC-insured, pays 2.25% APY, and waives its $10 monthly fee above a $15,000 average balance. At your current balance, that's about $2,700 a year in interest. Apply: https://bancadia.com/go/example-bank/business-interest-checking [Firm] may earn a commission if you open this account; it doesn't affect which accounts are shown. See our Form ADV for details on conflicts of interest. ``` > **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. ## Fiduciary and disclosure considerations Registered investment advisers owe clients a fiduciary duty, and compensation tied to a recommendation is a conflict of interest that has to be disclosed (for example, in Form ADV) and managed. Broker-dealer and insurance-licensed advisors have their own conduct rules. Bancadia's data is designed to support that: ranking doesn't use commission, and responses carry no payout information. - Put the recommendation in the context of the client's plan, not as a standalone product pitch. - Disclose the commission relationship in the recommendation itself, and wherever else your compliance program requires. - Have your compliance team review how the copilot presents recommendations before launch. ## 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 a ranking input and isn't in the response. Eligibility comes from your filters, and ordering is by monthly fee, with listings tagged for the client's industry and stage moved up. ### Can the copilot recommend directly to clients? Bancadia doesn't restrict that, but most advisory firms will want the advisor to approve a recommendation first. The system prompt above drafts for advisor review. ### What client data do we send? Only the business attributes used as filters. No client names, account numbers, net worth or holdings; the tool has no fields for them. ### Does Bancadia cover personal accounts or investment products? No. The MCP server covers US business checking only. There is no tool for personal deposit accounts today, and Bancadia doesn't cover securities. ### How is attribution tracked? Every `application_url` is a `bancadia.com/go/…` redirect that logs the click, and every tool call is logged against your token. Tying an application back to your integration, which commission sharing depends on, isn't live yet. See [commission share](#commission-share). ## 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).