386 lines
15 KiB
TypeScript
386 lines
15 KiB
TypeScript
import type { BigCommerceClient } from '../clients/bigcommerce.js';
|
|
import type { Cart, Checkout, CartLineItem } from '../types/index.js';
|
|
|
|
export function registerCartTools(client: BigCommerceClient) {
|
|
return {
|
|
// Cart Operations
|
|
bigcommerce_create_cart: {
|
|
description: 'Create a new cart (server-side cart, not storefront)',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
customer_id: { type: 'number', description: 'Customer ID (for logged-in customer)' },
|
|
channel_id: { type: 'number', description: 'Channel ID (default: 1)' },
|
|
line_items: {
|
|
type: 'array',
|
|
description: 'Array of line items to add',
|
|
items: {
|
|
type: 'object',
|
|
properties: {
|
|
quantity: { type: 'number', description: 'Quantity', required: true },
|
|
product_id: { type: 'number', description: 'Product ID', required: true },
|
|
variant_id: { type: 'number', description: 'Variant ID (if applicable)' },
|
|
list_price: { type: 'number', description: 'Override list price' },
|
|
},
|
|
},
|
|
required: true,
|
|
},
|
|
locale: { type: 'string', description: 'Locale code (e.g., en-US)' },
|
|
},
|
|
required: ['line_items'],
|
|
},
|
|
handler: async (params: Partial<Cart>) => {
|
|
const result = await client.post<{ data: Cart }>('/carts', params);
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
bigcommerce_get_cart: {
|
|
description: 'Get a cart by ID',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
cart_id: { type: 'string', description: 'Cart ID (UUID)', required: true },
|
|
include: { type: 'string', description: 'Include additional data (redirect_urls, line_items.physical_items.options, line_items.digital_items.options)' },
|
|
},
|
|
required: ['cart_id'],
|
|
},
|
|
handler: async (params: { cart_id: string; include?: string }) => {
|
|
const queryParams = params.include ? `?include=${params.include}` : '';
|
|
const result = await client.get<{ data: Cart }>(`/carts/${params.cart_id}${queryParams}`);
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
bigcommerce_update_cart: {
|
|
description: 'Update cart properties (customer_id, locale, etc.)',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
cart_id: { type: 'string', description: 'Cart ID (UUID)', required: true },
|
|
customer_id: { type: 'number', description: 'Update customer ID' },
|
|
locale: { type: 'string', description: 'Update locale' },
|
|
},
|
|
required: ['cart_id'],
|
|
},
|
|
handler: async (params: { cart_id: string; [key: string]: unknown }) => {
|
|
const { cart_id, ...updateData } = params;
|
|
const result = await client.put<{ data: Cart }>(`/carts/${cart_id}`, updateData);
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
bigcommerce_delete_cart: {
|
|
description: 'Delete a cart',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
cart_id: { type: 'string', description: 'Cart ID (UUID)', required: true },
|
|
},
|
|
required: ['cart_id'],
|
|
},
|
|
handler: async (params: { cart_id: string }) => {
|
|
await client.delete(`/carts/${params.cart_id}`);
|
|
return { success: true, message: `Cart ${params.cart_id} deleted` };
|
|
},
|
|
},
|
|
|
|
// Cart Line Items
|
|
bigcommerce_add_cart_items: {
|
|
description: 'Add line items to an existing cart',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
cart_id: { type: 'string', description: 'Cart ID (UUID)', required: true },
|
|
line_items: {
|
|
type: 'array',
|
|
description: 'Array of line items to add',
|
|
items: {
|
|
type: 'object',
|
|
properties: {
|
|
quantity: { type: 'number', description: 'Quantity', required: true },
|
|
product_id: { type: 'number', description: 'Product ID', required: true },
|
|
variant_id: { type: 'number', description: 'Variant ID (if applicable)' },
|
|
},
|
|
},
|
|
required: true,
|
|
},
|
|
},
|
|
required: ['cart_id', 'line_items'],
|
|
},
|
|
handler: async (params: { cart_id: string; line_items: unknown[] }) => {
|
|
const result = await client.post<{ data: Cart }>(`/carts/${params.cart_id}/items`, {
|
|
line_items: params.line_items,
|
|
});
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
bigcommerce_update_cart_item: {
|
|
description: 'Update a line item in a cart (quantity, product_id)',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
cart_id: { type: 'string', description: 'Cart ID (UUID)', required: true },
|
|
item_id: { type: 'string', description: 'Line item ID', required: true },
|
|
line_item: {
|
|
type: 'object',
|
|
description: 'Updated line item data',
|
|
required: true,
|
|
properties: {
|
|
quantity: { type: 'number', description: 'New quantity' },
|
|
product_id: { type: 'number', description: 'Product ID' },
|
|
variant_id: { type: 'number', description: 'Variant ID' },
|
|
},
|
|
},
|
|
},
|
|
required: ['cart_id', 'item_id', 'line_item'],
|
|
},
|
|
handler: async (params: { cart_id: string; item_id: string; line_item: unknown }) => {
|
|
const result = await client.put<{ data: Cart }>(`/carts/${params.cart_id}/items/${params.item_id}`, {
|
|
line_item: params.line_item,
|
|
});
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
bigcommerce_delete_cart_item: {
|
|
description: 'Delete a line item from a cart',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
cart_id: { type: 'string', description: 'Cart ID (UUID)', required: true },
|
|
item_id: { type: 'string', description: 'Line item ID', required: true },
|
|
},
|
|
required: ['cart_id', 'item_id'],
|
|
},
|
|
handler: async (params: { cart_id: string; item_id: string }) => {
|
|
const result = await client.delete<{ data: Cart }>(`/carts/${params.cart_id}/items/${params.item_id}`);
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
// Checkout Operations
|
|
bigcommerce_create_checkout: {
|
|
description: 'Create a checkout from a cart',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
cart_id: { type: 'string', description: 'Cart ID (UUID)', required: true },
|
|
},
|
|
required: ['cart_id'],
|
|
},
|
|
handler: async (params: { cart_id: string }) => {
|
|
const result = await client.post<{ data: Checkout }>(`/checkouts/${params.cart_id}`, {});
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
bigcommerce_get_checkout: {
|
|
description: 'Get checkout details',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
checkout_id: { type: 'string', description: 'Checkout ID (UUID)', required: true },
|
|
},
|
|
required: ['checkout_id'],
|
|
},
|
|
handler: async (params: { checkout_id: string }) => {
|
|
const result = await client.get<{ data: Checkout }>(`/checkouts/${params.checkout_id}`);
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
bigcommerce_update_checkout: {
|
|
description: 'Update checkout (billing address, shipping consignments, etc.)',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
checkout_id: { type: 'string', description: 'Checkout ID (UUID)', required: true },
|
|
billing_address: {
|
|
type: 'object',
|
|
description: 'Billing address',
|
|
properties: {
|
|
first_name: { type: 'string' },
|
|
last_name: { type: 'string' },
|
|
email: { type: 'string' },
|
|
address1: { type: 'string' },
|
|
city: { type: 'string' },
|
|
state_or_province: { type: 'string' },
|
|
postal_code: { type: 'string' },
|
|
country_code: { type: 'string' },
|
|
},
|
|
},
|
|
customer_message: { type: 'string', description: 'Customer message/order notes' },
|
|
},
|
|
required: ['checkout_id'],
|
|
},
|
|
handler: async (params: { checkout_id: string; [key: string]: unknown }) => {
|
|
const { checkout_id, ...updateData } = params;
|
|
const result = await client.put<{ data: Checkout }>(`/checkouts/${checkout_id}`, updateData);
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
bigcommerce_add_checkout_billing_address: {
|
|
description: 'Add or update billing address on checkout',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
checkout_id: { type: 'string', description: 'Checkout ID (UUID)', required: true },
|
|
first_name: { type: 'string', description: 'First name', required: true },
|
|
last_name: { type: 'string', description: 'Last name', required: true },
|
|
email: { type: 'string', description: 'Email', required: true },
|
|
address1: { type: 'string', description: 'Street address line 1', required: true },
|
|
address2: { type: 'string', description: 'Street address line 2' },
|
|
city: { type: 'string', description: 'City', required: true },
|
|
state_or_province: { type: 'string', description: 'State/province', required: true },
|
|
postal_code: { type: 'string', description: 'Postal code', required: true },
|
|
country_code: { type: 'string', description: '2-letter country code', required: true },
|
|
phone: { type: 'string', description: 'Phone number' },
|
|
},
|
|
required: ['checkout_id', 'first_name', 'last_name', 'email', 'address1', 'city', 'state_or_province', 'postal_code', 'country_code'],
|
|
},
|
|
handler: async (params: { checkout_id: string; [key: string]: unknown }) => {
|
|
const { checkout_id, ...addressData } = params;
|
|
const result = await client.post<{ data: Checkout }>(`/checkouts/${checkout_id}/billing-address`, addressData);
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
bigcommerce_add_checkout_consignment: {
|
|
description: 'Add shipping consignment (shipping address + items) to checkout',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
checkout_id: { type: 'string', description: 'Checkout ID (UUID)', required: true },
|
|
shipping_address: {
|
|
type: 'object',
|
|
description: 'Shipping address',
|
|
required: true,
|
|
properties: {
|
|
first_name: { type: 'string', required: true },
|
|
last_name: { type: 'string', required: true },
|
|
email: { type: 'string', required: true },
|
|
address1: { type: 'string', required: true },
|
|
city: { type: 'string', required: true },
|
|
state_or_province: { type: 'string', required: true },
|
|
postal_code: { type: 'string', required: true },
|
|
country_code: { type: 'string', required: true },
|
|
},
|
|
},
|
|
line_items: {
|
|
type: 'array',
|
|
description: 'Line items for this consignment',
|
|
required: true,
|
|
items: {
|
|
type: 'object',
|
|
properties: {
|
|
item_id: { type: 'string', description: 'Cart line item ID', required: true },
|
|
quantity: { type: 'number', description: 'Quantity', required: true },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
required: ['checkout_id', 'shipping_address', 'line_items'],
|
|
},
|
|
handler: async (params: { checkout_id: string; [key: string]: unknown }) => {
|
|
const { checkout_id, ...consignmentData } = params;
|
|
const result = await client.post<{ data: Checkout }>(`/checkouts/${checkout_id}/consignments`, [consignmentData]);
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
bigcommerce_update_checkout_consignment: {
|
|
description: 'Update a consignment (shipping address or line items)',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
checkout_id: { type: 'string', description: 'Checkout ID (UUID)', required: true },
|
|
consignment_id: { type: 'string', description: 'Consignment ID', required: true },
|
|
shipping_address: {
|
|
type: 'object',
|
|
description: 'Updated shipping address',
|
|
properties: {
|
|
first_name: { type: 'string' },
|
|
last_name: { type: 'string' },
|
|
address1: { type: 'string' },
|
|
city: { type: 'string' },
|
|
state_or_province: { type: 'string' },
|
|
postal_code: { type: 'string' },
|
|
country_code: { type: 'string' },
|
|
},
|
|
},
|
|
line_items: {
|
|
type: 'array',
|
|
description: 'Updated line items',
|
|
items: {
|
|
type: 'object',
|
|
properties: {
|
|
item_id: { type: 'string' },
|
|
quantity: { type: 'number' },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
required: ['checkout_id', 'consignment_id'],
|
|
},
|
|
handler: async (params: { checkout_id: string; consignment_id: string; [key: string]: unknown }) => {
|
|
const { checkout_id, consignment_id, ...updateData } = params;
|
|
const result = await client.put<{ data: Checkout }>(`/checkouts/${checkout_id}/consignments/${consignment_id}`, updateData);
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
bigcommerce_delete_checkout_consignment: {
|
|
description: 'Delete a consignment from checkout',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
checkout_id: { type: 'string', description: 'Checkout ID (UUID)', required: true },
|
|
consignment_id: { type: 'string', description: 'Consignment ID', required: true },
|
|
},
|
|
required: ['checkout_id', 'consignment_id'],
|
|
},
|
|
handler: async (params: { checkout_id: string; consignment_id: string }) => {
|
|
const result = await client.delete<{ data: Checkout }>(`/checkouts/${params.checkout_id}/consignments/${params.consignment_id}`);
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
bigcommerce_create_checkout_order: {
|
|
description: 'Complete checkout and create an order',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
checkout_id: { type: 'string', description: 'Checkout ID (UUID)', required: true },
|
|
},
|
|
required: ['checkout_id'],
|
|
},
|
|
handler: async (params: { checkout_id: string }) => {
|
|
const result = await client.post<{ data: { id: number } }>(`/checkouts/${params.checkout_id}/orders`, {});
|
|
return result.data;
|
|
},
|
|
},
|
|
|
|
// Cart Redirects (for headless storefronts)
|
|
bigcommerce_create_cart_redirect_url: {
|
|
description: 'Generate a redirect URL for cart (to embedded checkout or full checkout)',
|
|
parameters: {
|
|
type: 'object' as const,
|
|
properties: {
|
|
cart_id: { type: 'string', description: 'Cart ID (UUID)', required: true },
|
|
},
|
|
required: ['cart_id'],
|
|
},
|
|
handler: async (params: { cart_id: string }) => {
|
|
const result = await client.post<{ cart_url: string; checkout_url: string; embedded_checkout_url: string }>(
|
|
`/carts/${params.cart_id}/redirect_urls`,
|
|
{}
|
|
);
|
|
return result;
|
|
},
|
|
},
|
|
};
|
|
}
|