MCP tools
The BankSync MCP server exposes 40 tools to AI agents (24 read-only). Connect it to your client from the setup guides, then the agent can call any of these.
Discovery
Discover available capabilities, data schemas, and feed source types.
get_data_type_schemaread-onlyGet the available source fields for a given data type — use this before building fieldMappings in create_feed or update_feed. Returns each field's key, name, type, description, and whether it is required.
Parameters
dataTypeenumrequiredThe data type to get the field schema for: transactions, balances, trades, holdings, or loans.
list_feed_sourcesread-onlyList all supported feed source types and the data types each source can produce. Use this to discover valid source x dataType combinations before calling create_feed.
No parameters.
Workspace
Manage workspaces and connected destination integrations.
list_workspacesread-onlyList all workspaces the authenticated user can access. Returns workspaceId, name, role, and (for accountants) any portals managed via parent inheritance. `isInherited: true` marks portals reached through your owner/admin role on `parentWorkspaceId` — useful for distinguishing your clients from your own workspaces. workspaceId is required by all other tools.
No parameters.
get_workspaceread-onlyGet name, subscription plan, and settings for a workspace. Returns 403 if the user is not a member.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
list_integrationsread-onlyList connected destination integrations (Notion, Google Sheets, Airtable, Excel) for a workspace. Returns integrationId needed when configuring a feed destination. Pass scope='family' on an accountant's parent workspace to also include integrations from every portal under it. Provider auth tokens are stripped from all responses.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).scope'self' | 'family'Optional. `self` (default) returns this workspace only. `family` includes every portal under it — for accountants who want a single view across all clients. Each row in a family response gains a `portal: { id, name, icon } | null` badge and a `workspaceId` field. Requires admin+ role and is only valid on a top-level workspace.
delete_integrationwriteRemove a destination integration from the workspace. Any feeds using this integration will fail to sync after removal.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).integrationIdstringrequiredIntegration ID to remove — get from list_integrations
Portals (Accountants)
For accountants managing multiple clients: list, create, update, and delete portals; check family-wide plan usage.
list_portalsread-onlyList every client portal under a top-level workspace. Returns each portal's id, name, icon, status counts (banks/feeds/members/invitations), portalConfig, and lastActivityAt. Use the portal id as a workspaceId in any other tool. Accountants only.
Parameters
workspaceIdstringrequiredParent workspace ID — must be top-level (NOT a portal). Get from list_workspaces (entries WITHOUT a parentWorkspaceId).
create_portalwriteCreate a new client portal under your parent workspace. A portal is a workspace dedicated to one client. Optionally pass clientEmail to invite the client at create time. Returns the portalId — use it as a workspaceId in any other tool. Accountants only.
Parameters
workspaceIdstringrequiredParent workspace ID — must be top-level (NOT a portal). Get from list_workspaces (entries WITHOUT a parentWorkspaceId).namestringrequiredPortal name — typically the client's business name. Shown to the client and in your portal list.clientEmailstringOptional: invite a client by email at create time. They receive an invitation that makes them an editor of the portal once accepted.clientRole'editor' | 'viewer'Role for the invited client. Default: editor.capabilitiesobjectOverride default capabilities (membersCanCreateBanks, membersCanCreateFeeds, membersCanCreateIntegrations). Defaults: client can connect banks, but cannot create feeds or integrations.limitsobjectPer-portal hard caps (maxBanks, maxFeeds, maxIntegrations, maxMembers). null = no cap beyond the family ceiling.
update_portalwriteUpdate a portal's name, icon, description, capabilities, or limits. Capabilities control what the portal's direct members (the client) can do. Accountants only.
Parameters
workspaceIdstringrequiredParent workspace ID — must be top-level (NOT a portal). Get from list_workspaces (entries WITHOUT a parentWorkspaceId).portalIdstringrequiredPortal ID to update — get from list_portals
delete_portalwriteSoft-delete a portal. The portal disappears from the parent's view immediately; the client loses access; bank connections begin a 30-day cleanup cascade. Refuses (409) if the portal's banks are still referenced by parent-workspace feeds — detach those feeds first. Accountants only.
Parameters
workspaceIdstringrequiredParent workspace ID — must be top-level (NOT a portal). Get from list_workspaces (entries WITHOUT a parentWorkspaceId).portalIdstringrequiredPortal ID to delete — get from list_portals
get_family_usageread-onlyGet the accountant's plan usage rolled up across the parent workspace plus every portal under it. Returns total counts (banks, feeds, integrations, members, portals) and the effective family limits. Useful for answering 'how close am I to my plan cap?' across all clients in one call.
Parameters
workspaceIdstringrequiredParent workspace ID — must be top-level (NOT a portal). Get from list_workspaces (entries WITHOUT a parentWorkspaceId).
Bank Connections
Connect, list, and manage bank/institution connections.
list_banksread-onlyList bank connections in a workspace. Returns bankId needed for list_accounts, get_transactions, and other data tools. Pass scope='family' on an accountant's parent workspace to also include banks from every portal under it — each row gains a portal badge and workspaceId for attribution.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).scope'self' | 'family'Optional. `self` (default) returns this workspace only. `family` includes every portal under it — for accountants who want a single view across all clients. Each row in a family response gains a `portal: { id, name, icon } | null` badge and a `workspaceId` field. Requires admin+ role and is only valid on a top-level workspace.
get_bankread-onlyGet a bank connection and its live accounts fetched directly from the institution. Returns bankId, institution name, and accounts with accountId and accountType.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).bankIdstringrequiredBank connection ID — get from list_banks
create_bank_linkwriteInitiate a new bank connection. Returns a link token and hosted authorization URL. For Plaid: open authUrl in a browser. For SaltEdge/SnapTrade: open authUrl and follow the authorization flow.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).sourceenum: 'plaid' | 'saltedge' | 'snaptrade'requiredBanking data provider. Use "plaid" for US/CA, "saltedge" for EU/AU/NZ.institutionIdstringPre-select a specific institution. Omit to let the user search.countryCodesstring[]ISO 3166-1 alpha-2 country codes, e.g. ["US", "CA"]
connect_bankwriteComplete a Plaid bank connection by exchanging the public_token. Call create_bank_link first, have the user complete Plaid, then pass the public_token here.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).publicTokenstringrequiredpublic_token from Plaid Link onSuccess callbackinstitutionIdstringInstitution ID from Plaid metadatainstitutionNamestringInstitution name from Plaid metadata
delete_bankwriteRemove a bank connection from the workspace. The bank will no longer sync data and existing feeds referencing it will fail.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).bankIdstringrequiredBank connection ID — get from list_banks
Account Data
Fetch live account details directly from institutions.
list_accountsread-onlyFetch live accounts for a bank connection directly from the institution — not cached. Returns accountId, accountType, balance, and currency.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).bankIdstringrequiredBank connection ID — get from list_banks
get_accountread-onlyFetch a single account's current details directly from the institution. Returns accountType, balance, currency, and institution name.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).bankIdstringrequiredBank connection ID — get from list_banksaccountIdstringrequiredAccount ID — get from list_accounts or get_bank
Financial Data
Query transactions, balances, holdings, trades, and loans.
get_transactionsread-onlyFetch bank transactions for an account. For Plaid: use cursor for incremental sync. For SaltEdge/SnapTrade: use from/to date range. Returns up to 500 transactions per call.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).bankIdstringrequiredBank connection ID — get from list_banksaccountIdstringrequiredAccount ID — get from list_accounts or get_bankfromstringStart date YYYY-MM-DDtostringEnd date YYYY-MM-DDcursorstringPlaid cursor for incremental sync
get_balanceread-onlyFetch the current live balance for an account directly from the institution — not cached. Returns current balance, available balance, and credit limit.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).bankIdstringrequiredBank connection ID — get from list_banksaccountIdstringrequiredAccount ID — get from list_accounts or get_bank
get_holdingsread-onlyGet current investment holdings (positions, quantities, market values) for an investment account.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).bankIdstringrequiredBank connection ID — get from list_banksaccountIdstringrequiredAccount ID — get from list_accounts or get_bank
get_tradesread-onlyGet investment transactions (buys, sells, dividends) for an investment account over a date range.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).bankIdstringrequiredBank connection ID — get from list_banksaccountIdstringrequiredAccount ID — get from list_accounts or get_bankfromstringStart date YYYY-MM-DDtostringEnd date YYYY-MM-DD
get_loanread-onlyGet loan details (outstanding balance, interest rate, next payment) for a loan or liability account.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).bankIdstringrequiredBank connection ID — get from list_banksaccountIdstringrequiredAccount ID — get from list_accounts or get_bank
Feed Management
Create and manage data pipeline feeds with field mappings.
list_feedsread-onlyList data pipeline feeds in a workspace. Returns feedId, name, source, dataType, and status. Pass scope='family' on an accountant's parent workspace to also include feeds from every portal under it — each row gains a portal badge and workspaceId.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).scope'self' | 'family'Optional. `self` (default) returns this workspace only. `family` includes every portal under it — for accountants who want a single view across all clients. Each row in a family response gains a `portal: { id, name, icon } | null` badge and a `workspaceId` field. Requires admin+ role and is only valid on a top-level workspace.
get_feedread-onlyGet the full configuration and status of a specific feed pipeline, including sourceConfig, destinationConfig, fieldMappings, and schedule.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).feedIdstringrequiredFeed ID — get from list_feeds
create_feedwriteCreate a new data pipeline feed. Source must be one of: sync, extractor, upload. DataType must be one of: transactions, balances, trades, holdings, loans, receipts, invoices, documents.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).namestringrequiredHuman-readable feed namesourceenum: 'sync' | 'extractor' | 'upload'requiredFeed source typedataTypeenumrequiredType of financial datasourceConfigobjectBank sync or extractor configurationdestinationConfigobjectDestination (Notion/Airtable/Sheets) configfieldMappingsarraySource-to-destination field mappingsscheduleobjectAutomated sync schedule
update_feedwriteUpdate a feed's name, configuration, or schedule. Pass only the fields to change — this is a partial update.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).feedIdstringrequiredFeed ID — get from list_feedsnamestringNew feed namesourceConfigobjectUpdated source configurationdestinationConfigobjectUpdated destination configfieldMappingsarrayUpdated field mappingsscheduleobjectUpdated schedule
validate_feedread-onlyPre-flight validate a feed configuration without creating it. Returns errors and warnings.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).feedIdstringFeed ID for update validationnamestringFeed namesourceenumFeed source typedataTypeenumData type
delete_feedwritePermanently delete a feed and all its sync job history. This cannot be undone.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).feedIdstringrequiredFeed ID — get from list_feeds
Job Management
Trigger syncs, track job progress, and manage the sync queue.
list_jobsread-onlyList sync job history. Three modes: (1) Pass feedId to list that feed's jobs only, newest first. Use the status filter to check for running jobs before triggering a new sync. (2) Omit feedId to list recent jobs across every feed in the workspace. (3) Set scope='family' on an accountant's parent workspace to also span portals — each row carries workspaceId, feedId, feedName, and a portal badge.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).feedIdstringOptional. Pass to filter to one feed; omit to list across every feed in the workspace.scope'self' | 'family'Only meaningful when feedId is omitted. 'self' (default): jobs across this workspace's feeds. 'family': also include portals. Requires admin+ role; top-level workspaces only.limitnumberMax results (default 20, single-feed mode)limitPerFeednumberWhen listing across feeds (no feedId), cap results per feed. Default 5, max 25.statusenumSingle-feed mode only. Filter: created, in_progress, paused, completed, failed, cancelled
get_jobread-onlyGet current status and progress of a specific sync job. Poll this after trigger_sync to track completion.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).feedIdstringrequiredFeed ID — get from list_feedsjobIdstringrequiredJob ID — get from trigger_sync or list_jobs
trigger_syncwriteQueue a new sync job for a feed. Use get_job with the returned jobId to poll for progress. Only one job can run per feed at a time.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).feedIdstringrequiredFeed ID — get from list_feeds
trigger_learnwriteTrigger the Memory enrichment learn cycle for a feed. Reads back recent destination records and updates learned patterns immediately.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).feedIdstringrequiredFeed ID — get from list_feeds
cancel_jobwriteCancel a queued or in_progress sync job. Has no effect on completed or failed jobs.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).feedIdstringrequiredFeed ID — get from list_feedsjobIdstringrequiredJob ID to cancel — get from trigger_sync or list_jobs
Enrichment
Inspect every enrichment in a workspace, dry-run the pipeline on sample records, and build rules, alerts and Memory for auto-categorization.
list_enrichmentsread-onlyList all enrichments in a workspace. Returns enrichment ID, name, type (any of the 16 enrichment types — rulesets, lookups, filters, splits, guards, watchers and AI), enabled status, dataType, and feed associations.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
get_enrichmentread-onlyGet the full configuration of a specific enrichment, including ruleConfig or alertConfig.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).enrichmentIdstringrequiredEnrichment ID — get from list_enrichments
create_enrichmentwriteCreate a new enrichment of any of the 16 types — transform (rule, lookup), guard (filter, split, transfer_match, dedupe), watch (alert, monitor, budget, recurring, fees, anomaly, digest) and AI (memory, ai_categorize, ai_merchant). rule, alert and memory take their own config field; every other type passes its block in `config`, validated server-side. The plan tier decides which types are available.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).namestringrequiredEnrichment nametypeenum: 'rule' | 'lookup' | 'filter' | 'split' | 'transfer_match' | 'dedupe' | 'alert' | 'monitor' | 'budget' | 'recurring' | 'fees' | 'anomaly' | 'digest' | 'memory' | 'ai_categorize' | 'ai_merchant'requiredEnrichment typedataTypeenumRecord shape it runs on (default: transactions where supported; ignored for the workspace-scoped watch types)enabledbooleanActive status (default true)feedIdsstring[]Feed IDs to apply toallFeedsbooleanApply to all matching feedsruleConfigobjectRule configurationalertConfigobjectAlert configurationmemoryConfigobjectMemory configurationconfigobjectThe type-specific config for every type other than rule/alert/memory (lookup, filter, split, budget, digest, …)
update_enrichmentwriteUpdate an existing enrichment. Only include fields you want to change. The type cannot be changed after creation.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).enrichmentIdstringrequiredEnrichment ID — get from list_enrichmentsnamestringNew nameenabledbooleanEnable or disablefeedIdsstring[]Replace the feeds this enrichment runs onconfigobjectReplace the type-specific config (or use ruleConfig / alertConfig / memoryConfig for those types). Validated against the stored type.
preview_enrichmentread-onlyRun the full enrichment pipeline on sample records without persisting anything. Returns each record with original values, enriched values, and fields changed.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).feedIdstringrequiredFeed ID — get from list_feedsrecordsobject[]requiredSample records to enrich (max 50)
delete_enrichmentwritePermanently delete an enrichment. This cannot be undone. Memory patterns are preserved.
Parameters
workspaceIdstringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).enrichmentIdstringrequiredEnrichment ID — get from list_enrichments