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-only

Get 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

  • dataType enumrequiredThe data type to get the field schema for: transactions, balances, trades, holdings, or loans.
list_feed_sourcesread-only

List 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-only

List 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-only

Get name, subscription plan, and settings for a workspace. Returns 403 if the user is not a member.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
list_integrationsread-only

List 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

  • workspaceId stringrequiredWorkspace 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_integrationwrite

Remove a destination integration from the workspace. Any feeds using this integration will fail to sync after removal.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • integrationId stringrequiredIntegration 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-only

List 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

  • workspaceId stringrequiredParent workspace ID — must be top-level (NOT a portal). Get from list_workspaces (entries WITHOUT a parentWorkspaceId).
create_portalwrite

Create 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

  • workspaceId stringrequiredParent workspace ID — must be top-level (NOT a portal). Get from list_workspaces (entries WITHOUT a parentWorkspaceId).
  • name stringrequiredPortal name — typically the client's business name. Shown to the client and in your portal list.
  • clientEmail stringOptional: 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.
  • capabilities objectOverride default capabilities (membersCanCreateBanks, membersCanCreateFeeds, membersCanCreateIntegrations). Defaults: client can connect banks, but cannot create feeds or integrations.
  • limits objectPer-portal hard caps (maxBanks, maxFeeds, maxIntegrations, maxMembers). null = no cap beyond the family ceiling.
update_portalwrite

Update a portal's name, icon, description, capabilities, or limits. Capabilities control what the portal's direct members (the client) can do. Accountants only.

Parameters

  • workspaceId stringrequiredParent workspace ID — must be top-level (NOT a portal). Get from list_workspaces (entries WITHOUT a parentWorkspaceId).
  • portalId stringrequiredPortal ID to update — get from list_portals
delete_portalwrite

Soft-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

  • workspaceId stringrequiredParent workspace ID — must be top-level (NOT a portal). Get from list_workspaces (entries WITHOUT a parentWorkspaceId).
  • portalId stringrequiredPortal ID to delete — get from list_portals
get_family_usageread-only

Get 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

  • workspaceId stringrequiredParent 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-only

List 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

  • workspaceId stringrequiredWorkspace 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-only

Get a bank connection and its live accounts fetched directly from the institution. Returns bankId, institution name, and accounts with accountId and accountType.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • bankId stringrequiredBank connection ID — get from list_banks
create_bank_linkwrite

Initiate 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

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • source enum: 'plaid' | 'saltedge' | 'snaptrade'requiredBanking data provider. Use "plaid" for US/CA, "saltedge" for EU/AU/NZ.
  • institutionId stringPre-select a specific institution. Omit to let the user search.
  • countryCodes string[]ISO 3166-1 alpha-2 country codes, e.g. ["US", "CA"]
connect_bankwrite

Complete 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

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • publicToken stringrequiredpublic_token from Plaid Link onSuccess callback
  • institutionId stringInstitution ID from Plaid metadata
  • institutionName stringInstitution name from Plaid metadata
delete_bankwrite

Remove a bank connection from the workspace. The bank will no longer sync data and existing feeds referencing it will fail.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • bankId stringrequiredBank connection ID — get from list_banks

Account Data

Fetch live account details directly from institutions.

list_accountsread-only

Fetch live accounts for a bank connection directly from the institution — not cached. Returns accountId, accountType, balance, and currency.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • bankId stringrequiredBank connection ID — get from list_banks
get_accountread-only

Fetch a single account's current details directly from the institution. Returns accountType, balance, currency, and institution name.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • bankId stringrequiredBank connection ID — get from list_banks
  • accountId stringrequiredAccount ID — get from list_accounts or get_bank

Financial Data

Query transactions, balances, holdings, trades, and loans.

get_transactionsread-only

Fetch 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

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • bankId stringrequiredBank connection ID — get from list_banks
  • accountId stringrequiredAccount ID — get from list_accounts or get_bank
  • from stringStart date YYYY-MM-DD
  • to stringEnd date YYYY-MM-DD
  • cursor stringPlaid cursor for incremental sync
get_balanceread-only

Fetch the current live balance for an account directly from the institution — not cached. Returns current balance, available balance, and credit limit.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • bankId stringrequiredBank connection ID — get from list_banks
  • accountId stringrequiredAccount ID — get from list_accounts or get_bank
get_holdingsread-only

Get current investment holdings (positions, quantities, market values) for an investment account.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • bankId stringrequiredBank connection ID — get from list_banks
  • accountId stringrequiredAccount ID — get from list_accounts or get_bank
get_tradesread-only

Get investment transactions (buys, sells, dividends) for an investment account over a date range.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • bankId stringrequiredBank connection ID — get from list_banks
  • accountId stringrequiredAccount ID — get from list_accounts or get_bank
  • from stringStart date YYYY-MM-DD
  • to stringEnd date YYYY-MM-DD
get_loanread-only

Get loan details (outstanding balance, interest rate, next payment) for a loan or liability account.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • bankId stringrequiredBank connection ID — get from list_banks
  • accountId stringrequiredAccount ID — get from list_accounts or get_bank

Feed Management

Create and manage data pipeline feeds with field mappings.

list_feedsread-only

List 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

  • workspaceId stringrequiredWorkspace 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-only

Get the full configuration and status of a specific feed pipeline, including sourceConfig, destinationConfig, fieldMappings, and schedule.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • feedId stringrequiredFeed ID — get from list_feeds
create_feedwrite

Create 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

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • name stringrequiredHuman-readable feed name
  • source enum: 'sync' | 'extractor' | 'upload'requiredFeed source type
  • dataType enumrequiredType of financial data
  • sourceConfig objectBank sync or extractor configuration
  • destinationConfig objectDestination (Notion/Airtable/Sheets) config
  • fieldMappings arraySource-to-destination field mappings
  • schedule objectAutomated sync schedule
update_feedwrite

Update a feed's name, configuration, or schedule. Pass only the fields to change — this is a partial update.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • feedId stringrequiredFeed ID — get from list_feeds
  • name stringNew feed name
  • sourceConfig objectUpdated source configuration
  • destinationConfig objectUpdated destination config
  • fieldMappings arrayUpdated field mappings
  • schedule objectUpdated schedule
validate_feedread-only

Pre-flight validate a feed configuration without creating it. Returns errors and warnings.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • feedId stringFeed ID for update validation
  • name stringFeed name
  • source enumFeed source type
  • dataType enumData type
delete_feedwrite

Permanently delete a feed and all its sync job history. This cannot be undone.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • feedId stringrequiredFeed ID — get from list_feeds

Job Management

Trigger syncs, track job progress, and manage the sync queue.

list_jobsread-only

List 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

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • feedId stringOptional. 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.
  • limit numberMax results (default 20, single-feed mode)
  • limitPerFeed numberWhen listing across feeds (no feedId), cap results per feed. Default 5, max 25.
  • status enumSingle-feed mode only. Filter: created, in_progress, paused, completed, failed, cancelled
get_jobread-only

Get current status and progress of a specific sync job. Poll this after trigger_sync to track completion.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • feedId stringrequiredFeed ID — get from list_feeds
  • jobId stringrequiredJob ID — get from trigger_sync or list_jobs
trigger_syncwrite

Queue 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

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • feedId stringrequiredFeed ID — get from list_feeds
trigger_learnwrite

Trigger the Memory enrichment learn cycle for a feed. Reads back recent destination records and updates learned patterns immediately.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • feedId stringrequiredFeed ID — get from list_feeds
cancel_jobwrite

Cancel a queued or in_progress sync job. Has no effect on completed or failed jobs.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • feedId stringrequiredFeed ID — get from list_feeds
  • jobId stringrequiredJob 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-only

List 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

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
get_enrichmentread-only

Get the full configuration of a specific enrichment, including ruleConfig or alertConfig.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • enrichmentId stringrequiredEnrichment ID — get from list_enrichments
create_enrichmentwrite

Create 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

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • name stringrequiredEnrichment name
  • type enum: 'rule' | 'lookup' | 'filter' | 'split' | 'transfer_match' | 'dedupe' | 'alert' | 'monitor' | 'budget' | 'recurring' | 'fees' | 'anomaly' | 'digest' | 'memory' | 'ai_categorize' | 'ai_merchant'requiredEnrichment type
  • dataType enumRecord shape it runs on (default: transactions where supported; ignored for the workspace-scoped watch types)
  • enabled booleanActive status (default true)
  • feedIds string[]Feed IDs to apply to
  • allFeeds booleanApply to all matching feeds
  • ruleConfig objectRule configuration
  • alertConfig objectAlert configuration
  • memoryConfig objectMemory configuration
  • config objectThe type-specific config for every type other than rule/alert/memory (lookup, filter, split, budget, digest, …)
update_enrichmentwrite

Update an existing enrichment. Only include fields you want to change. The type cannot be changed after creation.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • enrichmentId stringrequiredEnrichment ID — get from list_enrichments
  • name stringNew name
  • enabled booleanEnable or disable
  • feedIds string[]Replace the feeds this enrichment runs on
  • config objectReplace the type-specific config (or use ruleConfig / alertConfig / memoryConfig for those types). Validated against the stored type.
preview_enrichmentread-only

Run the full enrichment pipeline on sample records without persisting anything. Returns each record with original values, enriched values, and fields changed.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • feedId stringrequiredFeed ID — get from list_feeds
  • records object[]requiredSample records to enrich (max 50)
delete_enrichmentwrite

Permanently delete an enrichment. This cannot be undone. Memory patterns are preserved.

Parameters

  • workspaceId stringrequiredWorkspace ID — get from list_workspaces. Portal workspaces are valid here when you manage them (look for `isInherited: true` in list_workspaces).
  • enrichmentId stringrequiredEnrichment ID — get from list_enrichments