Zovo Asset Register MCP Server

Fixed asset register for teams: assets, locations, depreciation, audit trail via AI agents. Local-first, free tier, $19 one-time Pro.

Documentation

All servers · Buy Pro $19 · All 46 for $39 · Source

Two ways to run it, both free to start. Open mcp.zovo.one/mcp/connect, copy the asset-register URL and paste it into any client that takes a URL. It already carries a free token, so there is nothing to install, no account and no header to set. The URL is https://mcp.zovo.one/mcp/asset-register/t/<token>. The token is not optional: the bare https://mcp.zovo.one/mcp/asset-register connects and lists its tools and then answers every tool call with HTTP 401, so use the link from /mcp/connect or send Authorization: Bearer <token>. Or download asset-register.mcpb and double-click it in Claude Desktop.

mcp-asset-register

In the official MCP Registry (io.github.theluckystrike/asset-register). Keep a fixed asset register and depreciate it on the rates the tax authorities actually publish. You give it what you bought, what it cost, when it went into use and which category it falls in; it gives you the rate, the useful life, the convention, the full schedule year by year or month by month, the monthly journal entry, and the gain or loss when you sell it. Three tables ship with it: the Polish annual depreciation rates from the annex to the CIT and PIT acts keyed to the KST classification, the UK capital allowance pools with the annual investment allowance, and the US MACRS GDS half-year tables for 3, 5 and 7 year property. The tables are bundled files, not a live feed, so the same asset depreciated twice gives the same answer, and every rate carries its instrument, its source URL and the date it took effect. Nothing leaves your machine.

Built by theluckystrike.

Install

One-click (.mcpb): download asset-register.mcpb from the latest release and double-click it in Claude Desktop: https://github.com/theluckystrike/mcp-servers/releases/latest

Hosted, no install: point a URL-based client at https://mcp.zovo.one/mcp/asset-register. GET https://mcp.zovo.one/mcp/connect mints a token and prints a ready URL.

npm publish for @theluckystrike/mcp-asset-register is pending, so the npx line below returns 404 today.

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "asset-register": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-asset-register"]
    }
  }
}

Claude Code:

claude mcp add asset-register -- npx -y @theluckystrike/mcp-asset-register

Cursor (~/.cursor/mcp.json or .cursor/mcp.json): the same entry as Claude Desktop.

Tools

toolwhat it does
asset_addAdd one asset to the register. The rate, the useful life and the convention come from the bundled table; both can be overridden.
asset_listThe register with cost, accumulated depreciation and net book value at a date, totalled per currency.
asset_scheduleThe full schedule for a stored asset or for one you are only pricing, per year or per month, down to zero or the residual.
asset_journalOne month's journal: debit depreciation expense, credit accumulated depreciation, per asset and in total, plus an expense_add payload.
asset_disposeRecord a sale, a scrapping or a write-off and get the gain or loss against net book value at that date.
asset_deleteRemove an asset nothing depends on, and get its free-tier slot back. An asset that has been disposed of or journaled is refused, with the dependent named.
asset_reportNet book value by category and currency, the year's charge, and every disposal in the year with its result.
license_statusFree or Pro, and where to upgrade.
license_activateActivate a Pro key. Verified offline.

Read the assets://categories resource for every bundled category, its code, its rate and what each table leaves out.

Free vs Pro

FreePro
Assets in the register10Unlimited
asset_scheduleYes, unlimitedYes
asset_list, asset_dispose, asset_deleteYes, unlimitedYes
asset_journalNoYes
asset_reportNoYes

Get Pro: $19 one-time, or $39 for the bundle. Or the 46-server bundle for $39.

What is in the tables, and what is deliberately not

Every table under src/tables/ carries a header with the authority, the instrument, the source URL, the date the rates took effect and the date they were read. The assets://categories resource returns those headers with the rates, so the provenance travels with the number.

The rule for what is in them: a value that could not be stated with confidence from the public text was left out, not guessed. A depreciation rate ends up on a tax return. A wrong one that looks authoritative is worse than an absent one, because an absent one is refused by name and you go and look it up.

tablebundledleft out
Poland, KST33 rows covering the annex positions this build could state with confidence: 0 percent (land, not depreciated at all), 1.5, 2.5, 4.5, 7, 10, 14, 20 and 30 percent, at the KST group and subgroup level, with the declining-balance eligibility of eachThe 18 and 25 percent positions of the annex. Their KST membership could not be stated with confidence, so no row claims them. Also every individual six-digit KST code: a taxpayer classifies the asset, this table carries the rate
UK, capital allowancesThe main rate pool at 18 percent, the special rate pool at 6 percent, and the annual investment allowance as a 100 percent first-year row with its GBP 1,000,000 capThe first-year and full-expensing rules, the structures and buildings allowance, the small pools allowance, the CO2 thresholds that decide which pool a car enters, and every balancing charge. All date-sensitive, none stated with confidence here
US, MACRSThe 3, 5 and 7 year GDS classes under the half-year convention, as the published Pub 946 Table A-1 percentagesThe mid-quarter and mid-month conventions, the 27.5 and 39 year real property classes, the 10, 15 and 20 year classes, the Alternative Depreciation System, section 179 and bonus depreciation. A 10-year class is refused by name, not approximated to the 7-year one

Rates change. Check the effective_date in any answer before you rely on it, and read the source_url if the purchase is recent.

Rules the engine applies

  • Poland charges from the month AFTER the asset enters the register (art. 16h ust. 1 pkt 1). An asset in service on 15 March starts on 1 April, so year one is nine twelfths of the annual rate and the schedule runs one calendar year longer than the life suggests. Every answer names the first charge month.
  • The Polish declining-balance method switches (art. 16k). The rate is multiplied by a coefficient of up to 2.0 on the written-down value, and in the first year the declining amount would fall below the straight-line amount, the rest of the schedule is straight line. Passenger cars (KST 741) and buildings are excluded from the method entirely and are refused rather than quietly computed.
  • A UK writing down allowance is a pool rate, not a per-asset charge. This server applies it to one asset so a per-asset figure exists, and says so in every answer. A pure reducing balance never reaches zero, so the schedule is cut at 25 periods and the last one writes off what is left, with the basis line saying that is what happened.
  • MACRS ignores salvage value. The published percentages recover the whole cost. A residual passed for a US asset is reported back as ignored and kept on the record for book purposes, rather than silently reducing the base.
  • The periods sum to the depreciable base, to the minor unit. Money is integer minor units end to end and the schedule is allocated by cumulative rounding, so sum(periods) == cost - residual holds for every input, and the monthly rows sum to their year.
  • A byte-identical asset is refused, not stored twice. asset_add normalises the name, the category, the cost, the currency, the dates, the method, the life, the scheme and the salvage value, and a record that matches an asset already on the register is refused by that asset's id with nothing written. A retried call and a re-run script look exactly like a second machine, and on a ten-asset free tier the second row is a slot you cannot get back. Two genuinely identical units are a legitimate register: give the second one a distinguishing name and it is accepted.
  • asset_delete is the way back, and it is free. It removes an asset nothing depends on. A recorded disposal or a month asset_journal has already journaled is a dependent, and the delete is refused with that dependent named rather than removing the cost behind a figure that has already left this server. The id is never reissued.
  • Depreciation is charged up to and including the month of disposal, then stops. The gain or loss is proceeds less net book value at that month, and the disposal journal balances to zero.
  • Currencies are never added together. There is no exchange rate in this server, so a PLN register and a USD one stay two figures.

Posting to the expense tracker

asset_journal returns the exact expense_add arguments for the expense-tracker server, one payload per currency, and writes no expense itself. That is deliberate: expense-tracker publishes no library entry point, and its id counter, its category rules, its VAT split and its currency defaults all live inside its own expense_add handler under its own lock. Appending a row to its data.json directly would produce an entry with none of those applied: one that looks native and is not. Handing back the arguments is the same contract per-diem and kanban use. It does mark the register: each asset it produced a line for records the month, so asset_delete can refuse an asset whose depreciation has already been journaled instead of deleting the cost behind a posted figure.

No vat_rate is set on the payload. Depreciation is a book charge, not a purchase, so there is no input VAT on it.

A measured insight

The yearly schedule is where you look for rounding errors, and the monthly journal is where they actually are.

Of the 67 schedules these three tables can produce for one test asset (cost 12,345.67, residual 45.67, in service 12 March 2026), the yearly rows come out clean under almost any rounding rule, because an annual amount is a percentage of a base and lands on or near a whole cent. Split those same years into months by rounding each month independently and 35 of the 67 no longer sum to the depreciable base, off by up to 390 minor units, 3.90 on a 12,345.67 asset. The worst offenders are the longest-lived rows: a residential building at 1.5 percent spreads its base over 800 months, and 800 half-cent roundings is where the 3.90 comes from.

That is the wrong way round from the intuition. The monthly split feels like the harmless presentational step, the one after the real arithmetic has been done, so it is the step that gets a bare Math.round and no test. It is also the only step whose output is posted: nobody journals a year, they journal a month, so the number that reaches the ledger is the one from the step that was not checked. The fix is that allocate rounds the CUMULATIVE total at each step and takes each amount as the difference between two rounded cumulatives, with the last period set to whatever is left, and it is applied to the monthly split as well as the yearly one. test/contract.test.mjs then asserts the identity for every schedule the tables can produce rather than for the two or three a unit test would have picked.

Privacy

Everything stays on your machine. Assets are JSON under ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/asset-register/. The rate tables are files inside the package. There is no network call anywhere in this server, no account and no API key. License keys are verified offline.

License

MIT. Support: support@zovo.one

First five minutes

One prompt that scored 3 of 3, measured in round 27, 2026-09-05. Paste it in as it is written.

I bought a laptop for 6,000 zloty and put it into use on 1 September 2026. Add it to my fixed asset register and give me September's depreciation journal entry.

Paste this into Claude with the server connected.

What it did, measured in round 27, 2026-09-05: asset_add wrote ASSET-2026-0001 at KST 487, computers and computer sets, 30 percent, useful life 3.33 years, cost_minor 600000 PLN, in service 2026-09-01, with the scheme derived as pl from the zloty amount rather than from the profile's EUR. asset_journal is Pro and refused on the free tier.

On the free tier for this path: Depreciation schedules are unlimited on every tier: the rates are public information a tax authority published, and metering the reading of a regulation would be charging for the government's work. The cap is on the SIZE of the register, 10 assets, plus unlimited asset_list and asset_dispose.

Set it up in your client

Exact config path, entry and caveats: Claude Desktop · Claude Code · Cursor · VS Code · Windsurf · Cline · Claude.ai and Claude Desktop connectors · all clients

Compared with the alternatives

MCP Asset Register vs Snipe-IT and spreadsheets: which asset register to pick · all comparisons

Guides

How to track billable hours inside Claude Code and Cursor · Create an invoice PDF from a chat message with an MCP server · Ask questions about an Excel or CSV file from Cursor or Claude · Watch a product price with Claude and get told when it drops · What the free tier includes and what Pro adds · Log expenses and mileage in Claude, split VAT, rebill to an invoice · Convert currencies in Claude with real ECB rates, no API key · Generate Word proposals and contracts from a chat message · Find a meeting time across time zones without doing the arithmetic · Write a resume and a cover letter from chat, without inventing anything · Bill a retainer on a schedule without a billing SaaS · Assemble a contract from your own clause library, in chat · Connect MCP servers to Claude.ai, Claude Desktop, Cursor and VS Code without installing anything · Merge, split and stamp PDFs from chat, and why some come back as glyph numbers · Read a.ics calendar in Claude: free and busy, conflicts, and billable meetings · Run a kanban board in Claude, with time tracking on the same task · Resize, compress and watermark images from a chat message · Categorize and reconcile a bank CSV export from chat · Send a quote from chat, then turn the yes into an invoice · Put a SEPA payment QR code on an invoice from chat · Zip and unzip archives safely from Claude or Cursor · Client deposits and retainers from chat, applied to your real invoices · Fixed assets and depreciation from chat, on the rates the tax authorities publish · Per diem and travel allowances from chat, on the rate tables the tax authorities publish · One double-entry ledger out of every server you already run · Loan and lease schedules from chat, closing exactly on zero · Work orders and job cards from chat, and why the markup goes on the unit cost · Price lists and rate cards from chat, and the 100x scale gap between the invoice and the quote · Change orders and the running contract value from chat, and why a changed line is two items · A petty cash float from chat, and why the cheque is not the sum of the vouchers · Client statements and payment chasers from chat, aged as at any date you name · Credit notes and purchase orders from chat, against your real invoices · One install, every server: the office-suite bundle · Close a month in chat: invoice, credit note, retainer, bank reconciliation, statement · MCP server not showing up in Claude Desktop: the six checks that find it · Where is claude_desktop_config.json, and what goes in it · claude mcp add: every flag, and the scope that silently loses your server · MCP servers on Windows: spawn npx ENOENT, backslashes and the PATH · Installing these MCP servers when npx does not work yet · Cursor MCP setup: mcp.json, the required type field, and where the servers appear · Which MCP servers work with no network at all · Invoicing an EU client with reverse charge, from a chat message · Quote, deposit, invoice, statement: the whole cycle in one conversation · Is this project making money? Hours against costs, without a spreadsheet · Building a tax year pack for your accountant from chat · Keeping a mileage log in chat, with the rate you actually claim · Reconciling a bank CSV against what you invoiced and spent · Rebilling client expenses, with a markup and the VAT handled honestly · Chasing an unpaid invoice: aging, then the letter · A bill of sale from chat, with the identifiers checked and the signature lines printed · Pricing a job from a rate card, and what to do when the scope changes · Working out your hourly rate from what you actually billed · Converting CSV to xlsx and back without opening Excel · Asking a spreadsheet questions in plain language · Merging a folder of receipts into one PDF from chat · Splitting one big scan into separate documents · Sending a month of paperwork as one archive, safely · MCP servers in VS Code: the one-word mistake that breaks every config · MCP servers in Windsurf and Cline: two defaults that waste an afternoon · Local MCP server or hosted URL: which one, and what you give up · What these MCP servers actually do on the free tier · Choosing an MCP server for invoicing: the seven questions worth asking · When you need an MCP server, and when a prompt is enough · MCP config file locations and JSON keys, every client · Why an MCP server does not appear, in order of likelihood · How MCP registry search actually works, measured · What is actually in the MCP registry: 6,000 rows counted · stdio or streamable HTTP: which MCP transport, and what breaks · MCP protocol versions: what each one changed · Every field in an MCP server config entry, by client · MCP config scopes: which definition wins when a server is defined twice · Where each MCP client writes its logs · Shipping an MCP server: a bundle to download or a URL to paste · What is inside a.mcpb MCP bundle · Charging for an MCP server: how licensing actually works · How much text an MCP server may return, and how much it may describe · What to check before letting an MCP server run · Why a directory says your hosted MCP server is not responding · The MCP registry binds one remote URL to one server name · Capital letters in your GitHub username change your MCP registry rank · How many MCP servers already have your word in the name · server.json field reference for the MCP registry · When an MCP tool fails, do not return a JSON-RPC error · structuredContent and outputSchema in MCP, and what MUST hold · Rules for naming an MCP tool, and the collision nobody plans for · MCP has no session, so how do two tool calls share state · x-mcp-header: mirroring tool parameters into HTTP headers · How a directory scores an MCP server, and why your worst tool decides it · What AI crawlers fetch that Googlebot does not, measured on 141 URLs · Search Console's URL Inspection API changes its answer between calls · Which MCP servers work by pasting a URL, with nothing installed · Where to find MCP servers that cost money, and how you actually pay · Getting an assistant to fill in a quote or estimate for a customer · Is there an MCP server for a petty cash book or a cash ledger · Currency conversion in an assistant, and which MCP server to use · Zipping and unzipping archives from an assistant, and what the guards do · Producing a delivery schedule or a work order document from a chat · Will an MCP server email the invoice to my client · Can an assistant read a photo of a receipt and log the expense · Which MCP server can generate invoice PDFs from a chat message? · Can an MCP server read a bank statement PDF and categorise the transactions? · Best MCP servers for small business accounting and paperwork in 2026 · MCP Supplier Directory: keep supplier lists from rotting in a spreadsheet · MCP Service Agreement: stop copying a rotting contract template off the internet · MCP Maintenance Log: know what service is due without anyone remembering · MCP Mileage Log: keep the deductible log at the moment of the drive, not in April · Invoice payment terms best practices: Net 30, due date and late fees · How to categorize bank transactions · Petty cash log template · All guides

More servers

MCP Zip · MCP Billing Docs · MCP Deposits · MCP Per Diem Calculator — Employee Travel Allowances from Claude · MCP Server for Statements of Account — Customer Balances from Claude · MCP Server for Cash Book — Receipts, Payments and Balances from Claude · MCP Amortization · MCP Petty Cash Server — Track a Petty Cash Float from Claude