Koskamo

theluckystrike Catalogue MCP

A community MCP server that manages a single price list and labour rate card. It allows agents to set SKU prices and hourly rates with effective dates, resolve line items into invoice-ready or quote-ready formats, and generate price list reports or PDFs. It ensures historical pricing accuracy by refusing to invent unknown codes.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

theluckystrike Catalogue MCP logo, by theluckystrikeCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by theluckystrike
You need:Get a free token with one requestcurl -X POST https://mcp.zovo.one/mcp/token
MCP endpoint (Streamable HTTP)
https://mcp.zovo.one/mcp/catalogue
Vendor documentation

What its tools do

12 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

12 of 12 have a description · 12 of 12 declare behavior hints · 9 of 11 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Resolve SKU codes and hours into priced line items for quotes
  • Set new product prices or labour rates with effective dates
  • Generate a plain text or PDF price list for a specific tier
  • List catalogue lines filtered by code prefix or currency

Source and maintenance

Community listingRegistry 0.23.0
Maintenance checked

Protocol and capabilities

Server
mcp-catalogue 0.22.6
MCP protocol negotiated in check
2025-11-25
Tools
12 advertised
Resources
2 advertised
Resource templates
0 advertised
Prompts
2 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "prompts": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

A product and labour price catalogue. It covers SKUs with unit, VAT rate and dated prices per currency and tier, hourly labour rates by role, the price in force on any date, quote and invoice lines priced from the catalogue, and price lists under the business name. Prices are whole minor units and a new price keeps the earlier rows. The catalogue is stored per user account on McpStamp's hosted service. The free tier holds 25 SKUs in one tier; the print-ready price list and catalogue summary need Pro. One lifetime key unlocks this server and all 58 others: https://mcp.zovo.one/buy/bundle?src=instr.catalogue

Tools

12 advertised

sku_set — Add or reprice a SKU
Advertised by the server during the last successful anonymous check.

Add a catalogue line or reprice one: a code, a name, a unit, an optional VAT rate, and price_minor in whole minor units for one currency, tier and valid_from. A repriced line keeps its old rows. Free: 25 SKUs, one tier.

sku_set input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "sku",
    "name",
    "price_minor"
  ],
  "properties": {
    "sku": {
      "type": "string",
      "maxLength": 64,
      "description": "The code, e.g. WEB-AUDIT. Upper case, no spaces. This is what an invoice line is filed under"
    },
    "name": {
      "type": "string",
      "maxLength": 200,
      "description": "What it is on the customer's document, e.g. Website audit"
    },
    "note": {
      "type": "string",
      "maxLength": 2000
    },
    "tier": {
      "type": "string",
      "maxLength": 40,
      "description": "Price tier, e.g. trade or list. Default standard. A second tier is Pro"
    },
    "unit": {
      "type": "string",
      "maxLength": 40,
      "description": "What one of it is: each, hour, month, 1000 words. Default each. Required the first time"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "ISO code this price is in. Defaults to the shared business profile's currency"
    },
    "vat_rate": {
      "type": "number",
      "maximum": 1000,
      "minimum": 0,
      "description": "VAT percent for this product, overriding the shared profile's default on a resolved line"
    },
    "valid_from": {
      "type": "string",
      "maxLength": 10,
      "description": "The first day this price applies, YYYY-MM-DD. Default today"
    },
    "price_minor": {
      "type": "integer",
      "maximum": 1000000000000,
      "minimum": 0,
      "description": "The price of ONE, in whole minor units. 45000 is EUR 450.00. Never a decimal"
    },
    "duplicate_ok": {
      "type": "boolean",
      "description": "Add it even though another code already carries the same product at the same price. Default false"
    }
  }
}
sku_set annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
sku_get — The price of one SKU on a date
Advertised by the server during the last successful anonymous check.
Advertised read-only

Show the price of one SKU as of a date, in one currency and tier: the row picked is the latest valid_from at or before that date, and the answer names the row and any later one already booked. Free.

sku_get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "sku"
  ],
  "properties": {
    "sku": {
      "type": "string",
      "maxLength": 200,
      "description": "The SKU code, e.g. WEB-AUDIT, or the product name when only one product carries it"
    },
    "date": {
      "type": "string",
      "maxLength": 10,
      "description": "The day the price is wanted for, YYYY-MM-DD. Default today"
    },
    "tier": {
      "type": "string",
      "maxLength": 40,
      "description": "Price tier. Default standard"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "Defaults to the shared business profile's currency"
    }
  }
}
sku_get annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
sku_list — List the catalogue
Advertised by the server during the last successful anonymous check.
Advertised read-only

List catalogue lines with the price in force today, filtered by code prefix, by currency and by tier. A SKU with no price in that currency and tier is listed and said to have none. Free.

sku_list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "date": {
      "type": "string",
      "maxLength": 10,
      "description": "Show the price in force on this day instead of today, YYYY-MM-DD"
    },
    "tier": {
      "type": "string",
      "maxLength": 40,
      "description": "Price tier. Default standard"
    },
    "limit": {
      "type": "integer",
      "maximum": 500,
      "minimum": 1,
      "description": "Maximum rows returned, default and ceiling 500"
    },
    "prefix": {
      "type": "string",
      "maxLength": 64,
      "description": "Only codes starting with this, e.g. HOST- for every hosting line"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "The currency the price in force is shown in. Defaults to the profile's"
    }
  }
}
sku_list annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
sku_delete — Delete an unused SKU
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete a catalogue line no rate card points at and that never priced a resolved line, freeing a free-tier slot. Otherwise it is refused, naming what depends on it: reprice it to withdraw it instead.

sku_delete input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "sku"
  ],
  "properties": {
    "sku": {
      "type": "string",
      "maxLength": 200,
      "description": "The SKU code, e.g. WEB-AUDIT, or the product name when only one product carries it"
    }
  }
}
sku_delete annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}
rate_set — Set a labour rate
Advertised by the server during the last successful anonymous check.

Set the hourly charge-out rate on a labour card: role, currency, hourly_minor in whole MINOR units and the day it starts. The same role, currency and date REPLACES that row rather than adding one. Free.

rate_set input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "role",
    "hourly_minor"
  ],
  "properties": {
    "sku": {
      "type": "string",
      "maxLength": 64,
      "description": "A catalogue code this role bills under, so a resolved hours line carries the SKU's name and VAT rate"
    },
    "note": {
      "type": "string",
      "maxLength": 2000
    },
    "role": {
      "type": "string",
      "maxLength": 64,
      "description": "The role charged for, e.g. senior developer. Lower case, this is what an hours line is priced from"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "ISO code this rate is in. Defaults to the shared business profile's currency"
    },
    "valid_from": {
      "type": "string",
      "maxLength": 10,
      "description": "The first day this rate applies, YYYY-MM-DD. Default today"
    },
    "hourly_minor": {
      "type": "integer",
      "maximum": 1000000000000,
      "minimum": 0,
      "description": "The hourly rate in whole minor units. 8500 is EUR 85.00 an hour. Never a decimal"
    }
  }
}
rate_set annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
rate_get — The hourly rate on a date
Advertised by the server during the last successful anonymous check.
Advertised read-only

Show the hourly rate for a role as of a date and currency: the row picked is the latest valid_from at or before that date, and the answer names it. With no role given, lists every card. Free.

rate_get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "date": {
      "type": "string",
      "maxLength": 10,
      "description": "The day the rate is wanted for, YYYY-MM-DD. Default today"
    },
    "role": {
      "type": "string",
      "maxLength": 64,
      "description": "The role, e.g. senior developer. Omit to list every rate card"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "Defaults to the shared business profile's currency"
    }
  }
}
rate_get annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
lines_resolve — Price lines from the catalogue
Advertised by the server during the last successful anonymous check.
Advertised read-only

Turn a list of sku or role lines into invoice_create-ready and quote_create-ready items priced from the catalogue as of each line's date. An unknown code is refused by name and never priced. Free.

lines_resolve input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "lines"
  ],
  "properties": {
    "date": {
      "type": "string",
      "maxLength": 10,
      "description": "The day the whole list is priced as of, YYYY-MM-DD. Default today"
    },
    "tier": {
      "type": "string",
      "maxLength": 40,
      "description": "Price tier for every line. Default standard"
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "sku": {
            "type": "string",
            "maxLength": 200,
            "description": "A catalogue code or product name. One of sku or role, never both"
          },
          "date": {
            "type": "string",
            "maxLength": 10,
            "description": "The day this line is priced as of, YYYY-MM-DD. Overrides the call's date"
          },
          "role": {
            "type": "string",
            "maxLength": 64,
            "description": "A rate card role. One of sku or role, never both"
          },
          "tier": {
            "type": "string",
            "maxLength": 40,
            "description": "Price tier for this line. Overrides the call's tier"
          },
          "hours": {
            "type": "number",
            "maximum": 100000,
            "description": "Hours worked, for a role line",
            "exclusiveMinimum": 0
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Za-z]{3}$",
            "description": "Overrides the call's currency for this line. Every line on one payload must agree"
          },
          "quantity": {
            "type": "number",
            "maximum": 1000000,
            "description": "How many, for a sku line",
            "exclusiveMinimum": 0
          },
          "description": {
            "type": "string",
            "maxLength": 2000,
            "description": "Override the catalogue name on the customer's document"
          }
        }
      },
      "maxItems": 200,
      "minItems": 1,
      "description": "The lines to price, each a sku with a quantity or a role with hours"
    },
    "client": {
      "type": "string",
      "maxLength": 200,
      "description": "Client name or id, copied into both payloads. invoice_create and quote_create both need one"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "The currency for every line. Defaults to the shared business profile's"
    },
    "tax_rate": {
      "type": "number",
      "maximum": 1000,
      "minimum": 0,
      "description": "VAT percent for lines whose SKU carries no rate of its own, overriding the shared profile"
    }
  }
}
lines_resolve annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
price_list_text — The price list as plain text
Advertised by the server during the last successful anonymous check.
Advertised read-only

Print the price list as plain text: every SKU with its unit, the price in force on a date and any later price booked, then the labour rate cards, under your business name. Also a .txt download link valid one hour. Free; price_list_pdf writes the A4 page.

price_list_text input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "date": {
      "type": "string",
      "maxLength": 10,
      "description": "The day the list is in force, YYYY-MM-DD. Default today"
    },
    "tier": {
      "type": "string",
      "maxLength": 40,
      "description": "One tier, or omit for standard. Pass all for every tier, which is Pro"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "Defaults to the shared business profile's currency"
    }
  }
}
price_list_text annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
price_list_pdf — The price list as an HTML document (print to PDF)
Advertised by the server during the last successful anonymous check.
Advertised read-only

Call this tool to render the price list for one currency and tier as an A4 HTML document laid out for print-to-PDF (this hosted endpoint has no PDF renderer) and return a download link valid for one hour: every SKU with its unit, its price in force and the day that price started. Pro.

price_list_pdf input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "date": {
      "type": "string",
      "maxLength": 10,
      "description": "The day the list is in force, YYYY-MM-DD. Default today"
    },
    "tier": {
      "type": "string",
      "maxLength": 40,
      "description": "One tier. Default standard"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "Defaults to the shared business profile's currency"
    },
    "out_path": {
      "type": "string",
      "maxLength": 1000,
      "description": "Name for the downloaded file, e.g. trade-prices-april. Defaults to price-list-<currency>-<tier>-<date>; the list comes back as a download link valid for one hour"
    }
  }
}
price_list_pdf annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
catalogue_report — Report the catalogue
Advertised by the server during the last successful anonymous check.
Advertised read-only

Report the catalogue as at date: how many SKUs there are, how many price rows are in force, which rows a later row already replaces, and which SKUs carry no price in the profile's default currency. Reads only. Pro.

catalogue_report input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "date": {
      "type": "string",
      "maxLength": 10,
      "description": "The day the report is in force, YYYY-MM-DD. Default today"
    },
    "limit": {
      "type": "integer",
      "maximum": 500,
      "minimum": 1,
      "description": "Maximum rows listed in each section, default and ceiling 500"
    }
  }
}
catalogue_report annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
license_status — License status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.

license_status input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
license_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
license_activate — Activate license
Advertised by the server during the last successful anonymous check.

Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.

license_activate input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "key"
  ],
  "properties": {
    "key": {
      "type": "string",
      "description": "License key from checkout, MCPL1.<payload>.<signature>"
    }
  }
}
license_activate annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}

Prompts

2 advertised

upgrade_to_pro — Explain the upgrade

Advertised by the server during the last successful anonymous check.

Explain what Pro on the catalogue server costs and exactly what the user has to do, without leaving the conversation.

feature
The capped feature that prompted this, if there was one
price_the_job — Price a job from the catalogue

Advertised by the server during the last successful anonymous check.

Price a list of products and hours from the catalogue and hand the result to the invoice or the quotes server.

client
The client the lines are for (required)

Resources

2 advertised

pricing — Pricing and upgrade

Advertised by the server during the last successful anonymous check.

What catalogue costs, what Pro unlocks, the checkout link that carries this connection's token, and the one step a person has to take. Machine-readable; read it before telling a user how to lift a free-tier cap.

pricing URI
pricing://catalogue

MIME type: application/json

catalogue — The price ladder, the free tier and where this server writes

Advertised by the server during the last successful anonymous check.

How a price is chosen on a date, the two payload scales, the free-tier limits and the one document this server writes.

catalogue URI
catalogue://price-list

MIME type: application/json

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1378 ms
95th percentile latency
1378 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1378 ms · metadata changed · 12 tool(s), 2 resource(s), 0 resource template(s), 2 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http catalogue-mcp-zovo https://mcp.zovo.one/mcp/catalogue

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add catalogue-mcp-zovo --url https://mcp.zovo.one/mcp/catalogue

Cursor

Merge this server into .cursor/mcp.json in your project, then enable catalogue-mcp-zovo in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "catalogue-mcp-zovo": {
      "url": "https://mcp.zovo.one/mcp/catalogue"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "catalogue-mcp-zovo": {
      "type": "streamableHttp",
      "url": "https://mcp.zovo.one/mcp/catalogue",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start catalogue-mcp-zovo and inspect its tools.
VS Code configuration
{
  "servers": {
    "catalogue-mcp-zovo": {
      "type": "http",
      "url": "https://mcp.zovo.one/mcp/catalogue"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http catalogue-mcp-zovo https://mcp.zovo.one/mcp/catalogue

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.zovo.one/mcp/catalogue

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "catalogue-mcp-zovo": {
      "serverUrl": "https://mcp.zovo.one/mcp/catalogue"
    }
  }
}

Let your agent find its tools

Find servers like theluckystrike Catalogue MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.