publish_product
Automate publishing of Printify product details including title, description, images, variants, and tags by specifying product ID and publish settings.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product ID | |
| publishDetails | No | Publish details |
Implementation Reference
- Core handler function for the publish_product MCP tool. Validates the current shop selection, calls the Printify API client's publishProduct method, handles errors, and formats structured success/error responses.export async function publishProduct( printifyClient: PrintifyAPI, productId: string, publishDetails?: { title?: boolean; description?: boolean; images?: boolean; variants?: boolean; tags?: boolean; } ) { try { // Validate shop is selected const currentShop = printifyClient.getCurrentShop(); if (!currentShop) { throw new Error('No shop is currently selected. Use the list-shops and switch-shop tools to select a shop.'); } // Publish product const result = await printifyClient.publishProduct(productId, publishDetails); return { success: true, result, response: formatSuccessResponse( 'Product Published Successfully', { ProductId: productId, Shop: currentShop } ) }; } catch (error: any) { console.error('Error publishing product:', error); return { success: false, error, errorResponse: formatErrorResponse( error, 'Publish Product', { ProductId: productId, PublishDetails: publishDetails, Shop: printifyClient.getCurrentShop() }, [ 'Check that the product ID is valid', 'Ensure your Printify account is properly connected', 'Make sure you have selected a shop' ] ) }; } }
- src/index.ts:385-422 (registration)MCP server.tool registration for 'publish_product' tool, including Zod input schema validation and thin wrapper handler that injects the global printifyClient and delegates to the core handler.server.tool( "publish_product", { productId: z.string().describe("Product ID"), publishDetails: z.object({ title: z.boolean().optional().default(true).describe("Publish title"), description: z.boolean().optional().default(true).describe("Publish description"), images: z.boolean().optional().default(true).describe("Publish images"), variants: z.boolean().optional().default(true).describe("Publish variants"), tags: z.boolean().optional().default(true).describe("Publish tags") }).optional().describe("Publish details") }, async ({ productId, publishDetails }): Promise<{ content: any[], isError?: boolean }> => { // Import the printify products service const { publishProduct } = await import('./services/printify-products.js'); // Check if client is initialized if (!printifyClient) { return { content: [{ type: "text", text: "Printify API client is not initialized. The PRINTIFY_API_KEY environment variable may not be set." }], isError: true }; } // Call the service const result = await publishProduct(printifyClient, productId, publishDetails); // Return the result if (result.success) { return result.response as { content: any[], isError?: boolean }; } else { return result.errorResponse as { content: any[], isError: boolean }; } } );
- src/index.ts:387-396 (schema)Zod schema for input parameters of the publish_product tool: productId (string) and optional publishDetails object specifying which product fields to publish.{ productId: z.string().describe("Product ID"), publishDetails: z.object({ title: z.boolean().optional().default(true).describe("Publish title"), description: z.boolean().optional().default(true).describe("Publish description"), images: z.boolean().optional().default(true).describe("Publish images"), variants: z.boolean().optional().default(true).describe("Publish variants"), tags: z.boolean().optional().default(true).describe("Publish tags") }).optional().describe("Publish details") },
- src/printify-api.ts:390-402 (helper)PrintifyAPI class method that wraps the Printify SDK's products.publishOne call, with shop ID validation and enhanced error handling.async publishProduct(productId: string, publishData: any) { if (!this.shopId) { throw new Error('Shop ID is not set. Call setShopId() first.'); } try { // Use the products.publishOne method with the product ID and publish data return await this.client.products.publishOne(productId, publishData); } catch (error) { console.error(`Error publishing product ${productId}:`, error); throw this.enhanceError(error, publishData); } }