lulu-print-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LULU_CLIENT_KEY | Yes | Client key from Lulu's developer portal. | |
| LULU_TIMEOUT_MS | No | Timeout for each request to Lulu, in milliseconds. | 30000 |
| LULU_ENVIRONMENT | No | Lulu environment to use. Valid values are `sandbox` or `production`. | sandbox |
| LULU_CLIENT_SECRET | Yes | Client secret from Lulu's developer portal. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Tools for the Lulu Print API (print-on-demand books). Connected to Lulu's SANDBOX environment. SANDBOX: orders are test orders and are never printed or charged. Products are identified by a pod_package_id SKU such as '0600X0900.BW.STD.PB.060UW444.MXX'. Usual order flow: calculate_cover_dimensions -> validate_interior_file / validate_cover_file (poll until done) -> get_shipping_options -> calculate_print_job_cost -> create_print_job -> get_print_job_status.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| calculate_print_job_costA | Price one or more books, including shipping and tax, without placing an order. Returns per-line-item costs, shipping cost, fees and totals. |
| list_print_jobsB | List Print-Jobs (orders), newest first by default, with optional filters and paging. |
| create_print_jobA | Place an order to print and ship books from interior and cover PDF URLs. In production this is a real order: it stays UNPAID until paid in Lulu's developer portal, or is charged automatically if a card is on file. Check the price with calculate_print_job_cost and the files with validate_interior_file / validate_cover_file first. Set production_delay to leave time to cancel. |
| reprint_print_jobA | Place a new order for books Lulu already has, using each line item's printable_id from an earlier Print-Job, so files don't need to be sent again. Same payment rules as create_print_job. |
| get_print_job_statisticsA | Count Print-Jobs in each status, optionally filtered by date, status or id. |
| get_print_jobA | Get one Print-Job with its line items, status, costs, shipping address and tracking. |
| get_print_job_costsA | Get the cost breakdown of an existing Print-Job: line items, shipping, fees, tax, totals. Lulu has no costs until it has processed the job's files, and answers 'No costs are available' before then. |
| get_print_job_statusA | Get only the current status of a Print-Job, with any status messages. |
| cancel_print_jobA | Cancel a Print-Job. Only possible before it goes to production (statuses CREATED, UNPAID or PRODUCTION_DELAYED). This cannot be undone. |
| get_shipping_optionsA | List the shipping levels available for some books to a destination, with price and delivery estimates. Only the country is required; a fuller address gives more accurate results. |
| create_webhookA | Subscribe a URL to Lulu events. Lulu then POSTs to the URL whenever a subscribed event happens, e.g. PRINT_JOB_STATUS_CHANGED when an order changes status. |
| list_webhooksA | List all webhook subscriptions on this Lulu account. |
| get_webhookC | Get one webhook subscription. |
| update_webhookB | Change a webhook's URL or topics, or switch it on or off. |
| delete_webhookB | Delete a webhook subscription. This cannot be undone. |
| test_webhookA | Ask Lulu to send a sample event of the given topic to a webhook's URL. The webhook must be active. |
| list_webhook_submissionsA | List past webhook deliveries and whether each one succeeded, for troubleshooting. |
| validate_interior_fileA | Start checking an interior PDF. Returns a validation record; poll get_interior_validation with its id until the status is VALIDATED, NORMALIZED or ERROR. With pod_package_id, Lulu also checks the file fits that product. |
| get_interior_validationB | Get the result of an interior file validation started with validate_interior_file. |
| calculate_cover_dimensionsA | Get the exact cover size (including spine and bleed) needed for a product and page count. |
| validate_cover_fileA | Start checking a cover PDF against a product and page count. Poll get_cover_validation with the returned id until the status is NORMALIZED or ERROR. |
| get_cover_validationA | Get the result of a cover file validation started with validate_cover_file. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 22 tools
Most tools have clearly distinct purposes, and the print-job lifecycle is well separated by action. There is some overlap between get_print_job and its narrower variants get_print_job_status and get_print_job_costs, as well as between calculate_print_job_cost and get_print_job_costs, but descriptions clarify the intended use.
All tool names follow a consistent snake_case verb_noun pattern, such as get_print_job, create_print_job, validate_interior_file, and list_webhooks. There are no mixed conventions or vague standalone verbs.
The 22 tools are reasonable for a multi-area API covering print jobs, file validation, pricing/shipping, and webhooks. The count is slightly heavy but each tool maps to a recognizable operation rather than being redundant.
The surface covers the core print-job lifecycle well: validation, cost calculation, creation, reprint, listing, status, costs, statistics, cancellation, and shipping options. Webhooks also have full CRUD plus testing and delivery history, though product/package discovery before using pod_package_id appears to be a minor gap.