{
  "formatVersion": 2,
  "version": "2026-10-29",
  "tools": [
    {
      "name": "find_payroll_accounts",
      "description": "\nLook the user up in the payroll systems Atomic can reach with CoAuth (ADP today), using identity\ndetails this bank already has. When one finds them, the user can switch their deposit there by\nconfirming a code the payroll system sends them, instead of signing in with a password.\n- Call it once the user has said they want to move their direct deposit, and before asking who pays\n  them. The payroll partners require that the user asked first, so never call it before that.\n- It takes no input. The server supplies the identity; you never see it and must never ask for it.\n- accounts: one entry per payroll system checked, each with companyId, companyName, connectorId,\n  connectorName and userStatus. 'VERIFIED_PAYROLL': the user has an account there that can be\n  switched. 'NOT_FOUND': they weren't found there. 'UNSUPPORTED_PAYROLL': they were found, but their\n  employer doesn't allow a switch through this payroll system.\n- available false: this bank has no identity details for the user, so carry on without CoAuth.\n- A found account is a payroll system, not the user's employer, and the user may have other jobs.\n  Ask whether it's the paycheck they want to move before offering a button.",
      "schema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "search_companies",
      "description": "\nSearch Atomic's directory of employers, payroll providers, and gig platforms by name. Results are\ncompanies where this app can start a direct deposit switch.\n- Matching is fuzzy, so partial and misspelled names work. It matches words in company names, so a\n  category such as 'grocery store' or 'hospital' returns companies that happen to have that word in\n  their name, which are rarely the user's employer. Search a name, such as 'Kroger' or 'Providence\n  Health'.\n- Results always include near-matches. Only treat a result as the user's company when its name is\n  the one they gave, or they confirm it.\n- A company the user names can be missing because of how this app is set up. Say you can't confirm\n  it rather than that Atomic doesn't support it.\n- Pass tags ['payroll-provider'] when the user names a payroll system rather than their employer.\n- Pass connectorId to search only the employers who run on one payroll system, and franchiseParent\n  to search only the franchisees under one brand.\n- Each result has _id (pass it as companyId to other tools), name, status ('operational',\n  'under-maintenance', or 'disabled'), tags, and hasAlternativeConnectors. The system prompt says\n  what the tags and hasAlternativeConnectors mean for what to do next.",
      "schema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 50,
            "description": "The name of one employer, payroll provider, or payroll portal, such as 'Kroger', 'ADP', or 'Workday'. Never a category or description. Leave it empty only to list a franchise parent's locations."
          },
          "tags": {
            "type": "array",
            "items": {
              "enum": ["payroll-provider", "gig-economy", "unemployment"]
            },
            "description": "Optional. Narrow the search, such as ['payroll-provider'] when the user names a payroll system."
          },
          "connectorId": {
            "type": "string",
            "description": "Optional. A payroll system's connector _id, from get_company_details, to find the user's employer among the employers on that system."
          },
          "franchiseParent": {
            "type": "string",
            "description": "Optional. The _id of a franchise parent, to search only the franchisees operating under it."
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "get_company_details",
      "description": "\nLook up one company by its _id from search_companies. Call it when a search result is tagged\n'franchise-parent' or 'payroll-provider', or has hasAlternativeConnectors, and when the user asks a\nfollow-up about a company you found. Don't call it on every turn.\n- supportsDepositSwitch: whether a direct deposit can be switched there.\n- status and underMaintenanceProductsAndActions: 'under-maintenance' with 'deposit' in the list, or\n  with the list null, means a switch can't start right now.\n- distributionTypes: how much of the paycheck can move through the company's own payroll system, as\n  this bank allows it. 'total' alone means the whole paycheck has to move together; 'fixed' (a dollar\n  amount) and 'percent' mean part of it can go to the new account. Each alternativeConnector has its\n  own distributionTypes.\n- isFranchiseParent: a brand, not an employer. The franchisee running the user's location pays them.\n- requiresEmployerName: a payroll system whose sign-in differs for each employer, such as Workday.\n  Find the employer by searching with this system's connector._id as connectorId. If the user can't\n  say, the button still works: the Atomic screen asks them for their employer.\n- connector: the payroll system the company uses by default.\n- alternativeConnectors: other payroll systems behind this company. When present, only the user\n  knows which one pays them. If they don't know, the Atomic screen asks them.",
      "schema": {
        "type": "object",
        "properties": {
          "companyId": {
            "type": "string",
            "description": "The company's _id, from search_companies."
          }
        },
        "required": ["companyId"],
        "additionalProperties": false
      }
    },
    {
      "name": "get_deposit_config",
      "description": "\nPrepare Atomic's Transact SDK to switch the user's direct deposit at one company. The app shows an\n\"Update Deposit\" button that opens Transact straight on that company's sign-in.\n- Call it only once you know the company the user can sign in to as themselves: one specific\n  employer, or a payroll system that needs nothing further. See the system prompt.\n- Pass the company's _id as companyId. Pass connectorId only when the user chose one of the\n  company's alternativeConnectors, or when you found their employer by searching a payroll system\n  that requiresEmployerName (pass that system's connector._id); otherwise leave it out and the\n  company's own payroll system is used.\n- Nothing changes until the user taps the button, signs in to their payroll account in the Atomic\n  screen, and confirms. The paycheck goes to their account at this bank; you never need their\n  account or routing number.\n- distribution: how much of the paycheck moves, once the user has confirmed it with you: type\n  'total' (the whole paycheck), 'fixed' with amount in dollars, or 'percent' with amount from 1 to\n  100. Only a type in the payroll system's distributionTypes from get_company_details. Leave it out\n  when the user hasn't settled on an amount or you don't know which payroll system they'll sign in\n  to; they then choose in the Atomic screen if the payroll system allows a choice.\n- The result echoes the distribution set on the button, and amountCanChange says whether the user\n  can still change it in the Atomic screen. Its distributionTypes are what the payroll system the\n  button opens on allows; missing when the Atomic screen will ask which payroll system they use.\n  Without a distribution, don't say the user can move part of their paycheck unless\n  distributionTypes includes 'fixed' or 'percent'.\n- Errors about the amount: 'distribution-not-allowed' (that kind of split isn't allowed; the result\n  lists distributionTypes), 'amount-invalid', and 'payroll-system-unknown' (find out which payroll\n  system they use first, or leave distribution out).\n- Never ask for the user's password. Atomic collects sign-in details itself.\n- For an account find_payroll_accounts found ('VERIFIED_PAYROLL'), pass its companyId and\n  connectorId. The Atomic screen then verifies the user with a code from their payroll system\n  instead of a password.\n- If it returns an error instead of state 'ready', there's no button: the error says why. Don't tell\n  the user to tap anything.\n- After calling, tell the user to tap the button to continue. When they leave the Atomic screen, you\n  get a transact-finished or transact-closed event, and Atomic's webhooks tell you when the switch\n  starts and finishes.\n- The app shows only the newest button, so a new one replaces any earlier button; never tell the\n  user to tap an earlier one.",
      "schema": {
        "type": "object",
        "properties": {
          "companyId": {
            "type": "string",
            "description": "The company's _id, from search_companies."
          },
          "connectorId": {
            "type": "string",
            "description": "Optional. The _id of the payroll system the user chose from the company's alternativeConnectors, or of the payroll system you found their employer through."
          },
          "distribution": {
            "type": "object",
            "description": "Optional. The amount the user confirmed with you.",
            "properties": {
              "type": {
                "enum": ["total", "fixed", "percent"]
              },
              "amount": {
                "type": "number",
                "description": "Dollars for 'fixed', a percentage from 1 to 100 for 'percent'. Leave it out for 'total'."
              }
            },
            "required": ["type"],
            "additionalProperties": false
          }
        },
        "required": ["companyId"],
        "additionalProperties": false
      }
    },
    {
      "name": "check_events",
      "description": "\nCheck where the user's direct deposit switches stand. Call this after a transact-finished event,\nand when the user asks whether their switch went through. The system prompt explains how to read\nthe result and what to tell the user.\n- events: one entry per deposit task, newest first, with the task's current status. Each has taskId,\n  companyId, companyName, status ('processing', 'completed', or 'failed'), reason (why it failed),\n  distributionType ('total', 'fixed', or 'percent'), distributionAmount (dollars for 'fixed', a\n  percentage from 0 to 100 for 'percent', null for 'total'), and receivedAt (UTC).\n- The switch the user just worked on is the event whose taskId matches the taskId from the\n  transact-finished or transact-closed event. Other events are from earlier switches, possibly in\n  earlier conversations; now (UTC) tells you how long ago they were.",
      "schema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
  ]
}
