vilgain-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +135 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.js +46 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/parsers/cart.d.ts +7 -0
  7. package/dist/parsers/cart.js +27 -0
  8. package/dist/parsers/cart.js.map +1 -0
  9. package/dist/parsers/common.d.ts +22 -0
  10. package/dist/parsers/common.js +98 -0
  11. package/dist/parsers/common.js.map +1 -0
  12. package/dist/parsers/orders.d.ts +7 -0
  13. package/dist/parsers/orders.js +91 -0
  14. package/dist/parsers/orders.js.map +1 -0
  15. package/dist/parsers/product.d.ts +5 -0
  16. package/dist/parsers/product.js +140 -0
  17. package/dist/parsers/product.js.map +1 -0
  18. package/dist/parsers/search.d.ts +3 -0
  19. package/dist/parsers/search.js +66 -0
  20. package/dist/parsers/search.js.map +1 -0
  21. package/dist/tools/cart.d.ts +99 -0
  22. package/dist/tools/cart.js +103 -0
  23. package/dist/tools/cart.js.map +1 -0
  24. package/dist/tools/helpers.d.ts +12 -0
  25. package/dist/tools/helpers.js +21 -0
  26. package/dist/tools/helpers.js.map +1 -0
  27. package/dist/tools/order-history.d.ts +46 -0
  28. package/dist/tools/order-history.js +93 -0
  29. package/dist/tools/order-history.js.map +1 -0
  30. package/dist/tools/product-detail.d.ts +27 -0
  31. package/dist/tools/product-detail.js +64 -0
  32. package/dist/tools/product-detail.js.map +1 -0
  33. package/dist/tools/product-variants.d.ts +25 -0
  34. package/dist/tools/product-variants.js +41 -0
  35. package/dist/tools/product-variants.js.map +1 -0
  36. package/dist/tools/search-products.d.ts +27 -0
  37. package/dist/tools/search-products.js +43 -0
  38. package/dist/tools/search-products.js.map +1 -0
  39. package/dist/types.d.ts +124 -0
  40. package/dist/types.js +2 -0
  41. package/dist/types.js.map +1 -0
  42. package/dist/validate-api.d.ts +9 -0
  43. package/dist/validate-api.js +97 -0
  44. package/dist/validate-api.js.map +1 -0
  45. package/dist/vilgain-api.d.ts +60 -0
  46. package/dist/vilgain-api.js +238 -0
  47. package/dist/vilgain-api.js.map +1 -0
  48. package/package.json +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/parsers/product.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { SearchProduct } from '../types.js';
2
+ /** Parse product cards from a search results (or category listing) page. */
3
+ export declare function parseSearchResults(html: string, baseUrl: string): SearchProduct[];
@@ -0,0 +1,66 @@
1
+ import * as cheerio from 'cheerio';
2
+ import { cleanText, findDataLayerObject, parsePriceText, parseRatingText } from './common.js';
3
+ /**
4
+ * The search page's `view_item_list` analytics event lists the variant ids of
5
+ * the displayed products in card order (with occasional extra non-product
6
+ * entries like bundles). Zip it with the cards, matching by product name;
7
+ * a card that cannot be matched safely just gets no variant id.
8
+ */
9
+ function buildVariantIdLookup(html) {
10
+ const list = findDataLayerObject(html, (obj) => obj.event === 'view_item_list' && Array.isArray(obj.item_ids) && Array.isArray(obj.item_names));
11
+ if (!list)
12
+ return () => undefined;
13
+ let pointer = 0;
14
+ const assigned = new Set();
15
+ return (name) => {
16
+ // Skip non-product entries (their names don't match the card).
17
+ let cursor = pointer;
18
+ while (cursor < list.item_names.length && cleanText(list.item_names[cursor]) !== name) {
19
+ cursor++;
20
+ }
21
+ if (cursor >= list.item_ids.length)
22
+ return undefined;
23
+ const id = list.item_ids[cursor];
24
+ pointer = cursor + 1;
25
+ // The analytics list can repeat an entry; never hand out the same id twice.
26
+ if (typeof id !== 'number' || assigned.has(id))
27
+ return undefined;
28
+ assigned.add(id);
29
+ return id;
30
+ };
31
+ }
32
+ /** Parse product cards from a search results (or category listing) page. */
33
+ export function parseSearchResults(html, baseUrl) {
34
+ const $ = cheerio.load(html);
35
+ const products = [];
36
+ const seen = new Set();
37
+ const variantIdFor = buildVariantIdLookup(html);
38
+ $('.c-product-box').each((_, el) => {
39
+ const box = $(el);
40
+ const productId = parseInt(box.attr('data-item-id') ?? '', 10);
41
+ if (Number.isNaN(productId) || seen.has(productId))
42
+ return;
43
+ const href = box.find('a.c-product-box__link').attr('href');
44
+ if (!href)
45
+ return;
46
+ seen.add(productId);
47
+ const name = cleanText(box.attr('data-item-name') ?? box.find('.c-product-box__title').first().text());
48
+ const priceText = box.find('.c-product-box__price--main').first().text();
49
+ const price = parsePriceText(priceText);
50
+ const rating = parseRatingText(box.find('.c-product-box__rating .sr-only').first().text());
51
+ products.push({
52
+ productId,
53
+ name,
54
+ subtitle: cleanText(box.find('.c-product-box__subtitle').first().text()).replace(/^[–-]\s*/, '') || undefined,
55
+ defaultVariant: cleanText(box.find('.c-product-box__param').first().text()) || undefined,
56
+ variantId: variantIdFor(name),
57
+ url: new URL(href, baseUrl).href,
58
+ price: price?.price,
59
+ currency: price?.currency,
60
+ rating: rating?.rating,
61
+ reviewCount: rating?.reviewCount,
62
+ });
63
+ });
64
+ return products;
65
+ }
66
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/parsers/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import { z } from 'zod';
2
+ import { VilgainAPI } from '../vilgain-api.js';
3
+ export declare function createCartTools(api: VilgainAPI): {
4
+ getCartContent: {
5
+ name: string;
6
+ definition: {
7
+ title: string;
8
+ description: string;
9
+ inputSchema: {};
10
+ annotations: {
11
+ readOnlyHint: boolean;
12
+ openWorldHint: boolean;
13
+ };
14
+ };
15
+ handler: () => Promise<{
16
+ content: Array<{
17
+ type: "text";
18
+ text: string;
19
+ }>;
20
+ isError?: boolean;
21
+ }>;
22
+ };
23
+ addToCart: {
24
+ name: string;
25
+ definition: {
26
+ title: string;
27
+ description: string;
28
+ inputSchema: {
29
+ variant_id: z.ZodNumber;
30
+ quantity: z.ZodDefault<z.ZodNumber>;
31
+ };
32
+ annotations: {
33
+ readOnlyHint: boolean;
34
+ destructiveHint: boolean;
35
+ openWorldHint: boolean;
36
+ };
37
+ };
38
+ handler: ({ variant_id, quantity }: {
39
+ variant_id: number;
40
+ quantity?: number;
41
+ }) => Promise<{
42
+ content: Array<{
43
+ type: "text";
44
+ text: string;
45
+ }>;
46
+ isError?: boolean;
47
+ }>;
48
+ };
49
+ setCartItemQuantity: {
50
+ name: string;
51
+ definition: {
52
+ title: string;
53
+ description: string;
54
+ inputSchema: {
55
+ variant_id: z.ZodNumber;
56
+ quantity: z.ZodNumber;
57
+ };
58
+ annotations: {
59
+ readOnlyHint: boolean;
60
+ destructiveHint: boolean;
61
+ openWorldHint: boolean;
62
+ };
63
+ };
64
+ handler: ({ variant_id, quantity }: {
65
+ variant_id: number;
66
+ quantity: number;
67
+ }) => Promise<{
68
+ content: Array<{
69
+ type: "text";
70
+ text: string;
71
+ }>;
72
+ isError?: boolean;
73
+ }>;
74
+ };
75
+ removeFromCart: {
76
+ name: string;
77
+ definition: {
78
+ title: string;
79
+ description: string;
80
+ inputSchema: {
81
+ variant_id: z.ZodNumber;
82
+ };
83
+ annotations: {
84
+ readOnlyHint: boolean;
85
+ destructiveHint: boolean;
86
+ openWorldHint: boolean;
87
+ };
88
+ };
89
+ handler: ({ variant_id }: {
90
+ variant_id: number;
91
+ }) => Promise<{
92
+ content: Array<{
93
+ type: "text";
94
+ text: string;
95
+ }>;
96
+ isError?: boolean;
97
+ }>;
98
+ };
99
+ };
@@ -0,0 +1,103 @@
1
+ import { z } from 'zod';
2
+ import { errorResult, formatCart, textResult } from './helpers.js';
3
+ export function createCartTools(api) {
4
+ const getCartContent = {
5
+ name: 'get_cart_content',
6
+ definition: {
7
+ title: 'Get Cart Content',
8
+ description: 'Show the current content of the Vilgain shopping cart: items, quantities, prices and the total.',
9
+ inputSchema: {},
10
+ annotations: {
11
+ readOnlyHint: true,
12
+ openWorldHint: true,
13
+ },
14
+ },
15
+ handler: async () => {
16
+ try {
17
+ return textResult(formatCart(await api.getCart()));
18
+ }
19
+ catch (error) {
20
+ return errorResult(error);
21
+ }
22
+ },
23
+ };
24
+ const addToCart = {
25
+ name: 'add_to_cart',
26
+ definition: {
27
+ title: 'Add to Cart',
28
+ description: 'Add a product variant to the Vilgain shopping cart. Requires a variant ID - either the displayed variant ' +
29
+ 'from search_products, or a specific flavor/size from get_product_variants. ' +
30
+ 'Adds the given quantity on top of what is already in the cart. Returns the updated cart.',
31
+ inputSchema: {
32
+ variant_id: z.number().int().positive().describe('Variant ID from search_products or get_product_variants'),
33
+ quantity: z.number().int().min(1).max(100).default(1).describe('How many pieces to add (default 1)'),
34
+ },
35
+ annotations: {
36
+ readOnlyHint: false,
37
+ destructiveHint: false,
38
+ openWorldHint: true,
39
+ },
40
+ },
41
+ handler: async ({ variant_id, quantity }) => {
42
+ try {
43
+ const cart = await api.addToCart(variant_id, quantity ?? 1);
44
+ return textResult(`Added to cart.\n\n${formatCart(cart)}`);
45
+ }
46
+ catch (error) {
47
+ return errorResult(error);
48
+ }
49
+ },
50
+ };
51
+ const setCartItemQuantity = {
52
+ name: 'set_cart_item_quantity',
53
+ definition: {
54
+ title: 'Set Cart Item Quantity',
55
+ description: 'Set the exact quantity of an item already in the Vilgain cart (use variant IDs from get_cart_content). ' +
56
+ 'Returns the updated cart.',
57
+ inputSchema: {
58
+ variant_id: z.number().int().positive().describe('Variant ID of an item in the cart'),
59
+ quantity: z.number().int().min(1).max(100).describe('New absolute quantity'),
60
+ },
61
+ annotations: {
62
+ readOnlyHint: false,
63
+ destructiveHint: false,
64
+ openWorldHint: true,
65
+ },
66
+ },
67
+ handler: async ({ variant_id, quantity }) => {
68
+ try {
69
+ const cart = await api.setCartItemQuantity(variant_id, quantity);
70
+ return textResult(`Quantity updated.\n\n${formatCart(cart)}`);
71
+ }
72
+ catch (error) {
73
+ return errorResult(error);
74
+ }
75
+ },
76
+ };
77
+ const removeFromCart = {
78
+ name: 'remove_from_cart',
79
+ definition: {
80
+ title: 'Remove from Cart',
81
+ description: 'Remove an item from the Vilgain shopping cart (use variant IDs from get_cart_content). Returns the updated cart.',
82
+ inputSchema: {
83
+ variant_id: z.number().int().positive().describe('Variant ID of the item to remove'),
84
+ },
85
+ annotations: {
86
+ readOnlyHint: false,
87
+ destructiveHint: true,
88
+ openWorldHint: true,
89
+ },
90
+ },
91
+ handler: async ({ variant_id }) => {
92
+ try {
93
+ const cart = await api.removeFromCart(variant_id);
94
+ return textResult(`Item removed.\n\n${formatCart(cart)}`);
95
+ }
96
+ catch (error) {
97
+ return errorResult(error);
98
+ }
99
+ },
100
+ };
101
+ return { getCartContent, addToCart, setCartItemQuantity, removeFromCart };
102
+ }
103
+ //# sourceMappingURL=cart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cart.js","sourceRoot":"","sources":["../../src/tools/cart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { CartContent } from '../types.js';
2
+ type ToolResult = {
3
+ content: Array<{
4
+ type: 'text';
5
+ text: string;
6
+ }>;
7
+ isError?: boolean;
8
+ };
9
+ export declare function textResult(text: string): ToolResult;
10
+ export declare function errorResult(error: unknown): ToolResult;
11
+ export declare function formatCart(cart: CartContent): string;
12
+ export {};
@@ -0,0 +1,21 @@
1
+ export function textResult(text) {
2
+ return { content: [{ type: 'text', text }] };
3
+ }
4
+ export function errorResult(error) {
5
+ return {
6
+ content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }],
7
+ isError: true,
8
+ };
9
+ }
10
+ export function formatCart(cart) {
11
+ if (cart.items.length === 0) {
12
+ return 'The cart is empty.';
13
+ }
14
+ const lines = cart.items.map((item) => {
15
+ const variant = item.variant ? ` (${item.variant})` : '';
16
+ return `• ${item.productName}${variant}\n Quantity: ${item.quantity} × ${item.price} ${item.currency}\n Variant ID: ${item.variantId}`;
17
+ });
18
+ const total = cart.totalWithVat !== undefined ? `\n\nTotal (with VAT): ${cart.totalWithVat} ${cart.currency ?? ''}`.trimEnd() : '';
19
+ return `Cart (${cart.items.length} item${cart.items.length === 1 ? '' : 's'}):\n\n${lines.join('\n\n')}${total}`;
20
+ }
21
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACzF,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAiB;IAC1C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,KAAK,IAAI,CAAC,WAAW,GAAG,OAAO,iBAAiB,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,mBAAmB,IAAI,CAAC,SAAS,EAAE,CAAC;IAC3I,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GACT,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,yBAAyB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvH,OAAO,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;AACnH,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { z } from 'zod';
2
+ import { VilgainAPI } from '../vilgain-api.js';
3
+ export declare function createOrderHistoryTools(api: VilgainAPI): {
4
+ getOrderHistory: {
5
+ name: string;
6
+ definition: {
7
+ title: string;
8
+ description: string;
9
+ inputSchema: {};
10
+ annotations: {
11
+ readOnlyHint: boolean;
12
+ openWorldHint: boolean;
13
+ };
14
+ };
15
+ handler: () => Promise<{
16
+ content: Array<{
17
+ type: "text";
18
+ text: string;
19
+ }>;
20
+ isError?: boolean;
21
+ }>;
22
+ };
23
+ getOrderDetail: {
24
+ name: string;
25
+ definition: {
26
+ title: string;
27
+ description: string;
28
+ inputSchema: {
29
+ order_id: z.ZodString;
30
+ };
31
+ annotations: {
32
+ readOnlyHint: boolean;
33
+ openWorldHint: boolean;
34
+ };
35
+ };
36
+ handler: ({ order_id }: {
37
+ order_id: string;
38
+ }) => Promise<{
39
+ content: Array<{
40
+ type: "text";
41
+ text: string;
42
+ }>;
43
+ isError?: boolean;
44
+ }>;
45
+ };
46
+ };
@@ -0,0 +1,93 @@
1
+ import { z } from 'zod';
2
+ import { errorResult, textResult } from './helpers.js';
3
+ export function createOrderHistoryTools(api) {
4
+ const getOrderHistory = {
5
+ name: 'get_order_history',
6
+ definition: {
7
+ title: 'Get Order History',
8
+ description: 'List past orders of the logged-in Vilgain account: order ID, date, state, total and product names. ' +
9
+ 'Use get_order_detail with an order ID for quantities, prices and delivery status.',
10
+ inputSchema: {},
11
+ annotations: {
12
+ readOnlyHint: true,
13
+ openWorldHint: true,
14
+ },
15
+ },
16
+ handler: async () => {
17
+ try {
18
+ const { orders, empty } = await api.getOrderHistory();
19
+ if (empty || orders.length === 0) {
20
+ return textResult('No past orders found on this account.');
21
+ }
22
+ const output = orders
23
+ .map((order) => {
24
+ const header = [
25
+ `• Order ${order.id}`,
26
+ order.date,
27
+ order.state,
28
+ order.total !== undefined ? `${order.total} ${order.currency}` : undefined,
29
+ ]
30
+ .filter(Boolean)
31
+ .join(' | ');
32
+ const products = order.productNames.length > 0 ? `\n Products: ${order.productNames.join(', ')}` : '';
33
+ return header + products;
34
+ })
35
+ .join('\n\n');
36
+ return textResult(`Found ${orders.length} orders (most recent first):\n\n${output}`);
37
+ }
38
+ catch (error) {
39
+ return errorResult(error);
40
+ }
41
+ },
42
+ };
43
+ const getOrderDetail = {
44
+ name: 'get_order_detail',
45
+ definition: {
46
+ title: 'Get Order Detail',
47
+ description: 'Get one past order of the logged-in Vilgain account: items with variants, quantities, prices and ' +
48
+ 'variant IDs (usable with add_to_cart to reorder), order total, delivery destination and shipment status timeline.',
49
+ inputSchema: {
50
+ order_id: z.string().regex(/^\d+$/).describe('Order ID from get_order_history'),
51
+ },
52
+ annotations: {
53
+ readOnlyHint: true,
54
+ openWorldHint: true,
55
+ },
56
+ },
57
+ handler: async ({ order_id }) => {
58
+ try {
59
+ const detail = await api.getOrderDetail(order_id);
60
+ const sections = [`# Order ${detail.orderNumber}`];
61
+ if (detail.items.length > 0) {
62
+ const items = detail.items
63
+ .map((item) => {
64
+ const parts = [
65
+ item.variant,
66
+ item.quantity !== undefined ? `${item.quantity} pcs` : undefined,
67
+ item.price !== undefined ? `${item.price} ${item.currency}` : undefined,
68
+ ].filter(Boolean);
69
+ const variantId = item.variantId !== undefined ? `\n Variant ID (for add_to_cart): ${item.variantId}` : '';
70
+ return `• ${item.name}${parts.length > 0 ? ` (${parts.join(', ')})` : ''}${variantId}${item.url ? `\n URL: ${item.url}` : ''}`;
71
+ })
72
+ .join('\n');
73
+ sections.push(`## Items\n${items}`);
74
+ }
75
+ if (detail.totalWithVat !== undefined) {
76
+ sections.push(`Total (with VAT): ${detail.totalWithVat} ${detail.currency ?? ''}`.trimEnd());
77
+ }
78
+ if (detail.deliveryAddress) {
79
+ sections.push(`Delivery: ${detail.deliveryAddress}`);
80
+ }
81
+ if (detail.timeline.length > 0) {
82
+ sections.push(`## Status timeline\n${detail.timeline.map((e) => `• ${e.event}${e.date ? ` – ${e.date}` : ''}`).join('\n')}`);
83
+ }
84
+ return textResult(sections.join('\n\n'));
85
+ }
86
+ catch (error) {
87
+ return errorResult(error);
88
+ }
89
+ },
90
+ };
91
+ return { getOrderHistory, getOrderDetail };
92
+ }
93
+ //# sourceMappingURL=order-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order-history.js","sourceRoot":"","sources":["../../src/tools/order-history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { z } from 'zod';
2
+ import { VilgainAPI } from '../vilgain-api.js';
3
+ export declare function createProductDetailTool(api: VilgainAPI): {
4
+ name: string;
5
+ definition: {
6
+ title: string;
7
+ description: string;
8
+ inputSchema: {
9
+ product_url: z.ZodString;
10
+ variant_id: z.ZodOptional<z.ZodNumber>;
11
+ };
12
+ annotations: {
13
+ readOnlyHint: boolean;
14
+ openWorldHint: boolean;
15
+ };
16
+ };
17
+ handler: ({ product_url, variant_id }: {
18
+ product_url: string;
19
+ variant_id?: number;
20
+ }) => Promise<{
21
+ content: Array<{
22
+ type: "text";
23
+ text: string;
24
+ }>;
25
+ isError?: boolean;
26
+ }>;
27
+ };
@@ -0,0 +1,64 @@
1
+ import { z } from 'zod';
2
+ import { errorResult, textResult } from './helpers.js';
3
+ function formatNutritionTable(table) {
4
+ const header = ` | ${['', ...table.columns].join(' | ')} |`;
5
+ const rows = table.rows.map((row) => ` | ${[row.label, ...row.values].join(' | ')} |`);
6
+ return [header, ...rows].join('\n');
7
+ }
8
+ export function createProductDetailTool(api) {
9
+ return {
10
+ name: 'get_product_detail',
11
+ definition: {
12
+ title: 'Get Product Detail',
13
+ description: 'Get what is inside a Vilgain product: ingredients (with allergens), nutrition facts, dosage and description. ' +
14
+ 'Without variant_id it describes the product\'s default variant; pass variant_id (from search_products, ' +
15
+ 'get_product_variants or get_order_detail) to inspect a specific flavor/size. ' +
16
+ 'For the list of variants and prices use get_product_variants instead.',
17
+ inputSchema: {
18
+ product_url: z
19
+ .string()
20
+ .min(1)
21
+ .describe('Product or variant URL, e.g. "https://vilgain.cz/vilgain-whey-protein-2"'),
22
+ variant_id: z
23
+ .number()
24
+ .int()
25
+ .positive()
26
+ .optional()
27
+ .describe('Optional variant ID to get the content of a specific flavor/size of this product'),
28
+ },
29
+ annotations: {
30
+ readOnlyHint: true,
31
+ openWorldHint: true,
32
+ },
33
+ },
34
+ handler: async ({ product_url, variant_id }) => {
35
+ try {
36
+ const detail = await api.getProductDetail(product_url, variant_id);
37
+ const sections = [];
38
+ sections.push(`# ${detail.name}`);
39
+ const selected = detail.variants.find((v) => v.variantId === detail.selectedVariantId);
40
+ if (selected)
41
+ sections.push(`Content below refers to variant: ${selected.name} (Variant ID: ${selected.variantId})`);
42
+ if (detail.rating)
43
+ sections.push(`Rating: ${detail.rating} (${detail.reviewCount} reviews)`);
44
+ if (detail.shortDescription)
45
+ sections.push(detail.shortDescription);
46
+ if (detail.ingredients)
47
+ sections.push(`## Ingredients & allergens\n${detail.ingredients}`);
48
+ if (detail.nutrition.length > 0) {
49
+ sections.push(`## Nutrition facts\n${detail.nutrition.map(formatNutritionTable).join('\n\n')}`);
50
+ }
51
+ if (detail.dosage)
52
+ sections.push(`## Dosage\n${detail.dosage}`);
53
+ if (detail.description)
54
+ sections.push(`## Description\n${detail.description}`);
55
+ sections.push(`URL: ${detail.url}`);
56
+ return textResult(sections.join('\n\n'));
57
+ }
58
+ catch (error) {
59
+ return errorResult(error);
60
+ }
61
+ },
62
+ };
63
+ }
64
+ //# sourceMappingURL=product-detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-detail.js","sourceRoot":"","sources":["../../src/tools/product-detail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ import { VilgainAPI } from '../vilgain-api.js';
3
+ export declare function createProductVariantsTool(api: VilgainAPI): {
4
+ name: string;
5
+ definition: {
6
+ title: string;
7
+ description: string;
8
+ inputSchema: {
9
+ product_url: z.ZodString;
10
+ };
11
+ annotations: {
12
+ readOnlyHint: boolean;
13
+ openWorldHint: boolean;
14
+ };
15
+ };
16
+ handler: ({ product_url }: {
17
+ product_url: string;
18
+ }) => Promise<{
19
+ content: Array<{
20
+ type: "text";
21
+ text: string;
22
+ }>;
23
+ isError?: boolean;
24
+ }>;
25
+ };