Skip to main content
Glama
uiux-me

upbank-mcp

by uiux-me

upbank-mcp

Un servidor de Model Context Protocol que expone la API de Up Banking a clientes de LLM, construido con FastMCP y empaquetado para Docker.

Proporciona 19 herramientas y 2 recursos que cubren toda la superficie pública de la API de Up (cuentas, transacciones, categorías, etiquetas, adjuntos y webhooks), con respuestas rediseñadas para mayor eficiencia de tokens, paginación por cursor conservada de principio a fin y reintento automático ante límites de tasa.


Contenido


Related MCP server: Up Bank MCP Server

Requisitos

Cuenta de Up

Un token de acceso personal de https://api.up.com.au/getting_started. Los tokens tienen este formato: up:yeah:….

Docker

Docker Engine 20.10+ con Compose v2 (docker compose, no docker-compose).

Python

3.11+ — solo si se ejecuta fuera de Docker.

La API de Up está disponible para clientes de Up en Australia. Un token solo concede acceso a los datos del cliente que lo emitió.


Inicio rápido

git clone git@github.com:uiux-me/upbank-mcp.git
cd upbank-mcp
cp .env.example .env          # paste your token into UP_API_TOKEN
docker compose up --build

El servidor escucha en http://127.0.0.1:8000/mcp. Verifícalo:

docker compose exec upbank-mcp python -c "
import asyncio, upbank_mcp
from fastmcp import Client
async def main():
    async with Client(upbank_mcp.mcp) as c:
        print((await c.call_tool('ping')).data)
asyncio.run(main())"

Una respuesta correcta incluye tu id de cliente y un emoji de estado:

{'ok': True, 'id': 'eb59f467-…', 'status_emoji': '⚡️'}

Configuración

Toda la configuración se realiza mediante variables de entorno. Compose lee .env del directorio del proyecto automáticamente.

Variable

Por defecto

Descripción

UP_API_TOKEN

(obligatorio)

Token de acceso personal. Es la única variable que el servidor lee para las credenciales. Compose se niega a iniciar sin ella; si se ejecuta directamente, el servidor arranca y falla en la primera llamada a una herramienta.

UP_API_BASE

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

URL base de la API. Sobrescríbela solo para probar contra un simulacro.

MCP_TRANSPORT

stdio

stdio para clientes MCP locales, http para un servidor accesible por red. Compose establece http.

MCP_HOST

0.0.0.0

Dirección de enlace para el transporte HTTP, dentro del contenedor.

MCP_PORT

8000

Puerto de escucha para el transporte HTTP, dentro del contenedor.

MCP_HOST_PORT

8000

Solo para Compose. Puerto del host publicado en 127.0.0.1. Cámbialo si el 8000 ya está en uso.


Ejecutar el servidor

HTTP, mediante Compose

Ideal para un servidor de larga duración compartido por varios clientes en tu máquina.

docker compose up --build          # foreground
docker compose up -d --build       # detached
docker compose logs -f             # follow logs
docker compose down                # stop and remove

El puerto se publica solo en 127.0.0.1. Consulta Seguridad.

stdio, mediante Docker

Ideal para clientes MCP que inician el servidor como subproceso. Compila la imagen una vez:

docker build -t upbank-mcp:latest .

La imagen usa MCP_TRANSPORT=stdio por defecto, por lo que no se necesita sobrescribir el transporte.

Sin Docker

pip install -e .
export UP_API_TOKEN=up:yeah:...
upbank-mcp

Establece MCP_TRANSPORT=http para servir a través de HTTP en lugar de stdio.


Conectar un cliente MCP

Claude Code

claude mcp add upbank \
  -e UP_API_TOKEN=up:yeah:... \
  -- docker run -i --rm -e UP_API_TOKEN upbank-mcp:latest

Claude Desktop, o cualquier cliente que use la configuración mcpServers

{
  "mcpServers": {
    "upbank": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "UP_API_TOKEN", "upbank-mcp:latest"],
      "env": { "UP_API_TOKEN": "up:yeah:..." }
    }
  }
}

Se requiere -i: el servidor se comunica a través de stdin/stdout. --rm elimina el contenedor cuando el cliente se desconecta.

A través de HTTP

Apunta el cliente a http://127.0.0.1:8000/mcp mientras el stack de Compose esté en ejecución.


Referencia de herramientas

Los parámetros obligatorios están en negrita. Toda herramienta de listado acepta cursor; consulta Paginación.

Utilidades

Herramienta

Parámetros

Devuelve

ping

{ok, id, status_emoji}. Verifica el token y la accesibilidad de la API.

Cuentas

Herramienta

Parámetros

Devuelve

list_accounts

account_type (SAVER | TRANSACTIONAL | HOME_LOAN), ownership_type (INDIVIDUAL | JOINT), page_size (1–100, por defecto 30), cursor

Página de cuentas con saldos.

get_account

account_id

Una cuenta.

Transacciones

Herramienta

Parámetros

Devuelve

list_transactions

account_id, status (HELD | SETTLED), since, until, category, tag, page_size (1–100, por defecto 30), cursor

Página de transacciones, de la más reciente a la más antigua. Omite account_id para buscar en todas las cuentas.

get_transaction

transaction_id

Una transacción, incluidos los detalles de retención, redondeo y reembolso.

since y until acotan createdAt de forma inclusiva. category acepta un id de categoría principal, que coincide con todas sus categorías secundarias.

Categorías

Herramienta

Parámetros

Devuelve

list_categories

parent

El árbol de categorías, o las secundarias de una categoría principal. Sin paginar.

get_category

category_id

Una categoría con los ids de su categoría principal y secundarias.

categorize_transaction

transaction_id, category_id

Establece la categoría, o la elimina cuando category_id es nulo.

Las categorías las fija Up y no se pueden crear. Los ids son slugs como restaurants-and-cafes. Solo se pueden modificar las transacciones con is_categorizable: true, y solo se aceptan categorías hoja; pasar una categoría principal como good-life devuelve el error HTTP 403.

Etiquetas

Herramienta

Parámetros

Devuelve

list_tags

page_size (1–100, por defecto 50), cursor

Página de etiquetas. El id de una etiqueta es su nombre.

add_tags_to_transaction

transaction_id, tags (lista)

Añade etiquetas, creando las que no existan.

remove_tags_from_transaction

transaction_id, tags (lista)

Elimina etiquetas de la transacción.

Una transacción admite un máximo de 6 etiquetas. Las etiquetas sin transacciones asociadas desaparecen de list_tags.

Adjuntos

Herramienta

Parámetros

Devuelve

list_attachments

page_size (1–100, por defecto 30), cursor

Página de adjuntos.

get_attachment

attachment_id

Un adjunto.

file_url es una URL firmada que caduca en file_url_expires_at. Descárgala de inmediato o vuelve a solicitar el adjunto.

Webhooks

Herramienta

Parámetros

Devuelve

list_webhooks

page_size (1–100, por defecto 30), cursor

Página de webhooks.

get_webhook

webhook_id

Un webhook.

create_webhook

url, description (≤64 caracteres)

El nuevo webhook, incluida la secret_key.

delete_webhook

webhook_id

{ok, deleted}. Permanente.

ping_webhook

webhook_id

Envía un evento de prueba PING.

list_webhook_logs

webhook_id, page_size (1–100, por defecto 30), cursor

Intentos de entrega recientes con códigos y cuerpos de respuesta.

La secret_key se devuelve solo en la creación y nunca más. Guárdala para verificar la cabecera X-Up-Authenticity-Signature (HMAC SHA-256) en las entregas entrantes.


Recursos

URI

Contenido

up://accounts

Todas las cuentas y su saldo actual, como una única instantánea JSON.

up://categories

El árbol de categorías completo, para resolver valores de filtro category válidos.

Ambos se leen bajo demanda y reflejan el estado en el momento de la lectura.


Convenciones de respuesta

Forma

Up devuelve JSON:API, que anida cada campo bajo attributes/relationships y repite los self-links en cada recurso. Este servidor aplana cada recurso en un diccionario compacto y omite los campos opcionales cuando no están presentes, lo que reduce de forma significativa el coste de tokens sin perder información que el llamador necesite.

{
  "id": "45b83097-c97d-40da-9790-254056f03d40",
  "status": "SETTLED",
  "description": "Google One",
  "amount": { "value": "-2.49", "currency": "AUD", "base_units": -249 },
  "created_at": "2026-08-20T06:53:17+10:00",
  "settled_at": "2026-08-20T06:53:17+10:00",
  "account_id": "90c0fffc-bed6-4214-9450-6a76cd39957b",
  "category_id": "games-and-software",
  "parent_category_id": "good-life",
  "tags": [],
  "is_categorizable": true
}

Campos como foreign_amount, hold_info, round_up, cashback, card_purchase_method, note y message solo aparecen cuando la transacción los tiene.

Dinero

Cada importe es un objeto:

{ "value": "-2.49", "currency": "AUD", "base_units": -249 }

value es una cadena decimal, base_units es la unidad mínima entera (céntimos para AUD). Los cargos son negativos. Para operaciones aritméticas, prefiere base_units para evitar errores de coma flotante.

Paginación

Las herramientas de listado devuelven:

{ "items": [ ... ], "next_cursor": "https://api.up.com.au/...", "prev_cursor": null }

Para paginar, pasa el cursor devuelto de vuelta como argumento cursor de la misma herramienta. Los cursores son URLs opacas propias de Up y ya codifican los filtros y el tamaño de página, por lo que se ignoran todos los demás argumentos cuando cursor está establecido. Un cursor nulo significa que no hay más página en esa dirección.

Los cursores se validan contra el host de API configurado antes de seguirse, por lo que un cursor no puede redirigir el cliente a otro servidor.

Fechas

since y until aceptan tanto YYYY-MM-DD como una marca de tiempo RFC-3339 completa. Las fechas solas y las fechas-hora sin zona horaria se anclan a Australia/Sydney, igual que Up presenta las horas en la aplicación; se aplica el desfase correcto para la fecha en cuestión, por lo que el cambio de hora se gestiona automáticamente. La entrada no analizable se rechaza antes de realizar la solicitud, en lugar de aparecer como un HTTP 400 opaco.


Gestión de errores y límites de tarifa

  • Los errores de API se lanzan como ToolError con el estado HTTP y el título y detalle de error propios de Up, por ejemplo: HTTP 403 — Forbidden: Top-level categories cannot be set directly on transactions.

  • Las respuestas 429 y 5xx se reintentan hasta 3 veces con retroceso exponencial, respetando la cabecera Retry-After cuando está presente.

  • Los fallos de red se reintentan con el mismo calendario antes de mostrarse.

  • Las respuestas 4xx distintas de 429 no se reintentan: indican una solicitud incorrecta.


Estructura del proyecto

src/upbank_mcp/
├── client.py     Async HTTP client: auth, retry/backoff, date normalisation,
│                 cursor host validation
├── shapes.py     JSON:API → flat dict transforms, one per resource type
├── server.py     FastMCP instance, tool and resource definitions, entrypoint
├── __init__.py   Exports `mcp` and `main`
└── __main__.py   Enables `python -m upbank_mcp`

La separación es deliberada: client.py sabe de HTTP y nada de MCP, shapes.py es transformación pura de datos, y server.py contiene los contratos de las herramientas. Cada uno es comprobable de forma independiente.


Desarrollo

pip install -e .
export UP_API_TOKEN=up:yeah:...
upbank-mcp                              # stdio
MCP_TRANSPORT=http upbank-mcp           # http on :8000

Impulsa el servidor en proceso con el cliente FastMCP:

import asyncio
from fastmcp import Client
import upbank_mcp

async def main():
    async with Client(upbank_mcp.mcp) as client:
        print(await client.list_tools())
        result = await client.call_tool("list_accounts", {"account_type": "TRANSACTIONAL"})
        print(result.data)

asyncio.run(main())

Reconstruye la imagen después de los cambios:

docker compose up -d --build

Seguridad

El token es potente. Los tokens de acceso personal de Up no pueden mover dinero — la API no tiene endpoint de pago ni de transferencia — pero pueden leer tu historial completo de transacciones y modificar categorías, etiquetas y webhooks. Trátalo como una contraseña.

  • El transporte HTTP no tiene autenticación propia. Cualquier cosa que pueda alcanzar el puerto puede leer tus datos bancarios. Por ello, Compose publica solo en 127.0.0.1. No lo vincules a 0.0.0.0 ni lo expongas a través de un túnel o proxy inverso sin poner autenticación delante.

  • El token nunca se incrusta en una imagen. .env está listado en .dockerignore, y el token se proporciona en tiempo de ejecución. No aparece en ninguna capa de imagen, por lo que la imagen es segura de subir a un registro.

  • .env está en gitignore, y .env.example solo contiene un marcador de posición.

  • El contenedor se ejecuta como un usuario no root (uid 10001).

  • Rota inmediatamente en https://api.up.com.au/getting_started si un token llega a exponerse. Los tokens no caducan por sí solos.


Solución de problemas

Síntoma

Causa y solución

No Up API token configured

UP_API_TOKEN no está establecido o está vacío. Comprueba .env, y que Compose se ejecute desde el directorio del proyecto.

Compose sale con set UP_API_TOKEN in .env

Misma causa, detectada al inicio del contenedor en lugar de en la primera llamada.

Bind for 127.0.0.1:8000 failed: port is already allocated

Otro proceso ocupa el puerto 8000. Establece MCP_HOST_PORT en .env.

HTTP 401 — Unauthorized

El token no es válido o ha sido revocado. Vuelve a emitirlo.

HTTP 403 — Top-level categories cannot be set…

A categorize_transaction se le dio una categoría principal. Usa un id hoja de list_categories.

HTTP 404 en un id con aspecto válido

Los ids son específicos por cliente. Confirma que el id proviene de los datos de este propio token.

HTTP 429 repetidos

Límite de tarifa sostenido. Reduce page_size y la frecuencia de solicitudes; los reintentos ya son automáticos.

El cliente no muestra herramientas

El cliente debe ejecutar el contenedor con -i. Sin ello, stdio se cierra inmediatamente.


Referencia

F
license - not found
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    D
    quality
    D
    maintenance
    A Model Context Protocol server that allows AI assistants to connect to and manage Israeli bank accounts, fetch transactions, and handle authentication for all major Israeli banks and credit card companies.
    2
    32
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP wrapper for Up Bank's API that allows Claude and other MCP-enabled clients to manage accounts, transactions, categories, tags, and webhooks from Up Bank.
    3
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A Model Context Protocol server that enables interaction with You Need A Budget (YNAB) via their API, allowing users to manage budgets, accounts, categories, and transactions through natural language.
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A Model Context Protocol server that allows AI assistants to interact with Lunch Money accounts, enabling management of transactions, categories, budgets, and other financial data through natural language commands.
    MIT

View all related MCP servers

Related MCP Connectors

  • A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…

  • A Model Context Protocol server for Wix AI tools

  • MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/uiux-me/upbank-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server