Home · Setup · Cursor

MCP Catalogue in Cursor

One price list and one labour rate card, kept where the invoice and the quote can both read them, with the price on a date worked out on the call. You give a product a code, a name, a unit, an optional VAT rate and a price in minor units with the day that price comes into force, and you give a role an hourly rate the same way. Then you hand the catalogue a list of what a customer had, and it hands back the line items already priced. A SKU holds its price ROWS rather than a current price, and the price on a date is the latest valid-from at or before it, worked out on the call, so putting a price up in July does not rewrite what June was quoted at, and sku_get names the row it picked, how many rows it considered and any later row already booked, which turns a question about a figure on an old invoice into one line of one file rather than an argument. A date before every row has no price and that is a refusal naming the earliest row and the day it starts, because filling it with the earliest row reprices history: a job done in December 2024 would be billed at the January 2025 price and would reconcile perfectly against a price list that did not exist yet. One row per currency, tier and valid-from date, and setting that key again REPLACES the row and says what it was and what it became, because two rows on one key make the price that day a coin toss decided by array order. Nothing is invented: no fallback, no profile default rate, no nearest match. An unknown code, or a code with no price in the currency and tier you asked for, is refused by name, because the invented number would be printed on a document a customer pays from. It creates no invoice and no quote of its own: lines_resolve returns the arguments and says posted false, and you run invoice_create in the invoice server or quote_create in the quotes server.

sku_get, sku_list, rate_get, price_list_text and lines_resolve are free, unlimited and write nothing at all, so leave them enabled permanently and reprice as often as you like. sku_set is the one that spends a slot out of the 25, and sku_delete gives it straight back while nothing depends on the code, so a mistyped SKU costs nothing but the retype.

What you get in Cursor

You sayTool
Add WEB-AUDIT, a fixed price site audit, 45,000 minor units from 2026-01-01, VAT 23 percent.sku_set
What was WEB-AUDIT priced at on 2026-03-15, and is there a later price already booked?sku_get
Senior developer 8,500 an hour and junior 4,500 from 2026-01-01. Then price three audits, twelve months of HOST-MO, seven and a half senior hours and three and a quarter junior hours as of 2026-03-15.lines_resolve

The two servers this catalogue feeds take the same price in different scales, and the gap is exactly 100x. invoice_create's item carries unit_price in MAJOR units, 90 for 90 EUR. quote_create's item carries unit_price_minor in MINOR units, 9000 for 90.00 EUR. Both fields are plain numbers, both are called the unit price, and neither tool can tell that the number it was handed was scaled for the other one: 45000 passed as unit_price is a perfectly valid invoice line for EUR 45,000.00, and it reconciles against itself. The unit suite measures the gap on the worked resolution: the correct payload nets 261,363 minor units, and the quote payload's field fed into the invoice engine nets 26,136,300, asserted as exactly 100x, and 1000x in a 3-decimal currency such as KWD. So the store holds MINOR units, which is the only lossless form, and lines_resolve builds BOTH payloads itself in one call with the scale printed against each. A catalogue that returned the price and let the caller choose the field would be wrong half the time, and wrong by two orders of magnitude when it was.

Install it in Cursor

The file is .cursor/mcp.json, and the key inside it is mcpServers.

ScopePath
This project only<project>/.cursor/mcp.json
Every project~/.cursor/mcp.json
{
  "mcpServers": {
    "catalogue": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-catalogue"]
    }
  }
}

The Customize page shows the server and its tools once it has started.

The npm publish of @theluckystrike/mcp-catalogue is pending; until then use the .mcpb bundle or a clone and build from the latest release.

No install: the hosted endpoint

The same server runs at https://mcp.zovo.one/mcp/https://mcp.zovo.one/mcp/catalogue over MCP streamable HTTP, no install. Mint a free token with curl https://mcp.zovo.one/mcp/token, or use a Pro key. It has no filesystem, so a file comes back as a one-hour download link.

{
  "mcpServers": {
    "catalogue": {
      "url": "https://mcp.zovo.one/mcp/https://mcp.zovo.one/mcp/catalogue",
      "headers": { "Authorization": "Bearer <token>" }
    }
  }
}

Cursor notes worth knowing first

The current field table marks `type` as required, with `stdio` for a locally launched server, so write it out rather than relying on command and args alone. The other documented restriction is that `envFile` is stdio-only: a remote HTTP or SSE server does not read it, and its headers belong in the config.

Free: 25 SKUs, the one standard price tier, unlimited rate cards, and every text answer including lines_resolve and price_list_text. A price list nobody can read is not a price list, and withholding lines_resolve would withhold the one thing the sibling servers came here for. sku_delete is free on every tier, and the resolution register is what makes that safe: every resolution updates one row per SKU and role it priced, so the register is bounded by the size of the catalogue rather than by traffic, and a code that has priced a line or that a rate card points at is refused by name with the times it was used and the last resolution id, because a code printed on a document somebody sent is a fact about that document. A byte-identical duplicate is refused before the free cap is even consulted, so a product filed twice names the code already stored rather than being met with an upgrade prompt, and burns neither a slot nor a place in the list. Pro is $19 once, verified offline.

Questions

Project config or global config?

<project>/.cursor/mcp.json applies to that project and can be committed, which suits a server tied to one client. ~/.cursor/mcp.json applies everywhere. Both are managed from the Customize page.

Why does my stdio entry not start?

The current field table marks type as required, with stdio for a locally launched server, so include it. Pointing at a remote endpoint, envFile is documented as stdio-only and is not read.

Is there a one-click install link?

Servers in Cursor's marketplace get an Add to Cursor button. The deeplink reference currently documents prompt, command and rule links only, so for MCP Catalogue pasting the config block above is the supported route.

Related

MCP Catalogue in detail · The same server in Claude Code and VS Code · Every server in Cursor · Guides · Cursor docs · Buy Pro