Catalogue MCP

Una lista de precios y tarifas que los servidores de cotizaciones y facturas leen por SKU.

Documentación

mcp-catalogue

Servidor MCP para una lista de precios de productos y una tarifa de tarifas. Una lista de precios y una tarifa de tarifas, mantenidas donde tanto la factura como el presupuesto pueden leerlas.

Funciona con Claude Desktop, Claude Code, Cursor y cualquier cliente del Protocolo de Contexto de Modelos. Se ejecuta en tu propia máquina, o se aloja sin instalación.

Página del producto: https://mcp.zovo.one/s/catalogue — qué hace, las herramientas que expone y un endpoint de token en vivo.

Instalación

Alojado, nada que instalar. Obtén un token de https://mcp.zovo.one/mcp/connect (la página de conexión) o https://mcp.zovo.one/mcp/token (el mismo token como JSON); se emite un token anónimo gratuito al instante y una clave Pro funciona de la misma manera. Luego apunta un cliente MCP a https://mcp.zovo.one/mcp/catalogue a través de streamable-http y envía el token como Authorization: Bearer <token>.

Si tu cliente no puede configurar encabezados, coloca el token en la ruta en su lugar: https://mcp.zovo.one/mcp/catalogue/t/<token>. Ambas formas funcionan. La URL desnuda sin token responde 401 en tools/call, por lo que el token no es opcional.

Claude Desktop, un clic. Descarga catalogue.mcpb desde la última versión y haz doble clic en él.

Desde el código fuente. El espejo es autónomo: cada dependencia de @theluckystrike/* está incluida, por lo que un clon nuevo se compila sin configuración adicional.

git clone https://github.com/theluckystrike/mcp-catalogue.git
cd mcp-catalogue
npm install && npm run build

Luego apunta tu cliente al punto de entrada compilado:

{
  "mcpServers": {
    "catalogue": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-catalogue/dist/index.js"]
    }
  }
}

@theluckystrike/mcp-catalogue aún no está publicado en npm, por lo que un comando npx -y @theluckystrike/mcp-catalogue fallará. Las tres rutas anteriores son las que funcionan y cada una es ejercitada por CI.

catalogue demo

Espejo de solo lectura de mcp-servers/servers/catalogue. Consulta MIRROR.md.

En el Registro Oficial de MCP (io.github.theluckystrike/catalogue). Una lista de precios y una tarifa de tarifas, mantenidas donde tanto la factura como el presupuesto pueden leerlas. Dale a un producto un código, un nombre, una unidad y un precio en unidades menores, con el día en que ese precio entra en vigor. Dale a un rol una tarifa por hora de la misma manera. Luego entrega al catálogo una lista de lo que tenía un cliente, y devuelve los elementos de línea ya con precio: la cantidad, la descripción, el precio unitario y la tasa de IVA, en la forma exacta de argumento que invoice_create toma y en la forma exacta de argumento que quote_create toma.

Nada se inventa y nada se almacena dos veces. Un SKU contiene sus FILAS de precios, cada una con una fecha de validez; el precio en una fecha se calcula en la llamada, por lo que subir un precio en julio no reescribe lo que se cotizó para el trabajo de junio. Un código desconocido regresa como una negativa que nombra el código, nunca como un precio adivinado.

La publicación en npm para @theluckystrike/mcp-catalogue está pendiente, por lo que npx -y @theluckystrike/mcp-catalogue devuelve 404 hoy. Hasta entonces, el paquete de un clic .mcpb o un clon+compilación es la ruta que funciona.

Instalación

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json (macOS) o %APPDATA%\Claude\claude_desktop_config.json (Windows):

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

Claude Code

claude mcp add catalogue -- npx -y @theluckystrike/mcp-catalogue

Cursor

~/.cursor/mcp.json (global) o .cursor/mcp.json (proyecto), misma entrada que Claude Desktop.

Herramientas

HerramientaQué hace
sku_setAgregar una línea de catálogo o volver a fijar el precio de una: código, nombre, unidad, tasa de IVA opcional y un precio en unidades menores para una moneda, nivel y fecha de validez
sku_getEl precio de un SKU en una fecha, nombrando la fila de la que proviene y cualquier precio posterior ya reservado
sku_listEl catálogo con el precio vigente, filtrado por prefijo de código, moneda y nivel
sku_deleteEliminar una línea creada por error. Solo una de la que nada depende. Gratis en todos los niveles
rate_setEstablecer una tarifa por hora en la tarifa de tarifas de un rol, desde el día en que aplica, opcionalmente vinculada a un SKU
rate_getLa tarifa por hora para un rol en una fecha, o todas las tarifas de tarifas
lines_resolveFijar el precio de una lista de líneas de sku y rol en elementos listos para invoice_create y listos para quote_create
price_list_textLa lista de precios como texto plano: precios vigentes, fechas de validez, luego las tarifas de mano de obra
price_list_pdfLa lista de precios como PDF A4, por moneda y nivel
catalogue_reportSKUs, filas vigentes, filas que una fila posterior ya reemplaza, filas sin precio en la moneda predeterminada
license_status / license_activateGratis o Pro, y dónde actualizar

Gratis vs Pro

GratisPro
SKUs en el catálogo25ilimitado
Filas de precio por SKU100100
Tarifas de tarifasilimitadasilimitadas
Establecer, fijar precio, listar, resolver líneassísí
Lista de precios (texto)sísí
Eliminar un SKU no utilizadosísí
Niveles de precio más allá de standardnosí
Lista de precios (PDF)nosí
Informe de catálogonosí

Obtén Pro: https://mcp.zovo.one/buy/catalogue ($19 único para este servidor, $39 para todos ellos, de por vida). Las claves se verifican sin conexión; nada se envía a ningún lugar.

De dónde proviene el precio

Una fila de precio es (currency, tier, valid_from, amount). El precio en una fecha es la más reciente valid_from en o antes de esa fecha, para esa moneda y ese nivel. Establecer una fila en una clave que ya existe la REEMPLAZA, por lo que dos filas nunca pueden compartir una clave y "el precio de ese día" nunca es un volado. Una fecha anterior a todas las filas no tiene precio y se rechaza; un precio que aún no existía no es un precio.

Nada aquí convierte una moneda. Un precio en EUR mostrado bajo un encabezado en PLN sería un número inventado, por lo que un SKU sin precio en la moneda que solicitaste se lista como que no tiene ninguno, y catalogue_report los cuenta.

La percepción medida

Los dos servidores que alimenta este catálogo toman el mismo precio en escalas diferentes, y la diferencia es exactamente 100x. El elemento de invoice_create lleva unit_price en unidades MAYORES ("Precio por unidad en unidades mayores, p. ej. 90 para 90 EUR", servers/invoice/src/index.ts); el elemento de quote_create lleva unit_price_minor en unidades MENORES ("9000 = 90.00 EUR, 90 = JPY 90. Nunca un decimal", servers/quotes/src/index.ts). Ambos campos se llaman precio unitario, ambos toman un número simple, y ninguna herramienta puede saber que el número que recibió fue escalado para la otra: 45000 pasado como unit_price es una línea de factura válida para EUR 45,000.00.

Medido en la resolución trabajada en test/unit.test.mjs: el payload correcto genera EUR 2,613.63, y los mismos elementos con el campo del servidor de presupuestos alimentado al motor del servidor de facturas generan EUR 261,363.00, que el conjunto de pruebas afirma que es exactamente 100x. En una moneda de 3 decimales como KWD es 1000x. Por lo tanto, el catálogo almacena unidades menores, que es la única forma sin pérdidas, y construye AMBOS payloads él mismo en una llamada, imprimiendo la escala junto a cada uno. Esa es toda la razón por la que lines_resolve devuelve dos payloads en lugar de un "precio" que el llamador reforma.

La segunda mitad de eso: cada precio almacenado es un número entero de unidades menores, por lo que el propio computeTotals de invoice_create redondea la forma de unidades mayores directamente de vuelta al entero del que provino. rounding_drift_minor en una resolución es cero por construcción y el conjunto de pruebas lo afirma, que es la forma comprobable por máquina de "la factura mostrará la cifra que mostró la lista de precios".

Privacidad

Todos los datos permanecen locales: ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/catalogue/. Ninguna llamada de red es realizada por ninguna herramienta. El único archivo fuera de ese directorio que este servidor toca es el perfil de negocio compartido, de solo lectura, para la moneda predeterminada, la tasa de IVA predeterminada y el nombre en la parte superior de la lista de precios. No crea ninguna factura ni ningún presupuesto.

Construido por theluckystrike.

Usa estos documentos como un servidor MCP

Cualquier cliente MCP (Claude, Cursor, Windsurf, VS Code) puede leer la documentación de este repositorio directamente a través de GitMCP — sin instalación: