Alpha
Connect Claude to TallyUp.
Talk to Claude Desktop, Cursor, or Claude Code. They read and write your TallyUp data directly — no copy-paste, no bulk-import tool, no binary to install. Three steps, free.
How it works
TallyUp speaks the Model Context Protocol over HTTP, with OAuth 2.1 + PKCE for authorization. Paste https://tallyup.work/mcp into your MCP client, click Allow on the consent screen, and Claude can list your assets, file bills, decode VINs, mark maintenance done, and more, on your behalf. Every write is tagged with the connection that made it; if anything goes sideways you can revoke from /account/api-keys in one click.
tallyup.work. New connections are a paste + click; no JSON editing, no API keys to manage.
Setup
Get a TallyUp account
If you don't have one, create one for free. The first user on a fresh install becomes admin automatically.
Add the TallyUp MCP server in your client
Modern MCP clients (Claude Desktop ≥ Dec 2025, Claude Code, ChatGPT desktop, MCP Inspector) discover the OAuth flow automatically. Paste this URL where the client asks for an MCP server URL:
https://tallyup.work/mcp
Claude Desktop
Settings → Connectors (or MCP servers on older builds) → Add custom server, paste the URL above. The app opens TallyUp in your browser, signs you in if needed, and shows a consent screen.
Claude Code (CLI)
One command — Claude Code handles the OAuth handshake on your behalf:
claude mcp add --scope user --transport http tallyup https://tallyup.work/mcp
Then /exit any running Claude Code session and start a new one — your browser will open for the consent click on first use.
Cursor / other MCP clients
Add a new MCP server with type HTTP and URL https://tallyup.work/mcp. The client will redirect you through TallyUp for sign-in + consent.
Click "Allow"
You'll see a consent screen on tallyup.work listing the connecting client (e.g. "Claude Desktop") and the access being requested (mcp.access — read + write everything you can already see). Click Allow access. The browser hands you back to the client; you're done.
You can revoke the connection anytime from /account/api-keys.
Headless / API-key path (still supported)
For scripts, CI jobs, or older clients that can't follow the OAuth redirect, the original Bearer-token path still works. Generate a tau_… key at /account/api-keys and pass it as Authorization: Bearer tau_… on every request to /mcp. Existing keys keep working — no migration required.
Have your AI set it up for you
Or, paste the block below into a coding agent — Claude Code, Cursor, Claude Desktop — and let it handle the setup. Claude Code can run the CLI on your behalf; the desktop clients will walk you through the consent click.
You're being asked to connect this development environment to TallyUp via its Model Context Protocol server, so you can read and write the user's assets — homes, vehicles, equipment, bills, maintenance — on their behalf.
The MCP server is at https://tallyup.work/mcp. It speaks MCP over HTTP with OAuth 2.1 + PKCE — no API key needed.
If you're Claude Code, run:
claude mcp add --scope user --transport http tallyup https://tallyup.work/mcp
Then have the user /exit and start a fresh Claude Code session. The first call opens a browser for sign-in and consent.
If you're Claude Desktop or Cursor: walk the user through Settings → Connectors → Add custom server (HTTP transport), paste https://tallyup.work/mcp, and have them click "Allow access" on the consent screen. You can't do this step for them.
Once connected, call list_assets to confirm the connection and see what's recorded. Common tools: create_asset, create_bill, mark_bill_paid, create_maintenance_item, decode_vin, list_bills_upcoming, list_maintenance_upcoming. Full list at https://tallyup.work/docs/mcp.
If the user doesn't have an account yet, point them at https://tallyup.work/signup. They can revoke the connection at any time from https://tallyup.work/account/api-keys.
What can it do?
If you only remember a handful: list_assets to look around, create_asset and create_bill to file things, mark_bill_paid to close them out, and decode_vin to turn a VIN into a fully-populated vehicle. Your MCP client shows the whole set once you connect — and so does the table below, which lists every tool TallyUp registers.
| Tool | What it does |
|---|---|
| Read — assets & reference | |
| list_assets | Every asset the caller can see, with optional filters by kind / parent. |
| get_asset | One asset by id. Cross-account reads return "not found". |
| list_asset_kinds | The kind taxonomy (residential / vehicle / computer / your custom kinds). The only valid kind values for create_asset. |
| list_groups | Groups you're a member of, admin of, or viewer of. |
| list_documents | Documents attached to one record (asset, bill, payment, maintenance, insurance, warranty, group). |
| list_jurisdictions | Tax / utility jurisdictions configured on the instance. Reference data. |
| decode_vin | VIN → year, make, model, trim, engine, transmission, plant, etc. (NHTSA vPIC, free.) |
| Read — bills, income, maintenance | |
| list_bills | Every bill you can see, including paid and historical. Filter by parent, status, kind, cycle. |
| list_bills_upcoming | Bills due in the next N days (default 60). |
| get_bill | One bill by id. Cross-account reads return "not found". |
| list_income | Income records you can see. Filter by parent, year, or kind. |
| list_maintenance_upcoming | Maintenance items due in the next N days. |
| Read — your account | |
| get_account_info | Who the connection is acting as: id, email, display name, admin flag, verification state. |
| list_my_grants | The credential behind this request — kind, label, scopes, created / expires / last used. |
| Read — contacts | |
| list_contacts | Your contacts. Search by email before creating a duplicate. |
| get_contact | One contact by id. |
| list_asset_contacts | Who's linked to an asset, and in what role. |
| Write — assets | |
| create_asset | Add an asset; owner is you or a group you can write to. Optional external_id for re-import dedup. |
| update_asset | Rename, re-parent, or merge attributes on an asset you can edit. |
| add_asset_link | Attach an external URL — vendor portal, owner's manual, listing, dashboard. |
| create_asset_kind | Admin only. Add a new kind when none of the existing ones fit. |
| Write — groups | |
| create_group | Create a household / LLC / partnership / etc. Caller becomes admin + viewer (not a 100% member). |
| invite_group_member | Add someone to a group at a role + percentage. No email is sent — you share the invite link yourself. |
| Write — bills & payments | |
| create_bill | File a bill against an asset, group, or yourself. |
| update_bill | Edit a bill. Only the fields you pass change. |
| mark_bill_paid | Record a payment and flip the bill to paid. |
| Write — maintenance | |
| create_maintenance_item | Schedule maintenance on an asset / group / yourself. |
| update_maintenance_item | Edit a maintenance item. Partial update. |
| mark_maintenance_completed | Mark done with optional cost, mileage, or hour-meter. |
| Write — usage, value, income | |
| add_usage_reading | Mileage / hour-meter / kWh reading against an asset. |
| add_value_record | Point-in-time valuation snapshot. |
| update_income | Edit an income record. The parent is fixed at creation. |
| Write — contacts | |
| create_contact | Add a contact you own — vendor, tenant, manager, neighbour. |
| update_contact | Edit a contact. Clear email or phone explicitly. |
| delete_contact | Destructive. Refused while any bill, maintenance item, or open invite still points at it. |
| merge_contacts | Destructive. Fold one contact into another and delete the source. The dedup tool after a bulk import. |
| link_contact_to_asset | Record that a contact serves an asset, with a role. Idempotent. |
| unlink_contact_from_asset | Remove that link. Idempotent. |
| Bulk import | |
| bulk_create_contacts | Up to 500 contacts per call, deduped on email / external_id. Bad rows fail individually. |
| bulk_create_assets | Up to 500 assets per call, deduped on external_id. Bad rows fail individually. |
| Reports & export | |
| schedule_e_export | Schedule E (Form 1040 Part I) for one tax year, attributed by your ownership share. Depreciation is not computed. |
| get_pl | Profit & loss over any date range, for any asset kind. Capex and personal spend stay out of the operating net. |
| Calendar feeds | |
| list_calendar_feeds | iCal feeds (Airbnb, Vrbo, Booking, …) attached to an asset. |
| create_calendar_feed | Attach a feed. Treat the URL like a password — it grants the whole calendar. |
| update_calendar_feed | Edit a feed. Only the fields you pass change. |
| delete_calendar_feed | Destructive. Detaches the feed; already-imported reservations stay on the asset. |
| sync_calendar_feed | Pull one feed right now, the same as "Sync now" in the web UI. |
| Document providers | |
| list_provider_links | Files you've linked from external storage (Box.com today). |
| link_box_file | Attach a Box file to a record. Requires a Box account connected from /account/integrations. |
| disconnect_provider | Destructive. Drops your stored provider authorization. Existing links stay but stop refreshing. |
Try it
Once the client is configured, try one of these in chat:
- "List the assets in my TallyUp account."
- "I just bought a 2024 Toyota Tacoma, VIN 3TYRX5GN1RT123456. Add it to my assets at 123 Main St, Vancouver WA." Claude calls
decode_vin, thencreate_assetwith the suggested name and address. - "Show me what's due in the next 30 days." Claude calls
list_bills_upcomingandlist_maintenance_upcoming. - "Add a new household group called Smith Family — I'm not a member, just an admin." Claude calls
create_group; you can then add the Smiths as members from /groups.
Safety: rolling back a bad import
Every row Claude creates is tagged with the API key that made it. If a session goes sideways, you can recover from one place:
- Visit /account/api-keys.
- Click Records next to the key.
- See the per-table count of what that key wrote (assets, bills, maintenance, income, valuations, payments). Optionally narrow by date window.
- Click Delete — type the key prefix to confirm — and the rows go away in dependency order.
You can also Revoke the key at any time. Existing rows stay; future calls 401.
Treat keys like passwords
tau_… token can do whatever your account can do (within the key's scope). Don't paste them into chat logs, screenshots, or shared config files. Keys are stored hashed on our side; we can't recover one once you've left the reveal page.
- Use scope-limited keys when possible — a read-only key for a dashboard is much cheaper to lose than a read+write key.
- Use a different key per client (one for Claude Desktop, one for Cursor, one for a script) so revoking one doesn't break the others.
- Keys can have an expiry (DB-supported; UI exposing it lands soon).
Limits today
- No rate-limiting. Don't share keys with bots that loop hard. Use the Records page to spot runaway writes.
- No streaming for long-running tools. Every response fits in a single MCP message.
- One scope (
mcp.access) for OAuth-issued tokens. Granular scopes (read-only vs. read+write) are still available on the legacytau_…path; OAuth scope partitioning is on the roadmap. - Stateless. Each request stands alone — no sticky sessions between calls.
Need help?
Open an issue or send a note via your account page. The MCP spec is also a good read if your client misbehaves — most issues are config-file paths or forgetting to fully quit and relaunch.