Home · Setup · Cline

MCP Catalogue in Cline

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, lines_resolve and catalogue_report are derivations that write nothing and touch no meter, so they are safe to auto-approve. Keep sku_set behind a click, because it is the tool that spends one of the 25 free slots and because setting a row on a currency, tier and valid-from date that already exists REPLACES that row: the response says what it was and what it became, but the old figure is gone. Nothing here ever writes into another server's store; it reads the shared business profile, read-only and best-effort, and nothing else.

What you get in Cline

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 Cline

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

ScopePath
Cline CLI~/.cline/mcp.json
The editor extensionopened from the Cline panel, not by path; the documentation deliberately calls it the MCP settings JSON used by the extension
{
  "mcpServers": {
    "catalogue": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-catalogue"],
      "disabled": false,
      "autoApprove": []
    }
  }
}

No full-app restart. The MCP settings actions include restarting an unresponsive server if its tools do not appear.

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.

Write the transport in. Omitting type falls back to the legacy sse transport, which will not talk to this endpoint:

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

Cline notes worth knowing first

Cline is the one client here with an unsafe transport default. `type` selects it, and omitting `type` falls back to the legacy sse transport, so a streamable HTTP endpoint needs it written in or you will debug a server that is fine. Local entries carry "disabled" and an "autoApprove" array.

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

Where does the config live?

The CLI reads ~/.cline/mcp.json. For the extension, do not hunt for a path: MCP Servers icon, Configure tab, Configure MCP Servers. cline mcp opens a wizard, and cline config mcp --json is the non-interactive form.

The hosted endpoint will not connect.

Set the transport explicitly. Omitting type falls back to the legacy sse transport, so streamable HTTP needs "type": "streamableHttp" written in. It is the one default here that sends you debugging a server that works.

Should I auto-approve MCP Catalogue's tools?

Approve the read-only ones and leave the writing ones behind a click: each entry carries an autoApprove array and a disabled flag.

Related

MCP Catalogue in detail · The same server in Windsurf and Claude.ai and Claude Desktop connectors · Every server in Cline · Guides · Cline docs · Buy Pro