Skip to content

huxleymc/up-bank

v0.1.0MIT

Personal Up Bank MCP for accounts, transactions, categories, and tags.

up-bank

Personal Up Bank MCP plugin for accounts, transactions, categories, and tags. It speaks the Agent Plugins 1.0.0 format: plugin.json, mcp.json, and one skill under skills/up-bank/.

Webhooks and attachments are out of scope for v0.1.

Requirements

  • Node.js 18+ (global fetch)
  • An Up Personal Access Token in UP_ACCESS_TOKEN

Configure UP_ACCESS_TOKEN

Get a token from the Up app: swipe right → Data sharingPersonal Access Token, or from https://api.up.com.au.

Agent Plugins 1.0.0 has no secret store. This plugin declares the token as an MCP env placeholder. Put the real value in the host (Cursor Plugins → Configure, your shell, or a local .env you do not commit). Never commit the token.

mcp.json passes it through as ${UP_ACCESS_TOKEN}:

"env": {
  "UP_ACCESS_TOKEN": "${UP_ACCESS_TOKEN}"
}

The stdio server reads process.env.UP_ACCESS_TOKEN and sends:

Authorization: Bearer <token>

to:

https://api.up.com.au/api/v1

Copy .env.example to .env for local smoke tests only.

Run the MCP server

From the plugin root:

export UP_ACCESS_TOKEN="up:yak:…"   # your token
node ./server.mjs

The process speaks JSON-RPC 2.0 over stdin/stdout (newline-delimited). A host that loads Agent Plugins should use mcp.json (command: node, args: ["./server.mjs"], cwd: ${PLUGIN_ROOT}).

Tools

Reads:

ToolUp API
pingGET /util/ping
list-accountsGET /accounts
get-accountGET /accounts/{id}
list-transactionsGET /transactions or GET /accounts/{accountId}/transactions
get-transactionGET /transactions/{id}
list-categoriesGET /categories
list-tagsGET /tags

Writes (tags and category only):

ToolUp API
add-transaction-tagsPOST /transactions/{id}/relationships/tags
remove-transaction-tagsDELETE /transactions/{id}/relationships/tags
set-transaction-categoryPATCH /transactions/{id}/relationships/category

Query mapping: page[size], page[after], filter[accountType], filter[ownershipType], filter[status], filter[since], filter[until], filter[category], filter[tag], filter[parent].

List results are { items, nextCursorUrl }. nextCursorUrl is the API links.next URL. Pass it back as next (or a page[after] cursor). No offset pagination.

JSON:API data.attributes and relationship ids are flattened to domain shapes (Account, Transaction, Category, Tag, Money).

Prove locally

node --check ./server.mjs
node ./scripts/prove.mjs

See PROVE.md for recorded PASS/FAIL.

Grok Bot cannot load local plugins from ~/.cursor/plugins/local. Cursor IDE can, if you install the plugin there.

License

MIT